2017-07-09 5 views
0

Ich versuche, den Wert der Zielzelle mit VBA-Makro zu aktualisieren, wenn es in bestimmten Bereich existiert. Ich möchte seinen Wert aktualisieren, indem ich einen String mit seinem Wert verkette. Wenn zum Beispiel 250 in die Zielzelle schreibt, möchte ich "XYZ-250" in die Zielzelle zurückschreiben. Unten ist der Code:Aktualisieren Wert der Zielzelle in Excel VBA

Dim oldCellAddress As String 
Dim oldCellValue As String 
Private Sub Worksheet_Change(ByVal Target As Range) 
oldCellValue = 0 
If Not Intersect(Target, Range("E10:E500")) Is Nothing Then 
oldCellValue = Target.Value 
Sheet1.Cells(Target.Row, Target.Column).Value = "AST-" & oldCellValue 
End If 
End Sub 

Interessanterweise, wenn ich den Wert einer Zelle innerhalb des Bereichs (E10 bis E500) ändern wird das messagebox unendlich Mal angezeigt und hält die Excel und ich habe es wieder neu zu starten.

Vielen Dank im Voraus

+0

Ist es schneiden nicht (Target.Address , Bereich ("E10: E500))? Entschuldigung, nur mein erstes Gefühl. Seltsam ein Meldungsfeld würde erscheinen ... – Lowpar

+0

@Lowpar Meine Schätzung ist, dass das OP eine MsgBox verwendet, um zu verfolgen, ob die Funktion aufgerufen wurde, aber diese Zeile in der Frage nicht bekannt gab. (Aber ich könnte mich irren.) – YowE3K

+0

@ YowE3K Ja, ich habe gerade festgestellt, dass die Endlosschleife durch die Zelle selbst verursacht wurde, die sich verändert, was eine rekursive Funktion verursacht, die die gleiche Aktion wiederholt. Tolle Lösung, um Ereignisse zu deaktivieren! – Lowpar

Antwort

1

deaktivieren Ereignisse vor, eine Änderung zu machen, die das Change Ereignis ausgelöst wird:

Dim oldCellAddress As String 
Dim oldCellValue As String 
Private Sub Worksheet_Change(ByVal Target As Range) 
    oldCellValue = 0 
    If Not Intersect(Target, Range("E10:E500")) Is Nothing Then 
     Application.EnableEvents = False 
     oldCellValue = Target.Value 
     Target.Value = "AST-" & oldCellValue 
     Application.EnableEvents = True 
    End If 
End Sub 

Wenn Ereignisse nicht deaktiviert sind, Ihre Änderung wird Feuer auf die Zelle, die die Worksheet_Change Ereignis, das wird die Zelle ändern, die das Worksheet_Change Ereignis auslösen wird, das die Zelle ändern wird, die das Worksheet_Change Ereignis auslöst, das die Zelle ändern wird, die das Worksheet_Change Ereignis auslösen wird, das die Zelle ändern wird, die das feuern wird. ..


Angenommen, Sie nicht Ihre oldCellValue und oldCellAddress Modul-Scope-Variablen benötigen, aber nicht wollen, Änderungen an mehreren Zellen zu handhaben, diese stattdessen verwenden:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("E10:E500")) Is Nothing Then 
     Dim c As Range 
     Application.EnableEvents = False 
     For Each c In Intersect(Target, Range("E10:E500")).Cells 
      c.Value = "AST-" & c.Value 
     Next 
     Application.EnableEvents = True 
    End If 
End Sub 
+0

Nur zu beachten: Es ist möglich, dass "Target"> 1 Zelle oder sogar eine ganze Zeile/Spalte darstellen könnte. In diesen Fällen, nur weil die Überschneidung zwischen "Target" und einem bestimmten Bereich nicht "Nothing" ist, bedeutet das nicht, dass * all * des "Target" -Bereichs innerhalb Ihres Interessenbereichs liegt. Wenn Sie also nach einem Schnittpunkt suchen und dann weitermachen, um auf Target zu operieren, könnte dies zu unerwarteten Ergebnissen führen. –

+0

@TimWilliams Ich hatte darüber nachgedacht, aber ich war nicht sicher, warum das OP "OldCellValue" und "OldCellAddress" verwendet. (Vielleicht den alten Wert und neue Werte irgendwo anders im [nicht hochgeladenen] Code verfügbar zu haben?). Das Verfolgen "alter" Werte während der Behandlung mehrerer gleichzeitiger Änderungen (oder sogar mehrerer sequenzieller Änderungen) schien zu mühsam für eine "disable the events" Antwort zu sein, aber ich habe eine Alternative hinzugefügt, die mehrere Änderungen ** ohne ** impliziert Pflege der "alten" Variablen. – YowE3K

+0

Ja guter Punkt - die Globals - die als String eingegeben werden - würde einen Fehler verursachen, wenn mehrere Zellen aktualisiert werden ... –

Verwandte Themen