Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Mehrere Tabellenblätter ansprechen

Mehrere Tabellenblätter ansprechen
31.01.2018 00:25:45
Kulo
Hallo Zusammen,
ich bastle mir gerade eine Tabelle zusammen und bin schon wieder an meine Grenzen gestoßen.
Mein Markro sucht aus einem Tabellenblatt einige Felder aus und trägt sie in ein anderes Tabellenblatt als Liste ein. Das klappt auch sehr gut.
Jetzt möchte ich jedoch das Makro so erweitern, dass es in allen relevanten Tabellenblättern sucht. Das könnten bis an die 80 werden.
Alle relevanten Tabellenblätter haben den gleichen Aufbau. Der Name des Tabellenblattes ist immer eine vierstellige Zahl.
Wenn ich eine Schleife von 1000 bis 9999 laufen lasse, dauert mir das zu lang.
Mit dem Blattindex möchte ich nicht arbeiten, weil ich weitere Tabellen hinzufügen möchte.
Eine Liste aller angefertigten Tabellenblätter befindet sich ebenfalls auf einem Tabellenblatt in der Arbeitsmappe. Kann man da was ableiten, mit einem Array vielleicht?
Ich würde mich freuen, wenn mir jemand auf die Sprünge helfen könnte.
Hier mein Code:
Sub Seriendruck()
Dim last As Integer
Application.ScreenUpdating = False
For i = 2 To Worksheets("3036").Cells(3, Columns.Count).End(xlToLeft).Column - 1 Step 2
If Worksheets("3036").Cells(Range("GZ").Row + 2, i).Value > 0 Then
last = Worksheets("ListeDB").Cells(Rows.Count, 1).End(xlUp).Row + 1
With Worksheets("ListeDB")
.Cells(last, 1) = Worksheets("3036").Range("Name").Value
.Cells(last, 2) = DateSerial(Worksheets("3036").Range("Jahr").Value, 1, 1)
.Cells(last, 3) = DateSerial(Worksheets("3036").Range("Jahr").Value, 12, 31)
.Cells(last, 4) = Worksheets("3036").Cells(Range("Land").Row, i).Value
.Cells(last, 5) = Worksheets("3036").Cells(Range("GZ").Row, i + 1).Value
.Cells(last, 6) = Worksheets("3036").Cells(Range("GZ").Row, i).Value
.Cells(last, 7) = Worksheets("3036").Cells(Range("GZ").Row + 2, i).Value
End With
End If
Next
Worksheets("3036").Activate
Application.ScreenUpdating = True
End Sub
Und kann man in der With-Anweisung was machen? Das sieht ja echt schlimm aus.
Ich freue mich auf eure Tipps und vielen Dank im Voraus.
Viele Grüße
Kulo
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mehrere Tabellenblätter ansprechen
31.01.2018 08:16:49
Sepp
Hallo Kulo,
Sub Seriendruck()
Dim objSH As Worksheet
Dim lngLast As Integer, lngIndex As Long

On Error GoTo ErrorHandler

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  .Calculation = xlCalculationManual
End With

For Each objSH In ThisWorkbook.Worksheets
  If objSH.Name Like "####" Then
    For lngIndex = 2 To objSH.Cells(3, Columns.Count).End(xlToLeft).Column - 1 Step 2
      If objSH.Cells(Range("GZ").Row + 2, lngIndex).Value > 0 Then
        lngLast = Worksheets("ListeDB").Cells(Rows.Count, 1).End(xlUp).Row + 1
        With Worksheets("ListeDB")
          .Cells(lngLast, 1) = objSH.Range("Name").Value
          .Cells(lngLast, 2) = DateSerial(objSH.Range("Jahr").Value, 1, 1)
          .Cells(lngLast, 3) = DateSerial(objSH.Range("Jahr").Value, 12, 31)
          .Cells(lngLast, 4) = objSH.Cells(Range("Land").Row, lngIndex).Value
          .Cells(lngLast, 5) = objSH.Cells(Range("GZ").Row, lngIndex + 1).Value
          .Cells(lngLast, 6) = objSH.Cells(Range("GZ").Row, lngIndex).Value
          .Cells(lngLast, 7) = objSH.Cells(Range("GZ").Row + 2, lngIndex).Value
        End With
      End If
    Next
  End If
Next

ErrorHandler:

If Err.Number <> 0 Then
  MsgBox "Fehler in Modul1" & vbLf & vbLf & "Prozedur:" & vbTab & "Seriendruck" & vbLf & _
    "Nummer:" & vbTab & Err.Number & vbLf & "Meldung:" & vbTab & Err.Description & vbLf & _
    IIf(Erl, "Zeile:" & vbTab & Erl, ""), vbExclamation, "Fehler!"
  Err.Clear
End If

With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .Calculation = xlCalculationAutomatic
End With

End Sub

Gruß Sepp

Anzeige
Problem gelöst, Nachfrage
31.01.2018 08:56:49
Kulo
Hallo Sepp, guten Morgen,
vielen vielen Dank.
Heute früh bei der ersten Tasse Kaffe kam mir das mit dem "For Each" und "like" auch in den Sinn. Hätte aber wahrscheinlich rumprobieren müssen, ehe es laufen würde. Das mit dem "like" habe ich erst vor kurzem gelesen und noch nie ausprobiert.
Jetzt hab ich wieder was gelernt.
Leider verstehe ich nicht so recht, warum es besser ist, EnableEvents auf False zu setzen und Calculation auf manuell. Was bewirkt dieses? Welche Konsequenzen hat es, wenn man das wegläßt.
Ich würde mich sehr freuen, wenn Du nochmal kurz auf diese Sache eingehen könntest.
Vielen Dank nochmal und
viele Grüße
Kulo
Und wie machst Du Deinen Code bunt?
Anzeige
AW: Problem gelöst, Nachfrage
31.01.2018 09:10:36
Sepp
Hallo Kulo,
in Arbeitsmappen befinden sich ja meist irgendwo Formeln, und wenn durch den Code Zellen beschrieben werden, auf die eine solche Formel Bezug nimmt, wird bei jeder Änderung eine Neuberechnung ausgeführt. Bei manchen Funktionen (z.B. INDIREKT() oder JETZT()), braucht wird immer neu Berechnet, auch wenn keine geänderte Zelle direkt betroffen ist. Das kann einen Code ziemlich ausbremsen.
Deshalb die Berechnung auf manuell stellen und am Ende wieder auf automatisch.
Das selbe gilt für .EnableEvents. Viele Tabellen enthalten Code der auf Änderungen reagiert, diese würden nun bei jedem Durchlauf evtl. mehrfach ausgelöst.
Also liebe zu Begin ausschalten und am Ende wieder aktivieren, schadet nicht wenn es umsonst ist, bringt aber viel wenn solcher Code vorhanden ist.
Gruß Sepp

Anzeige
AW: Problem gelöst, Nachfrage
31.01.2018 18:07:24
Kulo
Hallo Sepp,
vielen Dank für Deine Erklärung.
Jetzt kann ich das Ganze nachvollziehen.
Du hast mir wirklich sehr geholfen.
Viele Grüße und bis zum nächsten Mal, wenn ich darf. ;-)
Kulo
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Mehrere Tabellenblätter in Excel VBA ansprechen


Schritt-für-Schritt-Anleitung

Um in Excel VBA mehrere Tabellenblätter anzusprechen, kannst du eine Schleife verwenden, die durch alle Arbeitsblätter in der Arbeitsmappe iteriert. Hier ist ein einfaches Beispiel, das zeigt, wie du alle relevanten Tabellenblätter ansprechen kannst:

Sub Seriendruck()
    Dim objSH As Worksheet
    Dim lngLast As Long, lngIndex As Long

    On Error GoTo ErrorHandler

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With

    For Each objSH In ThisWorkbook.Worksheets
        If objSH.Name Like "####" Then 'Überprüfen, ob der Blattname eine vierstellige Zahl ist
            For lngIndex = 2 To objSH.Cells(3, Columns.Count).End(xlToLeft).Column - 1 Step 2
                If objSH.Cells(Range("GZ").Row + 2, lngIndex).Value > 0 Then
                    lngLast = Worksheets("ListeDB").Cells(Rows.Count, 1).End(xlUp).Row + 1
                    With Worksheets("ListeDB")
                        .Cells(lngLast, 1) = objSH.Range("Name").Value
                        .Cells(lngLast, 2) = DateSerial(objSH.Range("Jahr").Value, 1, 1)
                        .Cells(lngLast, 3) = DateSerial(objSH.Range("Jahr").Value, 12, 31)
                        .Cells(lngLast, 4) = objSH.Cells(Range("Land").Row, lngIndex).Value
                        .Cells(lngLast, 5) = objSH.Cells(Range("GZ").Row, lngIndex + 1).Value
                        .Cells(lngLast, 6) = objSH.Cells(Range("GZ").Row, lngIndex).Value
                        .Cells(lngLast, 7) = objSH.Cells(Range("GZ").Row + 2, lngIndex).Value
                    End With
                End If
            Next lngIndex
        End If
    Next objSH

ErrorHandler:
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
End Sub

In diesem Code wird die Schleife For Each verwendet, um jedes Tabellenblatt in der Arbeitsmappe anzusprechen. Der Like-Operator stellt sicher, dass nur Tabellenblätter mit vierstelligen Zahlen bearbeitet werden.


Häufige Fehler und Lösungen

  1. Fehler beim Zugriff auf das Tabellenblatt

    • Lösung: Stelle sicher, dass der Name des Tabellenblattes korrekt ist und dass es existiert. Wenn du objSH.Name verwendest, überprüfe, ob der Name dem erwarteten Format entspricht.
  2. Leere Zellen verursachen einen Fehler

    • Lösung: Überprüfe, ob die Zellen, auf die du zugreifst, leer sind, bevor du versuchst, deren Werte zu verwenden.
  3. Makro läuft zu lange

    • Lösung: Schalte ScreenUpdating und EnableEvents aus, um die Leistung zu verbessern, während das Makro läuft.

Alternative Methoden

Eine andere Möglichkeit, mit mehreren Tabellenblättern zu arbeiten, ist die Verwendung von Arrays, um die Namen der relevanten Blätter zu speichern. Du kannst dann eine Schleife durch das Array machen, anstatt alle Blätter in der Arbeitsmappe zu durchlaufen.

Dim arrSheets As Variant
arrSheets = Array("3036", "3037", "3038") 'Füge hier die relevanten Tabellennamen hinzu

For i = LBound(arrSheets) To UBound(arrSheets)
    Set objSH = Worksheets(arrSheets(i))
    'Verwende objSH, um auf das aktuelle Blatt zuzugreifen
Next i

Diese Methode ist nützlich, wenn du die Blätter im Voraus kennst.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie du mehrere Tabellenblätter ansprechen kannst, um spezifische Daten zu extrahieren:

  • Daten aus mehreren Blättern in eine Liste zusammenfassen: Wenn du Daten aus mehreren Tabellenblättern in einer Liste zusammenfassen möchtest, kannst du die oben dargestellte Seriendruck-Subroutine verwenden.

  • Summe von Werten in mehreren Tabellenblättern berechnen: Du kannst auch eine Schleife verwenden, um eine Summe von bestimmten Zellen in allen relevanten Tabellenblättern zu berechnen.

Dim totalSum As Double
totalSum = 0

For Each objSH In ThisWorkbook.Worksheets
    If objSH.Name Like "####" Then
        totalSum = totalSum + objSH.Range("A1").Value 'Summe von A1 in jedem Blatt
    End If
Next objSH

MsgBox "Die Gesamtsumme ist: " & totalSum

Tipps für Profis

  • Verwende With-Anweisungen: Um deinen Code sauberer und effizienter zu gestalten, nutze With, wenn du mehrfach auf dasselbe Objekt zugreifst.

  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung, um zu verhindern, dass dein Makro bei einem Fehler abbricht. Dies kannst du mit On Error GoTo erreichen.

  • Vermeide unnötige Berechnungen: Stelle sicher, dass du Calculation und EnableEvents nur dann auf manuell oder false setzt, wenn es notwendig ist.


FAQ: Häufige Fragen

1. Wie kann ich mehrere Tabellenblätter ansprechen, die nicht nach Namen sortiert sind? Du kannst die For Each-Schleife verwenden, um alle Blätter zu durchlaufen und mit dem Like-Operator nur die relevanten auszuwählen.

2. Was bewirken Application.ScreenUpdating und Application.EnableEvents? Diese beiden Einstellungen helfen, die Leistung deines Makros zu verbessern, indem sie Bildschirmaktualisierungen und Ereignisse während der Ausführung des Codes deaktivieren. Dies ist besonders nützlich, wenn viele Zellen bearbeitet werden.

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