2017-07-10 4 views
2

J'ai ce code en place pour évaluer fondamentalement l'entrée dans une plage de cellules, et pour vérifier si elle est conforme à un modèle de [1-9], et si oui faire un vlookup d'une petite table qui a 2 colonnes (1-9 comme index, puis dans la colonne 2 la description de ce que signifient ces valeurs). Mon code est:Code de changement de feuille de calcul VBA s'exécutant plusieurs fois

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 

Le problème que je reçois est que le code fonctionne très bien, mais il est évalué à plusieurs reprises (comme 40-50 fois), après chaque événement de changement de cellule. Je mets un msgbox là pour peut-être comprendre ce qui se passe mais je suis bloqué et je ne sais pas comment réparer le code. Je pense que cela a à voir avec la fonction VLOOKUP.

Merci

Répondre

2
Target.Value = ... 

invoqueront Worksheet_Change une fois encore et encore. Solution: événements diasble. Ceci est la bonne solution pour éviter un gestionnaire d'événements rentrante:

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 

Il est important, si votre code initial a toujours une déclaration Exit Sub, le remplacer par Goto Cleanup. C'est important parce que vous avez besoin pour activer à nouveau les événements afin que votre application fonctionne correctement.

+1

Merci cela a fonctionné! Bon à savoir à l'avenir –