当我使用Worksheet_Change和Target时,这两个问题不断出现。当我删除我认为Target所指的其中一个单元格的内容时,就会发生这种情况。我会给我的代码看一下,这很简单:( PS,VBA相对较新,任何提示都会很棒!)
Private Sub Worksheet_Change(ByVal Target As Range)
'## Determine if change to cell Q6
If Target.Cells.count > 1 Then Exit Sub
If Target = Range("Q6") Then
'Determine if the 1 is contained within cell Q6
vRangeValue = Range("Q6").Value
vStringValue = 1
Application.EnableEvents = False
'Paste value in R6
If vRangeValue = vStringValue Then
Range("R6").Value = 1
End If
End If
'Remove 1 from R6
Range("R6").Value = 0
Range("R7").Value = 1
Application.EnableEvents = True
End Sub
当我第一次打开工作表并在Q6中键入1时,代码执行我想要的操作(它在R6中放入1,然后快速将其切换回0)。它也在R7中加1,因为它的速度非常快,我想要一张支票。但是,如果我删除工作表中任何单元格的内容(据我所知),我一直在获得标题中指定的两个错误之一。 我试过谷歌搜索,但我发现的所有例子都太具体了解,所以我想我会在这里咨询。感谢您的帮助,对不起,如果我做了些蠢事!
答案 0 :(得分:2)
这里有几个问题。
首先,您的堆栈空间不足,因为Worksheet_Change
事件正在更改工作表,这会触发Worksheet_Change
事件,该事件会更改工作表,从而触发Worksheet_Change
事件,哪......你明白了。
处理此问题的一种方法是添加一个重新进入标志,以防止事件处理程序递归。另一个是(正如你所尝试的)关闭事件,但见下文......我个人的偏好是使用重新进入标志,所以我不会干涉我真正关心的其他事件。
其次,Range
的默认属性是Value
。这意味着“测试”......
If Target = Range("Q6") Then
...正在比较单元格内容。它正在测试的是分配 Value
Range("Q6")
到Target
的{{1}}是True
。但是在这一点上它并不重要,因为事件处理程序触发Application.EnableEvents = False
低于代码中的那一行。
这部分做了大量多余的工作,可以简化为简单的比较和分配:
vRangeValue = Range("Q6").Value
vStringValue = 1
'...
If vRangeValue = vStringValue Then
Range("R6").Value = 1
End If
我会做更多这样的事情:
Private Changing As Boolean 'Module level scope
Private Sub Worksheet_Change(ByVal Target As Range)
If Changing Or Target.Cells.Count > 1 _
Or Application.Intersect(Target, Range("Q6")) Is Nothing Then Exit Sub
Changing = True
If Target.Value = 1 Then
Range("R6").Value = 1
End If
'Range("R6").Value = 0 '<--No clue why you do this.
Range("R7").Value = 1
Changing = False
End Sub