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

Aktion bei Zelländerung aus einem klassenmodul

Forumthread: Aktion bei Zelländerung aus einem klassenmodul

Aktion bei Zelländerung aus einem klassenmodul
10.04.2026 19:51:50
nde
Hallo Forum,

ich würde gerne über ein Klassenmodul eine Aktion ausführen wenn sich ein wert in einem bestimmtem Bereich eines Tabellenblattes geändert hat.

Ich weiß normalerweise tut man dieses über "Worksheet_Change" das kann ich aber nicht umsetzen da das Tabellenblatt erst über VBA Code erzeugt wird. Gibt es hier eine Möglichkeit?


Danke an alle und Grüße

NDe
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Das geht z. B. über...
10.04.2026 20:31:39
Case
Moin, :-)

... das Klassenmodul "DieseArbeitsmappe". Das gilt auch für neue Tabellenblätter. ;-)

Dann kannst du (wenn du das Tabellenblatt z. B. am Ende einfügst) so darauf reagieren: ;-)
Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Index = ThisWorkbook.Worksheets.Count Then
'If Sh.Name = "Tab2" Then
' Mach was...
End If
End Sub

Also Code ist in "DieseArbeitsmappe"! ;-)

Du reagierst auf den Index, (oder den Namen). ;-)

Servus
Case
Anzeige
habe noch fragen
10.04.2026 22:15:05
nde
hallo Case hallo Forum,

ich habe es leider nicht hinbekommen!

mein Code ist folgender


Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Dim WsName As Variant
Dim Z As Variant
Dim S As Variant
Dim StatusMTART As Variant

Z = ActiveCell.Row
S = ActiveCell.Column
StatusMTART = ActiveCell.Value

WsName = "001_Materialarten"

'If Sh.Index = ThisWorkbook.Worksheets.Count Then
If Sh.Name = WsName Then
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Target, Range("$A$6:$A$100")) Is Nothing Then Exit Sub
If StatusMTART = "out of Scope" Then
Range(Sheets(WsName).Cells(Z, S), Sheets(WsName).Cells(Z, 27)).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent3
.TintAndShade = 0.399975585192419
.PatternTintAndShade = 0
End With
Else
End If
End If
End Sub


wo genau platziere ich den Code das er auf die Änderungen in der Range angesprochen wird?
Anzeige
Dann vermute ich mal,...
10.04.2026 22:46:03
Case
Moin, :-)

... dass du statt ActiveCell.Row, ActiveCell.Column und ActiveCell.Value so schreiben musst: ;-)
Z = Target.Row

S = Target.Column
StatusMTART = Target.Value

Denn wenn du z. B. in der Zelle mit "out of Scope" Return drückst, dann ist ActiveCell.Row schon eine Zeile weiter. ;-)

Servus
Case
Anzeige
Wenn es dir darum...
11.04.2026 11:13:13
Case
Moin, :-)

... geht, dass bei Eingabe von "out of Scope" in A6:A100 im Tabellenblatt "001_Materialarten" die Zeile von A bis AA gefärbt wird, dann kannst du es auch so schreiben: ;-)
Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "001_Materialarten" And Target.Cells.Count = 1 Then
If Not Intersect(Target, Range("$A$6:$A$100")) Is Nothing And Target.Value = "out of Scope" Then
Worksheets(Sh.Name).Cells(Target.Row, Target.Column).Resize(, 27).Interior.Color = 5886791
End If
End If
End Sub

Bzw., wenn die Farbe bei anderer Eingabe wieder entfernt werden soll, dann so: ;-)
Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "001_Materialarten" And Target.Cells.Count = 1 Then
If Not Intersect(Target, Range("$A$6:$A$100")) Is Nothing And Target.Value = "out of Scope" Then
Worksheets(Sh.Name).Cells(Target.Row, Target.Column).Resize(, 27).Interior.Color = 5886791
Else
Worksheets(Sh.Name).Cells(Target.Row, Target.Column).Resize(, 27).Interior.Color = xlNone
End If
End If
End Sub

Code gehört in "DieseArbeitsmappe" - aber nur Einer, nicht Beide. ;-)

Jetzt könnte man noch abfangen, was passieren soll, wenn du die ganze Spalte A markierst und alle Inhalte entfernst. ;-)
Es kommt also immer auf die/deine Arbeitsweise an. ;-)

Servus
Case
Anzeige
Aktion bei Zelländerung
10.04.2026 20:35:35
Uduuh
Hallo,
die einfachste Lösung: Erstelle dir ein Muster mit Code und kopiere das.

Gruß aus'm Pott
Udo
Aktion bei Zelländerung aus einem Klassenmodul
10.04.2026 22:36:44
xlKing
Hallo und Guten Abend,

ich schlage vor Case' Lösung zu verwenden. Dies ist der wirklich einfachste Weg. Allerdings springt das Ereignis dann bei jedem Sheet an, sodass du wie von ihm gezeigt dich per Bedingung auf das gewünschte Sheet einschränken musst.

Für Worksheets mag das gehen. Für alle anderen Ereignisorientierten Objekte solltest du aber den Standardweg gehen. Im Fall eines Worksheets wäre das z.B. dieser:

  • Füge ein Klassenmodul ein und gib ihm einen sinnvollen Namen (hier z.B. clsSheet).

  • Deklariere ganz oben im Klassenmodul eine Public-Variable mit dem Schlüsselwort Withevents

  • Wähle noch weiter oben im Codefenster des Klassenmoduls in der linken Combobox deine Public Variable und in der rechten Combobox das gewünschte Ereignis.

  • Lege in einem anderen Modul (am besten da wo du die neuen Sheets erstellst) ganz oben noch vor der ersten Prozedur eine Variable vom Typ Collection an. (Falls du mehrere Sheets erstellen willst - bei nur einem Sheet reicht auch eine normale Variable aus.)

  • Erstelle dann gleichzeitig mit dem neuen Sheet eine neue Instanz des Klassenmoduls.

  • wenn du nun einen punkt hinter die Variable, die das Klassenmodul als Objekt zurückgibt, setzt dann springt das IntelliSense an und gibt dir deine Public Variable, die du am Anfang im Klassenmodul definiert hast, als Eigenschaft aus.

  • In diese Eigenschaft legst du nun das erstellte Objekt, hier also dein Worksheet.


  • Sobald du den Code ausgeführt hast und der Eigenschaft des Klassenmoduls ein gültiges Objekt hinterlegt hast, funktionieren die Ereignisse, die du im Klassenmodul definiert hast. Beachte aber, dass bei bestimmten Gelegenheiten, die Collection bzw. Die Variable die das Klassenmodul beinhaltet, ihre Werte verliert. z.B. beim Schließen der Datei. du musst also, wenn du das erstellte Objekt behalten willst, das erstellte Objekt immer wieder der Eigenschaft des Klassenmoduls hinterlegen. z.b. über das Workbook-Open-Ereignis.

    Das war jetzt viel Text, deshalb ein einfaches Beispiel:

    In ein Klassenmodul mit dem Namen clsSheet kommt folgender Code:
    Public WithEvents WSheet As Worksheet
    

    Private Sub WSheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B2:B4")) Is Nothing Then
    'Mach was, z.B.:
    MsgBox "Sie haben " & Target.Cells(1).Value & " in " & Target.Cells(1).Address & " eingegeben"
    End If
    End Sub


    In ein allgemeines Modul kannst du dann das schreiben:
    Dim mysheets As New Collection
    
    Sub Sheet_Anlegen()

    Dim wsh As Worksheet, csht As clsSheet
    Set wsh = Worksheets.Add(After:=Sheets(Sheets.Count))
    'wsh.Name="Dein Name"
    'Den folgenden Teil ggf. in eine eigene Sub auslagern und über Workbook_Open aufrufen, nachdem das Sheet erstellt wurde.
    mysheets.Add New clsSheet
    Set csht = mysheets(mysheets.Count)
    Set csht.WSheet = wsh

    End Sub


    Ich gebe zu das ist etwas kompliziert aber der übliche Weg, wie man mit Ereignissen für zur Laufzeit erzeugten Objekten umgeht. Case' Vorschlag ist in deinem Fall wahrscheinlich wirklich die bessere Alternative.

    Gruß Mr. K.
    Anzeige
    CF
    11.04.2026 13:33:09
    snb
    Eine Zeile bedingte Formatierung reicht.
    Anzeige
    Anzeige
    Live-Forum - Die aktuellen Beiträge
    Datum
    Titel
    14.05.2026 13:31:09
    14.05.2026 09:50:42
    13.05.2026 19:14:18