VBA工作表更改代码多次运行

时间:2017-07-10 13:09:42

标签: vba vlookup worksheet-function

我有这个代码来基本上评估一系列单元格中的条目,并检查它是否符合[1-9]的模式,如果是这样的话,请查看一个小表的vlookup 2列(1-9作为索引,然后在第2列中描述这些值的含义)。我的代码是:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rng1 As Range
Dim tgt As Range
Dim ws As Worksheet
Dim cell As Object
'Dim yn As Boolean

Set ws = ActiveWorkbook.ActiveSheet
Set rng1 = ws.Range("K13:K" & ws.UsedRange.Rows.Count)

    If Not Intersect(Target, rng1) Is Nothing Then

       If Target.Value Like "[1-9]*" Then

       'MsgBox "OK" & Target.Address & " " & Target.Text & " " & rng1.Address & " " & rng1.Count & " " & ActiveCell.Address

        Target.Value = WorksheetFunction.VLookup(Left(Target.Value, 1), ws.Range("J2:K10"), 2, 0)

        ElseIf Not Target Like "[1-9*]" Then

       Target = Empty

        End If

    End If

End Sub

我得到的问题是代码运行正常,但在每次单元格更改事件后,它会被多次评估(例如40-50次)。我在那里放了一个msgbox,可能会理解发生了什么,但我已经卡住了,不知道如何修复代码。我认为它与VLOOKUP功能有关。

由于

1 个答案:

答案 0 :(得分:2)

Target.Value = ...

将一次又一次地调用Worksheet_Change。解决方案: diasble events 。这是避免重入事件处理程序的正确解决方案:

Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  On Error Goto Cleanup

 ''''''''''''''''''''''''''''''
 '
 ' Your initital code goes here
 '
 ''''''''''''''''''''''''''''''

Cleanup:
  Application.EnableEvents = True
End Sub

重要的是,如果您的初始代码有Exit Sub语句,请将其替换为Goto Cleanup。这很重要,因为您肯定想要再次启用事件,以便您的应用程序保持正常运行。

相关问题