2017-07-10 13 views
2

このコードは、基本的にセルの範囲内のエントリを評価し、[1-9]のパターンに適合しているかどうかを確認するために使用します。 2つの列(インデックスとして1〜9、次に列2にこれらの値が意味するものの説明)を持つ小さな表のvlookup。私のコードは次のとおりです。VBAワークシートが複数回実行されているコードを変更する

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関数と関係していると思っています。

おかげ

答えて

2
Target.Value = ... 

はかつて何度も何度もWorksheet_Changeを呼び出します。ソリューション:diasble events。あなたの最初のコードは、これまでExit Sub文を持っている場合、Goto Cleanupと交換し、

重要な
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 

:これは再入イベントハンドラを回避するための正しい解決策です。 が確実にになり、アプリケーションが正しく動作するようにイベントを再度有効にする必要があるため、これは重要です。

+1

ありがとうございました!今後のことを知っておくと良い –

関連する問題