如何在VBA中结束无限的"更改"循环

Paw*_*wel 7 excel vba excel-vba

我有一个visual basic的问题.我想创建一个宏/函数,它将我输入的数字乘以3,并在同一个单元格中给出结果.我试过这样的事情:

Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$Q$21" Then
        Target.Value = Target.Value * 3
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

但它不起作用 - 我得到的结果像"xE25",因为它不断增加.

我希望它在第一次迭代后停止,或者仅当我按下"输入"而不是单元格中的每个更改时才工作.
将结果放在不同的单元格中非常容易,但这不是我的观点.


-----编辑:
我编辑了"If"行到:
If (Target.Column = 5 Or Target.Column = 11 Or Target.Column = 17 Or Target.Column = 23) And (Target.Row >= 19 And Target.Row <= 24) And Target.Value <> "" Then
所以它适用于我需要的所有单元格.之后,最好的解决方案是@ Chrismas007给出的方式,因为它在尝试一次删除少数单元格中的数据时不会提示错误.

小智 6

Worksheet_Change事件宏更改值时,您需要设置Application.EnableEventsfalse或冒险触发另一个事件并使宏运行在其自身之上.

Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$Q$21" Then
        Application.EnableEvents = False
        Target.Value = Target.Value * 3
        Application.EnableEvents = True
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

虽然我通常会涉及一些错误控制,以便.EnableEvents始终重置为true,但上面应该让你开始.


Chr*_*007 6

通过错误处理确保.EnableEvents返回True:

Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo CleanExit
    If Target.Address = "$Q$21" Then
        Application.EnableEvents = False
        Target.Value = Target.Value * 3
    End If
CleanExit:
    Application.EnableEvents = True
    On Error GoTo 0
End Sub
Run Code Online (Sandbox Code Playgroud)