2017-02-19 2 views
0

Ich muss einfach Makro in VBA, die Wert einer Zelle ändert, wenn ich diese Zelle Wert Formular Excel ändern. Zum Beispiel ändere ich im Excel-Wert der Zelle auf 100 und das löst Makro, die zu diesem Zelle Wert 1 hinzufügen. Ich habe es gemacht, aber das Problem ist ziemlich seltsam ... dieses Makro löst 84-86 mal ich weiß nicht warum VBA macht das für mich, aber ich weiß nicht, wie ich mit diesem Problem umgehen soll.Nicht gewünscht Autolooping-Makro in VBA (Makro, das 84-86 mal spontan Schleifen)

Vielen Dank für Ihre Hilfe!

Code of Makro:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim KeyCells As Range 
    Set KeyCells = Range("D8") 

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _ 
      Is Nothing Then 

     Cells(8, 4) = Cells(8, 4) + 1 

    End If 
End Sub 
+0

erraten, was Ereignis wird ausgelöst, wenn Sie die Inhalte von 'Zellen ändern (8, 4)'. – GSerg

+0

Ah, ich ändere gerade wieder Range ("D8"), also fängt das Makro wieder an, oder? –

+3

Ich bin nicht sicher, welches ist ein besseres Duplikat für Sie, [Worksheet_change Makro läuft mehrmals in Excel 2007] (http://Stackoverflow.com/q/32064447/11683), [Tabellen - Worksheet_Change Brände mehrere Male] (http://stackoverflow.com/q/41133592/11683) oder [Mehrere Worksheet_change-Ereignisse, die sich gegenseitig auslösen] (http://stackoverflow.com/q/22692270/11683). Wähle selbst einen aus. – GSerg

Antwort

1

Ich werde versuchen, etwas Ordnung für Sie ein wenig zu machen.

Sobald Sie die Zelle "D8" ändern, geben Sie das Ereignis Worksheet_Change ein und erhöhen den Wert der Zelle "D8" um +1. Dadurch wird der Code erneut ausgelöst usw., was zu einer Endlosschleife führt Application.EnableEvents = False Zugabe, vergessen Sie nicht, um sie wiederherzustellen, bevor Sie die Sub verlassen.

TargetAs Range definiert ist, so brauchen Sie nicht Range(Target.Address) zu bedienen, einfach Target verwenden.

Sobald Sie die Schleife eingegeben haben, können Sie Ersetzen Sie Cells(8, 4) durch Target, da es das gleicheistwie zuvor in Intersect(Target, Range("D8")) überprüft.

-Code

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Not Application.Intersect(Target, Range("D8")) Is Nothing Then 
     Application.EnableEvents = False 
     Target.Value = Target.Value + 1 
    End If 
    Application.EnableEvents = True '<-- restore setting 

End Sub