Loop durch Tabellenblätter mit Sheets.Index (VBA)

Angeknüpft an den letzten Beitrag zu dynamischen Formeln über mehrere Tabellenblätter, behandelt dieser Beitrag die Thematik, wie mittels einer VBA-Schleife (Loop) durch mehrere Tabellenblätter navigiert werden kann, ohne dass der Code jeweils anzupassen ist. [Eine Einführung zum hier angewandten "For"-Loop - einer VBA-Schleife - findest Du in diesem Beitrag.] Ziel ist es also, weitere Tabellenblätter einfügen zu können, ohne auf diese spezifisch im Code verweisen zu müssen.

Unser Beispielunternehmen weist Zahlen für die jeweiligen Regionen und Unternehmenseinheiten aus. Unten ist ein Beispiel dargestellt, bei dem unterschiedliche Kantone ("Basel", "Bern" und "Zürich") vorhanden sind. Zudem werden die Daten auf Konzernebene aggregiert (Tabellenblatt "Total"):

SheetIndexSheetsA

Wir gehen davon aus, dass jede einzelne Region die gleiche Struktur aufweist und wir demnach denselben Makro-Code auf alle Tabellenblätter anwenden können - ein perfekter Anwendungsfall also für einen Loop! In einem ersten Schritt sollten die notwendigen Befehle für ein einzelnes Tabellenblatt aufgezeichnet, geschrieben und getestet werden. Auf jedem Blatt sollen beispielsweise Spalten ausgeblendet sowie Formatierungen vorgenommen werden. Es bieten sich nun unterschiedliche Schleifen an, die sich über alle gewünschten Tabellenblätter erstrecken. In unserem Fall soll der Loop jedoch dynamisch sein, damit wir jederzeit neue Regionen einfügen können. Verweisen wir im Code demnach explizit auf die aktuell erste Region "Basel", hat dies später allenfalls keine Gültigkeit mehr (Beispiel: Wenn wir "Aargau" einfügen, rückt dieser Kanton an erste Stelle). Im anfangs verlinkten Beitrag zu dynamischen Formeln über mehrere Tabellenblätter haben wir Hilfstabellenblätter eingefügt ("Kanton_AA" und "Kanton_ZZ") und diese am Ende ausgeblendet:

SheetIndexSheetsZ

Durch diesen Mechanismus kann nun ein "For"-Loop angewandt werden. Unser Makro ermittelt den "Sheet.Index" dieser Hilfsblätter; das heisst, an welcher Stelle in der Datei diese Tabellenblätter stehen. Wir definieren hier einerseits die Variablen des Typs "Integer" (vereinfacht: Zahlen) im Makro:

Dim SheetIndexStart As Integer
Dim SheetIndexEnd As Integer

Danach kann der Indexwert dieser beiden Tabellenblätter ermittelt werden:

SheetIndexStart = Sheets("Kanton_AA").Index
SheetIndexEnd = Sheets("Kanton_ZZ").Index

In unserem Beispiel wird für "Kanton_AA" der Wert "2" als Variable abgespeichert, für "Kanton_ZZ" ist dies der Wert "6". Nun kann der "For"-Loop eingesetzt werden, der den Code mit den Befehlen für die Tabellenblätter umfasst:

For x = SheetIndexStart + 1 To SheetIndexEnd - 1
Sheets(x).Activate
'Befehle zur Bearbeitung der Tabellenblätter
Next

Da wir die Hilfsblätter nicht zwingend bearbeiten müssen, kannst Du entweder direkt bei der Definition der Variablen "+1" addieren respektive "-1" subtrahieren, oder wie im Code oben beim Beginn des "For"-Loop die Index-Zahl um eins erhöhen und reduzieren. Mit "Sheets(x).Activate" wird dann in jedem Durchlauf der Schleife jeweils das entsprechende Tabellenblatt aktiviert und bearbeitet. Beachte, dass Du die Hilfstabellenblätter "Kanton_AA" und "Kanton_ZZ" allenfalls zuerst durch das Makro einblenden musst. Füge hier zu Beginn Deines Makros einfach ein:

Sheets("Kanton_AA").Visible = True
Sheets("Kanton_ZZ").Visible = True

... und am Ende dasselbe, mit dem Boolean-Wert "False", damit die Blätter direkt wieder ausgeblendet sind.

Fügst Du nun eine neue Region (z.B. "Genf" oder "Aargau") ein, wird das Makro dank der Ermittlung des "Index-Wertes" auch diese Tabellenblätter in der Loop-Bearbeitung berücksichtigen können. Entsprechend reagiert die Selektion, falls Du weitere Tabellenblätter weiter vorne in der Datei einfügst (beispielsweise eine weitere Auswertung neben dem "Total") oder die Kantone mitsamt den beiden Hilfsblätter an eine andere Stelle innerhalb der Datei verschiebst.

Häufigster Wert eines Bereichs ausgeben (auch Text)

Mit den Formeln Anzahl oder Zählenwenn können bestimmte Werte gezählt werden. Doch was, wenn unzählige verschiedene Werte in einem Bereich aufgeführt sind und wir nur den häufigsten davon auslesen wollen? Nachfolgend sind unsere Daten, aus welchen wir den häufigsten Wert auslesen möchten (die Farben hatte ich vorgängig mit bedingten Formatierungen erstellt):

datenhaeufigsterwert

Nebenan möchten wir nun ermitteln, welches denn der häufigste Wert ist. Aufgrund der Farben - und da die Liste nur 11 Angaben umfasst - könnten wir auch von Auge ermitteln, dass es "Wert2" ist. Dennoch: Wir möchten dies mit einer Formel ermitteln. Diese lautet:

{=INDEX(A1:A11;VERGLEICH(MAX(ZÄHLENWENN(A1:A11;A1:A11));ZÄHLENWENN(A1:A11;A1:A11);0))}

Die geschweifte Klammer ist nicht selbst einzugeben - es handelt sich um eine Matrixformel! Schliesse die Formel mit CTRL + SHIFT + ENTER ab, um die Matrixformel zu bestätigen.

Das Resultat: Wert2 ist am häufigsten im Bereich "A1:A11". Sobald Du die Werte änderst (bspw. mehr "Wert3" im Bereich aufführst), zeigt Dir die Formel sofort den neuen Wert an.

SVERWEIS nach links

Mit der Formel "SVERWEIS" wird ja bekanntlich die erste Spalte Deiner Matrix nach Deinem Suchkriterium durchsucht. Sobald ein Treffer gefunden wurde, wird der Wert aus derjenigen Spalte laut Deines "Spaltenindex" ausgegeben. Schauen wir uns hierzu ein konkretes Beispiel an:

SVERWEIS1

Suchen wir also nach "Eisbär" und verwenden als Spaltenindex die 2, wird "Arktis" als Ergebnis unserer Formel angegeben. Die Formel "SVERWEIS" verläuft also stets nach rechts. In diesem Beitrag möchten wir jedoch eine Möglichkeit anschauen, wie wir beispielsweise nach "Arktis" suchen können und dann "Eisbär" als Resultat erhalten - also einen "SVERWEIS nach links"!

Folgendes können wir im Vornherein definieren: Unsere Suchspalte ist in diesem Fall B, die Ergebnisspalte ist A. Unser Suchbegriff lautet "Arktis". Wir verwenden nun jedoch nicht die Formel "SVERWEIS" (Einen negativen Spaltenindex wie beispielsweise -1 wird leider nicht toleriert.) sondern die flexiblere Version "=INDEX". Anders als bei der herkömmlichen Formel müssen wir zuerst die Ergebnisspalte definieren - "A:A". Für die Ermittlung der korrekten Zeile verwenden wir "VERGLEICH("Arktis";B:B;0)". Zusammengesetzt und vollständig lautet die Formel demnach:

=INDEX(A:A;VERGLEICH("Arktis";B:B;0))

... und das Resultat: "Eisbär"! Mittels diesen beiden Formeln kannst Du also auch eine Suche nach links durchführen.

Hattest Du schon einmal nach dieser Methode gesucht oder gar Deine Tabelle umgestellt, damit Du nach wie vor den "SVERWEIS" anwenden konntest? Fragen oder Anregungen kannst Du wie immer sehr gerne in die Kommentare schreiben.