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

Forumthread: Worksheet Change im ListObject

Worksheet Change im ListObject
13.09.2022 17:27:21
{Boris}
Hallo zusammen,
bin mit den Listobjects in VBA noch nicht so vertraut.
Möchte gerne per Worksheet-Change innerhalb Eingaben in Spalte 2 und 3 (der DataBodyRange) des Listobjects reagieren.
Wie lautet dafür die beste Abfrage?
Das hier (also jede Spalte einzeln abfragen) sieht irgendwie zu sperrig aus (wenngleich es funktioniert):

Private Sub Worksheet_Change(ByVal Target As Range)
With Me.ListObjects(1).DataBodyRange
If Not Intersect(Target, .Columns(2)) Is Nothing Or Not Intersect(Target, .Columns(3)) Is Nothing Then
'mach was
End If
End With
End Sub
Wie würdet ihr es schreiben (vor allem, wenn es noch mehr Spalten sein können)?
Danke vorab!
VG, Boris
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Worksheet Change im ListObject
13.09.2022 19:22:48
ralf_b
Hallo Boris,
hier ein paar Ideen

If Target.ListObject Is Nothing Then Exit Sub 'wenn außerhalb der Tabelle
With Target.ListObject
' wenn im Bereich von Spalte1 bis X
If Intersect(Target, Range(.ListColumns("Spaltenname1").Range, .ListColumns("SpaltennameX").Range)) Then
'oder
If Not Intersect(Target, Range("Tabelle1[[Spaltenname1]:[SpaltennameX]]")) Is Nothing Then
'wenn in Spalte1 oder Spalte X
If Not Intersect(Target, Union(.ListColumns("Spaltenname1").Range, .ListColumns("SpaltennameX").Range)) Is Nothing Then
'mittels  Prüfung der Spaltennummer der Zellen in der Kopfzeile, wenn die Tabelle nicht bei A anfängt, sonst einfacher nur die Zahlen
With .HeaderRowRange
Select Case Target.Column
Case .Cells(3).Column, .Cells(17).Column
Case Else
End Select
End with
End With

Anzeige
Sehr gut...
13.09.2022 19:26:40
{Boris}
Hi Ralf,
...vielen Dank für die verschiedenen Ansätze!
Hab selbst (zeitgleich mit Dir) noch ne Variante gepostet - aber jetzt habe ich ja genügend Auswahl! :-)
Viele Grüße
Boris
Variante mit Stringvergleich
13.09.2022 19:23:06
{Boris}
Hallo zusammen,
hab selbst nochmal etwas rumgebastelt und bin dabei auf diese Variante gekommen:

Private Sub Worksheet_Change(ByVal Target As Range)
Const sCols As String = ",2,3,5,7," 'in diesen Spalten des Listobjects soll der Code reagieren
Dim C As Range, lngLOCol As Long
With Me.ListObjects(1)
Set C = Intersect(Target, .DataBodyRange)
If Not C Is Nothing Then
'Spalte innerhalb des Listobjects ermitteln
lngLOCol = C.Column - .DataBodyRange.Column + 1
If InStr(1, sCols, "," & lngLOCol & ",") Then
MsgBox "Jetzt passiert was"
End If
End If
End With
End Sub
Wie bewertet ihr dieses Vorgehen? Kann man das (für viele Spalten) so machen oder würdet ihr es anders (wie?) lösen?
https://www.herber.de/bbs/user/155163.xlsm
VG, Boris
Anzeige
AW: Variante mit Stringvergleich
13.09.2022 20:02:09
GerdL
Hi Boris,
bezogen auf deine Eingangsfrage.

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, ListObjects(1).DataBodyRange.Columns(2).Resize(, 2)) Is Nothing = False Then MsgBox "Ping!"
End Sub
Gruß Gerd
Für zusammenhängende Spalten...
13.09.2022 20:16:25
{Boris}
Hi Gerd,
...- und so hatte ich mein Beispiel ja formuliert - eine sehr gute Idee - danke dafür! :-)
VG, Boris
Anzeige
AW: Worksheet Change im ListObject
14.09.2022 11:19:53
snb

Private Sub Worksheet_Change(ByVal Target As Range)
For Each it In Target
If Not Intersect(it, Range("D:E,G:G,I:I"), ListObjects(1).DataBodyRange) Is Nothing Then it.Font.Color = vbCyan
Next
End Sub

Ebenfalls sehr gut!
14.09.2022 11:28:37
{Boris}
Hi,
...noch ne kurze Variante mehr - danke!
VG, Boris
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Worksheet Change im ListObject


Schritt-für-Schritt-Anleitung

  1. Öffne den Visual Basic for Applications (VBA) Editor in Excel (Alt + F11).
  2. Navigiere zu dem Arbeitsblatt, in dem das ListObject enthalten ist.
  3. Füge den folgenden Code in das Codefenster des Arbeitsblatts ein:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.ListObjects(1).DataBodyRange.Columns(2).Resize(, 2)) Is Nothing Then
        MsgBox "Änderung in Spalte 2 oder 3!"
    End If
End Sub
  1. Testen: Ändere einen Wert in Spalte 2 oder 3 deines ListObjects, um zu sehen, ob die MessageBox erscheint.

Häufige Fehler und Lösungen

  • Fehler: "Objekt nicht gefunden"

    • Lösung: Stelle sicher, dass du das richtige ListObject ausgewählt hast. Überprüfe den Namen des ListObjects und die Indizes.
  • Fehler: Keine Reaktion auf Änderungen

    • Lösung: Überprüfe, ob das Arbeitsblatt, das du bearbeitest, auch tatsächlich das richtige ist. Die Worksheet_Change-Ereignisse reagieren nur, wenn Änderungen im aktiven Arbeitsblatt gemacht werden.

Alternative Methoden

Eine Möglichkeit, um die Flexibilität zu erhöhen, ist, die Spalten dynamisch zu bestimmen. Hier ein Beispiel, das einen Stringvergleich verwendet:

Private Sub Worksheet_Change(ByVal Target As Range)
    Const sCols As String = ",2,3,5,7," ' Spalten, in denen reagiert werden soll
    Dim C As Range, lngLOCol As Long
    With Me.ListObjects(1)
        Set C = Intersect(Target, .DataBodyRange)
        If Not C Is Nothing Then
            lngLOCol = C.Column - .DataBodyRange.Column + 1
            If InStr(1, sCols, "," & lngLOCol & ",") Then
                MsgBox "Änderung erkannt!"
            End If
        End If
    End With
End Sub

Diese Methode ermöglicht das Reagieren auf mehrere Spalten in einem ListObject.


Praktische Beispiele

Hier sind einige Beispiele, wie du den Worksheet_Change-Ereigniscode anpassen kannst:

  1. Färbe Schrift in bestimmten Spalten:
Private Sub Worksheet_Change(ByVal Target As Range)
    For Each it In Target
        If Not Intersect(it, Me.ListObjects(1).DataBodyRange.Columns("D:E,G:G,I:I")) Is Nothing Then
            it.Font.Color = vbCyan
        End If
    Next
End Sub
  1. Reagiere auf mehrere ListObjects:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lo As ListObject
    For Each lo In Me.ListObjects
        If Not Intersect(Target, lo.DataBodyRange) Is Nothing Then
            MsgBox "Änderung in " & lo.Name
        End If
    Next lo
End Sub

Tipps für Profis

  • Vermeide unnötige Berechnungen: Nutze die Intersect-Funktion effizient, um nur auf relevante Zellen zu reagieren.
  • Debugging: Verwende Debug.Print statt MsgBox, um Ausgaben im Direktfenster anzuzeigen, ohne die Ausführung zu unterbrechen.
  • Fehlerbehandlung: Implementiere On Error Resume Next für robustere Skripte, um Laufzeitfehler abzufangen.

FAQ: Häufige Fragen

1. Wie kann ich mehrere ListObjects abfragen?
Du kannst eine Schleife verwenden, um durch alle ListObjects in einem Arbeitsblatt zu iterieren und Intersect für jedes ListObject anzuwenden.

2. Was ist der Unterschied zwischen DataBodyRange und HeaderRowRange?
DataBodyRange umfasst nur die Daten in der Tabelle, während HeaderRowRange die Kopfzeile der Tabelle repräsentiert.

3. Wie kann ich sicherstellen, dass mein Code auch bei verschiedenen Spalten funktioniert?
Verwende die Intersect-Funktion zusammen mit dynamischen Bereichsreferenzen, um flexibel auf verschiedene Spalten reagieren zu können.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige