MS Excel VBA,超出堆栈空间和运行时错误'-2147417848(800 10 108)':对象'范围'的方法'值'失败

当我使用Worksheet_Change和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)时,代码就做到了我想要的。 它也把1放在R7'因为它太快了,我想要一张支票。 但是,如果我删除我的工作表中任何单元格的内容(据我所知),我已经得到标题中指定的两个错误之一。 我试过Googlesearch,但是我发现的所有例子都太具体,不明白,所以我想我会在这里咨询。 感谢任何帮助,如果我做了一些愚蠢的事情,很抱歉!

夫妇问题在这里。

首先,由于Worksheet_Change事件正在更改工作表,因此Worksheet_Change事件将触发Worksheet_Change事件,从而触发Worksheet_Change事件,因此您将耗尽堆栈空间。

处理这种情况的一种方法是添加一个防止事件处理程序recursion的重新login标志。 另一个是(正如你所试图的)closures事件,但是请看下面…我个人的偏好是使用重新login标志,所以我不会干涉其他我真正关心的事件。

其次, Range的默认属性是Value 。 这意味着这里的“testing”…

 If Target = Range("Q6") Then 

…比较单元格的内容 。 它testing的是 Range("Q6")Value Range("Q6") 分配Target是否为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