worksheet_change函数导致循环

时间:2013-12-30 19:01:29

标签: excel-vba vba excel

首先,正如您可能从下面看到的那样,我的VBA技能非常有限!

我正在创建一个电子表格,我正在尝试包含一些健全性检查。基本上,如果单元格G69大于零则表示已经购买了一个项目,因此单元格G68(定义已购买的项目类型)不能等于none,它必须是一个值(我强制它是'蛋')。如果G69不大于零则没有买任何东西,所以G68应该被迫'无'。

同样,如果单元格G68设置为“无”,则不会购买任何内容,因此G69应强制为零。

我拼凑在一起的代码如下:


Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$G$69" Then

 If Range("$G$69").Value > 0 Then

   Range("$g$68").Value = "Eggs"

 Else: Range("$g$68").Value = "None"

End If

End If

If Target.Address = "$G$68" Then

 If Range("$G$68").Value = "None" Then

  Range("$g$69").Value = 0

 End If

End If

End Sub

我在运行宏时遇到错误,我认为这是因为它创建了一个循环 - 我更改了G69的值,因此它改变了G68的值,从而触发了该单元格改变的if例程因此它试图将G69设置为一个值,依此类推......

任何人都可以解释我做错了什么吗?我怀疑它很容易解决并且与我笨拙的编码有关! :)

希望有道理!非常感谢..

Pat

3 个答案:

答案 0 :(得分:7)

如果您不希望对VBA中的单元格进行更改以触发事件,则可以在更改之前禁用事件,并在更改之后重新启用事件。

Application.EnableEvents = False

' code here will not trigger events.

Application.EnableEvents = True

答案 1 :(得分:1)

非常感谢你的帮助。代码现在看起来如下,似乎工作,不知道我是否得到错误检查正确!? :)

再次感谢.....


Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$G$69" Then    

        On Error GoTo Lastline
        Application.EnableEvents = False

        If Range("$G$69").Value > 0 Then
            Range("$g$68").Value = "Hosted" 
        Else: Range("$g$68").Value = "None"
        End If

        Application.EnableEvents = True 
    End If

    If Target.Address = "$G$68" Then

        Application.EnableEvents = False
        If Range("$G$68").Value = "None" Then

            Range("$g$69").Value = 0
        End If

       Application.EnableEvents = True
    End If

Lastline:

    Application.EnableEvents = True
End Sub

答案 2 :(得分:0)

只有在满足所有条件时才能更改。试试这个:

Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Target.Address
        Case "$G$69" ' Quantity
            ' Zero Quantity but Item is not None
            If Target.Value = 0 And Range("$G$68").Value <> "None" Then
                Range("$G$68").Value = "None"
            End If
            ' Non-zero Quantity but Item is None
            If Target.Value <> 0 And Range("$G$68").Value = "None" Then
                Range("$G$68").Value = "Eggs"
            End If
        Case "$G$68" ' Item Name
            ' Item is None but Quantity is not zero
            If Target.Value = "None" And Range("$G$69").Value <> 0 Then
                Range("$G$69").Value = 0
            End If
    End Select
End Sub

但如果G69 / G68包含公式且相关范围发生变化,则此检查无效。