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

时间:2016-07-25 13:30:18

标签: excel vba excel-vba excel-2016

当我使用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,因为它的速度非常快,我想要一张支票。但是,如果我删除工作表中任何单元格的内容(据我所知),我一直在获得标题中指定的两个错误之一。 我试过谷歌搜索,但我发现的所有例子都太具体了解,所以我想我会在这里咨询。感谢您的帮助,对不起,如果我做了些蠢事!

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