Wie kann ich jedes Mal, wenn sich ein Wert in einer bestimmten Zelle ändert, automatisch ein Excel-Makro ausführen?
Im Moment lautet mein Arbeitscode:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
Wo "H5"
ist die bestimmte Zelle überwacht und Macro
ist der Name des Makros.
Gibt es einen besseren Weg?
excel
vba
automation
namin
quelle
quelle
Antworten:
Ihr Code sieht ziemlich gut aus.
Seien Sie jedoch vorsichtig, denn Ihr Aufruf von
Range("H5")
ist ein Verknüpfungsbefehl zuApplication.Range("H5")
, der äquivalent zu istApplication.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 Zellenwerte des Arbeitsblatts ändern, wenn es sich nicht um das aktive Blatt handelt, über programmatische Änderungen, z. B. VBA.In diesem Sinne würde ich verwenden
Target.Worksheet.Range("H5")
:Oder Sie können verwenden
Me.Range("H5")
, wenn sich der Ereignishandler auf der Codepage für das betreffende Arbeitsblatt befindet (normalerweise):Hoffe das hilft...
quelle
H5
von einem anderen Blatt geändert wird? Sagen wir,sheet2
dann funktioniert die obige Funktion nicht. Bitte helfen Sie dabei.ActiveSheet
und wenn Sie nicht explizit angeben, dass es sich um Excel handelt, mit dem Sie arbeiten, geht Excel davon ausApplication
.Worksheet_Change
Ereignis muss befinden), ein unqualifiziertesRange
ist nicht standardmäßig ,ActiveSheet
sondern bezieht sich auf das Blatt den Code enthält. Der Code in dieser Antwort ist daher effektiv der gleiche wie der Code in der Frage. (Hinweis: Im Jahr 2009, als diese Antwort geschrieben wurde, war sie vielleicht anders, aber ich bin mir ziemlich sicher, dass dies nicht derBehandeln Sie das
Worksheet_Change
Ereignis oder dasWorkbook_SheetChange
Ereignis.Die Ereignishandler verwenden das Argument "Ziel als Bereich", sodass Sie überprüfen können, ob der sich ändernde Bereich die Zelle enthält, an der Sie interessiert sind.
quelle
Target.Address = Range("H5").Address
. Gibt es einen einfacheren Weg?Not (Intersect(Target, Range("H5")) Is Nothing)
. Würden Sie das so machen?Target.Address = Range("H5").Address
) würde nicht funktionieren, wenn Ihre Zelle nur Teil des geänderten Bereichs wäre. Der zweite Kommentar leidet immer noch unter den von Mike Rosenblum beschriebenen Problemen.Ich habe viel Zeit damit verbracht, dies zu erforschen und zu lernen, wie alles funktioniert, nachdem ich die Ereignisauslöser wirklich durcheinander gebracht habe. Da es so viele verstreute Informationen gab, beschloss ich, das, was ich gefunden habe, Schritt für Schritt an einem Ort wie folgt zu teilen:
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 Standardcodeansicht ist "Allgemein". Wählen Sie in der Dropdown-Liste oben in der Mitte "Arbeitsblatt" aus.
3) Private Sub Worksheet_SelectionChange ist bereits vorhanden, wie es sein sollte, lassen Sie es in Ruhe. Kopieren Sie den Code von Mike Rosenblum von oben und fügen Sie ihn ein. Ändern Sie den .Range-Verweis auf die Zelle, für die Sie nach einer Änderung suchen (in meinem Fall B3). Platzieren Sie Ihr Makro jedoch noch nicht (ich habe das Wort "Makro" nach "Dann" entfernt):
oder wählen Sie in der Dropdown-Liste oben links "Ändern" aus und fügen Sie sie in das Feld zwischen "Private Sub" und "End Sub" ein
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
4) Deaktivieren Sie in der Zeile nach "Dann" Ereignisse, damit beim Aufrufen Ihres Makros keine Ereignisse ausgelöst werden, und versuchen Sie, diese Arbeitsblattänderung in einem nie endenden Zyklus erneut auszuführen, der Excel zum Absturz bringt und / oder auf andere Weise alles durcheinander bringt:
5) Rufen Sie Ihr Makro auf
6) Schalten Sie Ereignisse wieder ein, damit die nächste Änderung (und alle anderen Ereignisse) ausgelöst wird:
7) Beenden Sie den If-Block und das Sub:
Der gesamte Code:
Dadurch werden Ereignisse in den Modulen ein- und ausgeschaltet, was zu Problemen führt und die Änderung einfach auslösen lässt, Ereignisse ausschaltet, Ihr Makro ausführt und Ereignisse wieder einschaltet.
quelle
Ich bevorzuge diesen Weg, nicht eine Zelle, sondern einen Bereich
quelle
Ich habe eine Zelle, die mit der Online-Bestandsdatenbank verknüpft und regelmäßig aktualisiert wird. Ich möchte ein Makro auslösen, wenn der Zellenwert aktualisiert wird.
Ich glaube, dies ähnelt einer Änderung des Zellenwerts durch ein Programm oder eine externe Datenaktualisierung, aber die obigen Beispiele funktionieren bei mir irgendwie nicht. Ich denke, das Problem ist, dass keine internen Excel-Ereignisse ausgelöst werden, aber das ist meine Vermutung.
Ich habe folgendes getan:
quelle