Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Worksheet_Change in Modul auslagern

Forumthread: Worksheet_Change in Modul auslagern

Worksheet_Change in Modul auslagern
21.05.2020 13:11:55
Kulo
Hallo Excelfreunde,
ich habe eine Arbeitsmappe mit vielen identischen Tabellenblättern für verschiedene Zeiträume angelegt.
Auf jedem Tabellenblatt wird bei einer Änderung in einem bestimmten Bereich ein Kommentar an die aktive Zelle angehängt, bearbeitet oder gelöscht.
Jetzt habe ich den erfordelichen Code unter jedes einzelne Tabellenblatt gelegt.
Bei einer Änderung des Codes muss ich diese Änderung in jedem Blatt einzeln vornehmen, was ich vereinfachen möchte.
So, wie ich ein Makro mit "call" aufrufen kann, funktioniert es aber nicht.
Wie kann ich es bewerkstelligen, dass ich den Großteil des Codes z.B. in ein Modul auslagere und von jedem Tabellenblatt bei einer Änderung im relevanten Bereich auf diesen Code zugreife?
In ungefähr so:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B14:M18")) Is Nothing Then
mach genau das, was du auch auf Tabelle1 gemacht hättest
End If
End Sub

Ich würdemich sehr freuen, wenn mir da jemand weiterhelfen würde.
Viele Grüße
Kulo
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
nicht ins Modul auslagern
21.05.2020 13:32:06
Matthias
Hi
benutze das
Workbook_SheetChange - Ereignis
Code gehört in diese Arbeitsmappe
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Intersect(Target, Range("B14:M18")) Is Nothing Then
MsgBox "macht das in jeder aktiven Tabelle bei Änderung"
End If
End Sub
Gruß Matthias
Anzeige
AW: nicht ins Modul auslagern
21.05.2020 13:51:39
Kulo
Hallo Matthias,
vielen Dank. Das ist, was ich gesucht habe.
Eine Frage noch:
Da nicht in allen Tabellenblättern meiner Mappe der angegebene Bereich überprüft werden soll, habe ich
If Not Intersect(Target, Range("B14:M18")) Is Nothing And ActiveSheet.Name Like "20**" Then
ergänzt. Es funktioniert. Aber ist dies auch korrekt oder so üblich?
Anzeige
wenns funktioniert ist es doch ok ;-) owT
21.05.2020 14:20:45
Matthias
AW: wenns funktioniert ist es doch ok ;-) owT
21.05.2020 14:25:06
Kulo
Hmm, man weiß ja nie. ;-)
Excel und ich sind noch nicht ganz so dicke Kumpels.
Also vielen Dank für deine Hilfe und noch einen schönen Feiertag.
Viele Grüße
Kulo
Nimm statt ActiveSheet.Name, sh.Name (owT)
21.05.2020 14:44:57
EtoPHG

Anzeige
nur weils kürzer ist ;-) ist doch total "wurscht"
21.05.2020 14:51:18
Matthias
.
AW: nur weils kürzer ist ;-) ist doch total "wurscht"
21.05.2020 15:31:48
Luschi
Hallo Matthias,
wenn eine Ereignis-Routine Übergabeparameter anbietet, dann sollte man diese auch benutzen.
Eigentlich fehlt ja noch die Prüfung, ob 'Sh' überhaupt vom Typ 'Worksheet' ist, denn in einem Diagrammblatt würde ein Error auftauchen, egal ob sh oder ActiveSheet.
Gruß von Luschi
aus klein-Paris
Anzeige
Dieses Ereignis gibt es nicht in Diagrammen! owT
21.05.2020 15:47:09
Matthias
AW: Worksheet_Change in Modul auslagern
21.05.2020 13:33:21
Hajo_Zi
Hallo Kulo,
unter DieseArbeitsmappe
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

AW: Worksheet_Change in Modul auslagern
21.05.2020 14:27:23
Kulo
Hallo Hajo,
vielen Dank für deine Hilfe.
Es war das, was ich gesucht habe.
Wünsch dir noch einen schönen Feiertag und
viele Grüße
Kulo
Anzeige
;
Anzeige

Infobox / Tutorial

Worksheet_Change in Modul auslagern


Schritt-für-Schritt-Anleitung

Um den Worksheet_Change-Ereigniscode in ein Modul auszulagern, folge diesen Schritten:

  1. Öffne den VBA-Editor: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Erstelle ein neues Modul: Rechtsklicke im Projekt-Explorer auf deine Arbeitsmappe, wähle Einfügen und dann Modul.

  3. Füge den Code ein: Schreibe den folgenden Code in das Modul:

    Public Sub HandleChange(ByVal Target As Range)
       If Not Intersect(Target, Range("B14:M18")) Is Nothing Then
           ' Hier kommt dein Code
           MsgBox "Änderung in B14:M18!"
       End If
    End Sub
  4. Workbook_SheetChange implementieren: Füge den folgenden Code in das DieseArbeitsmappe-Modul ein:

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
       Call HandleChange(Target)
    End Sub
  5. Teste deinen Code: Ändere einen Wert im Bereich B14:M18 auf einem der Arbeitsblätter und prüfe, ob die Meldung erscheint.


Häufige Fehler und Lösungen

  • Fehler: "Typenübereinstimmung": Stelle sicher, dass der Bereich, den du überprüfst, tatsächlich existiert. Überprüfe auch, ob Sh ein Worksheet ist.

  • Fehler: "Objektvariable oder With-Blockvariable nicht festgelegt": Dies kann passieren, wenn der Intersect-Befehl auf einen ungültigen Bereich zugreift. Vergewissere dich, dass der Zielbereich korrekt angegeben ist.


Alternative Methoden

Anstelle des Workbook_SheetChange-Ereignisses kannst du auch das Worksheet_Change-Ereignis für spezifische Blätter verwenden. Hier ein Beispiel:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B14:M18")) Is Nothing Then
        ' Code für spezifisches Arbeitsblatt
    End If
End Sub

Diese Methode ist nützlich, wenn du unterschiedliche Logiken für verschiedene Arbeitsblätter implementieren möchtest.


Praktische Beispiele

  1. Kommentar hinzufügen: Wenn du einen Kommentar in die aktive Zelle einfügen möchtest, kannst du den folgenden Code in die HandleChange-Subroutine einfügen:

    Target.AddComment "Änderung am " & Now
  2. Zellenfarbe ändern: Um die Hintergrundfarbe der geänderten Zellen zu ändern:

    Target.Interior.Color = RGB(255, 255, 0) ' Gelb

Tipps für Profis

  • Verwende Option Explicit am Anfang deines Moduls, um sicherzustellen, dass alle Variablen deklariert werden. Dies hilft, Fehler zu vermeiden.
  • Überlege, ob du die Application.EnableEvents = False und True Anweisungen verwenden möchtest, um rekursive Aufrufe des Worksheet_Change-Ereignisses zu verhindern.
  • Führe Tests in einer Kopie deiner Arbeitsmappe durch, um ungewollte Änderungen zu vermeiden.

FAQ: Häufige Fragen

1. Kann ich Workbook_SheetChange für mehrere Arbeitsblätter verwenden?
Ja, das Workbook_SheetChange-Ereignis wird für alle Arbeitsblätter in der Arbeitsmappe ausgeführt.

2. Wie kann ich sicherstellen, dass der Code nur für bestimmte Blätter ausgeführt wird?
Du kannst die Bedingung anpassen, indem du den Namen des Blattes überprüfst, z.B. If Sh.Name Like "20**" Then.

3. Gibt es eine Möglichkeit, nur bestimmte Zellen zu überwachen?
Ja, du kannst den Bereich in der Intersect-Überprüfung anpassen, um nur die relevanten Zellen zu überwachen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige