Frage führt bei einem Zellenwechsel automatisch ein Excel-Makro aus


Wie kann ich jedes Mal, wenn sich ein Wert in einer bestimmten Zelle ändert, automatisch ein Excel-Makro ausführen?

Im Moment ist mein Arbeitscode:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub

woher "H5" ist die bestimmte Zelle überwacht und Macro ist der Name des Makros.

Gibt es einen besseren Weg?


76
2018-01-03 17:33


Ursprung


Antworten:


Ihr Code sieht ziemlich gut aus.

Achten Sie jedoch auf Ihren Anruf bei Range("H5") ist ein Shortcut-Befehl an Application.Range("H5"), was gleichbedeutend ist mit Application.ActiveSheet.Range("H5"). Dies kann in Ordnung sein, wenn die einzigen Änderungen Benutzeränderungen sind - was am typischsten ist - aber es ist möglich, dass sich die Zellwerte des Arbeitsblatts ändern, wenn es nicht das aktive Blatt über programmatische Änderungen ist, z. VBA.

In diesem Sinne würde ich nutzen Target.Worksheet.Range("H5"):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub

Oder du kannst es benutzen Me.Range("H5")Wenn sich der Ereignishandler auf der Codepage für das betreffende Arbeitsblatt befindet (normalerweise):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub

Hoffe das hilft...


98
2018-01-06 01:59



Behandle die Worksheet_Change Ereignis oder das Workbook_SheetChange Veranstaltung.

Die Ereignisbehandlungsroutinen nehmen ein Argument "Ziel als Bereich", sodass Sie überprüfen können, ob der Bereich, der sich ändert, die Zelle enthält, an der Sie interessiert sind.


7
2018-01-03 17:36



Ich bevorzuge diesen Weg und verwende keine Zelle, sondern eine Reichweite

    Dim cell_to_test As Range, cells_changed As Range

    Set cells_changed = Target(1, 1)
    Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )

    If Not Intersect(cells_changed, cell_to_test) Is Nothing Then 
       Macro
    End If

3
2018-01-04 11:58



Ich habe viel Zeit damit verbracht, dies zu erforschen und zu lernen, wie alles funktioniert, nachdem ich die Ereignisauslöser wirklich vermasselt habe. Da es so viele verstreute Informationen gab, beschloss ich, das, was ich gefunden habe, an einem Ort zu teilen, Schritt für Schritt wie folgt:

1) Öffnen Sie den VBA-Editor, öffnen Sie unter VBA-Projekt (YourWorkBookName.xlsm) das Microsoft Excel-Objekt und wählen Sie das Blatt aus, auf das sich das Änderungsereignis beziehen soll.

2) Die Standard-Code-Ansicht ist "Allgemein". Wählen Sie in der Dropdown-Liste oben in der Mitte "Arbeitsblatt" aus.

3) Private Sub Worksheet_SelectionChange ist bereits da, wie es sein sollte, lass es in Ruhe. Kopiere / füge Mike Rosenblums Code von oben ein und ändere den .Range-Verweis auf die Zelle, für die du eine Veränderung beobachtest (in meinem Fall B3). Platziere dein Macro jedoch noch nicht (ich habe das Wort "Makro" nach "Dann" entfernt):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub

oder aus der Dropdown-Liste oben links, wählen Sie "Ändern" und in das Feld zwischen Private Sub und End Sub einfügen If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) In der Zeile nach "Then" schalten Sie Ereignisse aus, so dass beim Aufruf Ihres Makros keine Ereignisse ausgelöst werden und dieser Worksheet_Change erneut in einem nie endenden Zyklus ausgeführt wird, der Excel stürzt und / oder sonst alles versaut:

Application.EnableEvents = False

5) Rufen Sie Ihr Makro auf

Call YourMacroName

6) Schalten Sie die Ereignisse wieder ein, damit die nächste Änderung (und alle / alle anderen Ereignisse) ausgelöst wird:

Application.EnableEvents = True

7) Beenden Sie den If-Block und den Sub:

    End If
End Sub

Der gesamte Code:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
        Application.EnableEvents = False
        Call UpdateAndViewOnly
        Application.EnableEvents = True
    End If
End Sub

Dadurch werden Ereignisse aus den Modulen ein- / ausgeschaltet, was zu Problemen führt und die Änderung einfach auslöst, Ereignisse ausschaltet, das Makro startet und die Ereignisse wieder aktiviert.


2
2017-07-11 22:51



Ich habe eine Zelle, die mit Online-Lagerbestandsdatenbank verbunden ist und häufig aktualisiert wird. Ich möchte ein Makro auslösen, wenn der Zellenwert aktualisiert wird.

Ich glaube, das ist vergleichbar mit der Änderung der Zellenwerte durch ein Programm oder irgendeine externe Datenaktualisierung, aber die obigen Beispiele funktionieren irgendwie nicht für mich. Ich denke, das Problem ist, weil Excel interne Ereignisse nicht ausgelöst werden, aber das ist meine Vermutung.

Ich habe folgendes getan,

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
   'Run Macro
End Sub

0
2018-04-20 16:46