Excel 当具有日期输入的单元格计数达到特定限制时,禁用范围的双击事件

Excel 当具有日期输入的单元格计数达到特定限制时,禁用范围的双击事件,excel,vba,Excel,Vba,我有以下宏,双击后输入当前日期: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("F5:Q42")) Is Nothing Then Cancel = True Target.Formula = Date End If

我有以下宏,双击后输入当前日期:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Range("F5:Q42")) Is Nothing Then
        Cancel = True
        Target.Formula = Date
    End If                                                                                            
End Sub
当包含日期输入的单元格计数达到一定限制时,我想对范围内的行禁用单击事件

例如,
F5:Q5,当四个单元格中有值时,我想禁用单击事件(或无法启动或日期戳的单元格),以便宏无法在第五个单元格中输入日期。
F6:Q6将在12个单元格收到日期时看到宏被禁用。
F7:Q7将只允许1个单元格加盖日期戳,依此类推


类似于在双击事件上设置数据验证限制。

更新的数字II

您只需要在代码中包含一些if语句。下面是一个在您的评论中包含该要求的示例。你可以用一些
语句来压缩我的代码,但我想确切地说明发生了什么

我将范围作为
常量
放在顶部,因为我个人喜欢将硬编码的项目隔离开来

强烈建议:

与其在VBA代码中键入您认为始终是范围的行和范围地址,为什么不在每个组的工作表级别(即
Rng4
)的Excel中设置一些命名范围?这将使您的VBA代码保持动态,这样,如果一个愚蠢的用户进来(如果您赶时间的话,可能是您!)并插入一行或删除一行,您的代码将保持功能。在我看来,这是VBA代码“中断”和新手感到沮丧的第一个原因;他们习惯于excel自动更新行/列修改,忘记了他们的VBA硬编码成员不会这样做。但是,这是通过名称范围解决的

无论如何,以下是对您问题的具体回答:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Const Rng4_a As String = "F5:Q10"
Const Rng4_b As String = "F12:Q15"
Const Rng12_a As String = "F16:Q22"
Const Rng12_b As String = "F25:Q30"
Dim doYourThing As Boolean



    If Not Intersect(Target, Range(Rng4_a)) Is Nothing And _
        Application.WorksheetFunction.Count(Intersect(Range(Rng4_a), Target.EntireRow)) < 4 Then
            doYourThing = True

    ElseIf Not Intersect(Target, Range(Rng4_b)) Is Nothing And _
        Application.WorksheetFunction.Count(Intersect(Range(Rng4_b), Target.EntireRow)) < 4 Then
            doYourThing = True

    ElseIf Not Intersect(Target, Range(Rng12_a)) Is Nothing And _
        Application.WorksheetFunction.Count(Intersect(Range(Rng12_a), Target.EntireRow)) < 12 Then
            doYourThing = True

    ElseIf Not Intersect(Target, Range(Rng12_b)) Is Nothing And _
        Application.WorksheetFunction.Count(Intersect(Range(Rng12_b), Target.EntireRow)) < 12 Then
            doYourThing = True

    End If


    If doYourThing Then
        Cancel = True
        Target.Formula = Date
    End If


End Sub
Private子工作表\u双击之前(ByVal目标作为范围,Cancel作为布尔值)
Const Rng4_a As String=“F5:Q10”
常量Rng4_b作为字符串=“F12:Q15”
常量Rng12_a为String=“F16:Q22”
常量Rng12_b作为字符串=“F25:Q30”
把你的东西当作布尔值
如果不相交(目标,范围(Rng4_a))则为零,且_
Application.WorksheetFunction.Count(Intersect(Range(Rng4_a),Target.EntireRow))小于4
你说的对吗
ElseIf Not Intersect(目标,射程(Rng4_b))为零且_
Application.WorksheetFunction.Count(Intersect(Range(Rng4_b)、Target.EntireRow))小于4
你说的对吗
ElseIf Not Intersect(目标,范围(Rng12_a))为零且_
Application.WorksheetFunction.Count(Intersect(Range(Rng12_a),Target.EntireRow))小于12
你说的对吗
ElseIf Not Intersect(目标,射程(Rng12_b))为零且_
Application.WorksheetFunction.Count(Intersect(Range(Rng12_b),Target.EntireRow))小于12
你说的对吗
如果结束
如果你喜欢的话
取消=真
Target.Formula=日期
如果结束
端接头

每行日期数的逻辑是什么?4, 12, 1... 这些应该是硬编码的吗?除了每行中的日期,还有其他值(例如文本)吗?@BigBen我的方法是使用命名范围。看看下面OP的目的是什么,如果你能想到什么,就写个便条。我可以在代码中构建一些数组,但那将是一个混乱。对不起,我有几个符号被翻转了,错过了关于行的部分,但我认为这应该可以做到。非常感谢您--您的解决方案非常有效。跟进:如何向代码中添加范围。我花了一段时间玩弄它,但不断出现编译错误。所以,我有多个范围(都是F:Q)和不同的参数。例如,例如…F5:Q10和F12:Q15将是感谢PGSystem Tester。当代码在我双击时输入日期时,当我通过执行另一项测试(测试仅限一个日期戳条目)来测试它时,我得到一个错误。因此,在限制为1个日期戳的电子表格范围内,当我第二次双击时,我得到一个错误,而不是在没有数据戳的情况下双击单元格。@VBANewb抱歉,我不明白。也许可以重新表述你的问题或列举例子。