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

ListObject nacheinander durchlaufen möglich?

Forumthread: ListObject nacheinander durchlaufen möglich?

ListObject nacheinander durchlaufen möglich?
26.03.2019 14:56:02
Berni
Hallo liebes Forum,
ich komme bei der Erstellung meines Dienstplans nicht weiter und erhoffe mir einen Tip von euch Spezialisten.
Der Dienstplan besteht aus zwei Dateien:
1.) Test.xlsm enthält den Dienstplan und jede Menge Beiwerk zur ausgewählten Organisationseinheit
2.) x99Datenbank.xlsx ist eine "dumme" Tabelle ohne Formatierungen und Makros
Diese Lösung habe ich gewählt, um in einem Behördensystem (!Excel 2010!) :-( "gleichzeitig" mit mehreren Anwendern arbeiten zu können.
Jeder User hat eine Datei 1. Beim Öffnen werden die aktuellen Daten aus der Datei 2 geladen und diese dann wieder geschlossen. Beim Schließen werden eigene Änderungen in die Datei 2 übertragen.
Nun zu meine Problem:
Die Datei 1 enthält 12 Tabellen für die Kalendermonate.
Für den Kopiervorgang von 2 zu 1 muss ich diese 12 Tabellen (tbl_Jan bis tbl_Dez) nacheinander ansprechen und dachte mir mit einem "Select Case" arbeiten zu können.
Das Kopieren funktioniert, wenn ich es so schreibe:
In dieser Zeile wird mit einer For Next Schleife die Personalnummer aus der tbl_Jan (=Tabelle für Januar in Datei 1) in Spalte 1 herausgesucht. Anschließend wird die ID in der Datei 2 gesucht ...
SuchID = Workbooks(p_strFileFront).Worksheets(p_strSheetFront).ListObjects("tbl_Jan").DataBodyRange(i, 1)
Um nicht für alle Monate den Code runterschreiben zu müssen, würde ich nun gern mit Select Case in Kombination mit For Next 1-12 die Tabellen der Monate nacheinander ansprechen.
so:
Dim tbl_MONAT As ListObject, c As Integer
'Monatstabellen durchzählen:
For c = 1 To 12
Select Case (c)
Case 1: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Jan")
Case 2: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Feb")
Case 3: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Maerz")
Case 4: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_April")
Case 5: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Mai")
Case 6: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Juni")
Case 7: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Juli")
Case 8: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Aug")
Case 9: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Sept")
Case 10: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Okt")
Case 11: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Nov")
Case 12: Set tbl_MONAT = Worksheets(p_strSheetFront).ListObjects("tbl_Dez")
Case Else
End Select

Nun bekomme ich aber in der von oben angepassten Zeile einen Fehler: "Index außerhalb des gültigen Bereichs"
SuchID = Workbooks(p_strFileFront).Worksheets(p_strSheetFront).ListObjects(tbl_MONAT).DataBodyRange(i, 1)
Habt ihr einen Tip für mich, wo mein Fehler liegt? Wie kann ich eine Funktion um meine Kopierfunktion bauen, die mir die Tabellen der einzelnen Monate nacheinander durchläuft?
Ich bedanke mich schon einmal im Voraus für die Mühe.
Schöne Grüße, Berni.
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ListObject nacheinander durchlaufen möglich?
26.03.2019 15:35:27
Beverly
Hi Berni,
die ListObjekte ansprechen vielleicht nach diesem Prinzip:
    Dim tblMonat As ListObject, c As Integer
For Each tblMonat In ActiveSheet.ListObjects
Select Case tblMonat.Name
Case "tbl_Jan"
MsgBox "JAnuar"
Case "tbl_Feb"
MsgBox "Februar"
Case "tbl_Mrz"
MsgBox "März"
'.... hier die weiteren Namen
End Select
Next tblMonat


Anzeige
AW: ListObject nacheinander durchlaufen möglich?
26.03.2019 21:11:19
Berni
Guten Abend
und dir Karin vielen Dank für deine Idee. Der Code - für sich genommen - funktioniert wunderbar. Nur bekomme ich es nicht funktionstüchtig in meine Zeilen implantiert.
Sowohl bei meiner Lösung oben, wie auch bei Karins Lösung wird mir beim Debuggen in der Zeile
SuchID = Workbooks(p_strFileFront).Worksheets(p_strSheetFront).ListObjects(tbl_MONAT).DataBodyRange(i, 1)
der Fehler: "Index außerhalb des gültigen Bereichs" ausgegeben. Wenn ich dann mit der Maus in dieser gelb markierten Zeile über den Bereich (tbl_MONAT) schwebe zeigt er mir darunter den Wert tbl_MONAT = "tbl_Jan" an. Ich verstehe nun nicht, warum diese Fehlermeldung erscheint, bzw. wo mein Fehler liegt.
Hat jemand eine Idee?
Vielen Dank und Grüße!
Anzeige
AW: ListObject nacheinander durchlaufen möglich?
26.03.2019 21:19:00
Berni
Noch ein Zusatz:
interessanterweise funktioniert es, die Zeilen der Tabelle für Januar korrekt zu zählen:
Dim Count_i As Integer
Count_i = tbl_MONAT.ListRows.Count
MsgBox Count_i
Hier scheint Excel die richtige Tabelle anzusprechen. Jedoch bei den (...).ListObjects("tbl_MONAT").DataBadyRange (...) funktioniert dies nicht.
Anzeige
AW: ListObject nacheinander durchlaufen möglich?
26.03.2019 21:22:43
Berni
gerade gesehen:
(...).ListObjects(tbl_MONAT).DataBadyRange (...) funktioniert dies nicht.
ohne Anführungszeichen in den Klammern muss es geschrieben werden.
Ist das Problem nun geklärt...
26.03.2019 22:31:41
Beverly
...oder nicht? Falls nicht - lade bitte deine Mappe hoch.


Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

ListObjects in Excel nacheinander durchlaufen


Schritt-für-Schritt-Anleitung

Um ListObjects in Excel nacheinander durchzulaufen, kannst du die folgende Schritt-für-Schritt-Anleitung nutzen. Das Beispiel basiert auf Excel 2010:

  1. Vorbereitung: Stelle sicher, dass deine Excel-Datei die entsprechenden Tabellen (tbl_Jan bis tbl_Dez) enthält.

  2. Code einfügen: Öffne den VBA-Editor in Excel (Alt + F11) und füge ein neues Modul hinzu.

  3. VBA-Code schreiben: Nutze den folgenden Code, um die Tabellen nacheinander anzusprechen:

    Dim tbl_MONAT As ListObject
    Dim c As Integer
    
    For c = 1 To 12
       Select Case c
           Case 1: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Jan")
           Case 2: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Feb")
           Case 3: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Maerz")
           Case 4: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_April")
           Case 5: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Mai")
           Case 6: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Juni")
           Case 7: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Juli")
           Case 8: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Aug")
           Case 9: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Sept")
           Case 10: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Okt")
           Case 11: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Nov")
           Case 12: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Dez")
       End Select
    
       ' Hier kannst du deine Aktionen mit tbl_MONAT ausführen
    Next c
  4. Kopieren und Anpassen: Passe die Namen deiner Blätter und Tabellen an. Teste den Code, um sicherzustellen, dass alles funktioniert.


Häufige Fehler und Lösungen

  1. Fehler: "Index außerhalb des gültigen Bereichs"

    • Lösung: Stelle sicher, dass der Name des ListObjects genau mit dem Namen in Excel übereinstimmt. Achte auf Groß- und Kleinschreibung und eventuelle Leerzeichen.
  2. Fehler bei der Verwendung von ListObjects

    • Lösung: Um auf ein ListObject zuzugreifen, verwende keine Anführungszeichen um die Variable tbl_MONAT. Der korrekte Zugriff sieht so aus:
      SuchID = Workbooks(p_strFileFront).Worksheets(p_strSheetFront).ListObjects(tbl_MONAT.Name).DataBodyRange(i, 1)

Alternative Methoden

Eine alternative Methode, um durch ListObjects zu iterieren, ist die Verwendung einer For Each-Schleife. Hier ist ein Beispiel:

Dim tblMonat As ListObject
For Each tblMonat In Worksheets("DeinBlatt").ListObjects
    Select Case tblMonat.Name
        Case "tbl_Jan": ' Deine Code-Aktionen hier
        Case "tbl_Feb": ' Weitere Aktionen
        ' ...
    End Select
Next tblMonat

Diese Methode ist flexibler, da sie automatisch alle ListObjects durchläuft, ohne dass du sie einzeln benennen musst.


Praktische Beispiele

Hier ist ein praktisches Beispiel, um die Anzahl der Zeilen in jeder Tabelle zu zählen:

Dim tbl_MONAT As ListObject
Dim c As Integer

For c = 1 To 12
    Select Case c
        Case 1: Set tbl_MONAT = Worksheets("DeinBlatt").ListObjects("tbl_Jan")
        ' ... weitere Monate
    End Select

    MsgBox "Anzahl der Zeilen in " & tbl_MONAT.Name & ": " & tbl_MONAT.ListRows.Count
Next c

Dieses Beispiel zeigt dir, wie viele Zeilen in jeder Monatstabelle vorhanden sind.


Tipps für Profis

  • Verwende Option Explicit: Füge dies am Anfang deines Moduls hinzu, um sicherzustellen, dass alle Variablen deklariert sind. Das hilft, Fehler zu vermeiden.
  • Benutze Fehlerbehandlung: Implementiere On Error Resume Next und überprüfe, ob das ListObject existiert, bevor du darauf zugreifst.
  • Optimiere deine Schleifen: Wenn du viele ListObjects hast, kann es effizienter sein, mit einer For Each-Schleife zu arbeiten.

FAQ: Häufige Fragen

1. Warum funktioniert mein VBA-Code nicht, wenn ich auf ListObjects zugreife?

  • Überprüfe, ob der Name des ListObjects korrekt ist und ob du den richtigen Arbeitsblattnamen verwendest.

2. Was ist der Unterschied zwischen ListObjects("tbl_Jan") und ListObjects(tbl_MONAT)?

  • Der erste Ansatz verwendet den Namen als String, während der zweite Ansatz die Variable tbl_MONAT verwendet, die ein Objekt darstellt. Achte darauf, die richtige Syntax zu verwenden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige