Die Excel Wühlkiste

Suche über mehrere Tabellenblätter

Hier ein Makro, welches die Suche über mehrere bis alle Tabellenbätter einer Arbeitsmappe gestattet. Ausserdem hat dieses Makro den Vorteil, wirklich zu funktionieren.
In diesem Programmcode steht die Schleifenvariable für die Anzahl der Tabellenblätter auf " Worksheets.Count - 1". Das ist deshalb so, weil in meiner Anwendung das letzte Arbeitsblatt ausgeschlossen werden soll. Müssen hingegen alle Blätter durchsucht werden, kann "-1" weggenommen werden.
Dieses Makro sucht den Begriff in dieser neuen Version im Weitersuchen-Modus (siehe die farblich hervorgehobenen "Goto"-Sprungadressen.
Ich weiss: "Goto" ist nicht gerade ein vorbildlicher Programmierstiel, trotzdem habe ich mich dazu entschlossen, weil der hier vorgestellte Code nun wirklich nicht derart lang ist, als dass ihn die Sprungadressierung unübersichtlich und unverständlich machen würde. Ausserdem erscheint in der Makroliste (ALT+F8) dann nur ein einziges Makro, während bei der Programmierung mit Subroutinen hier mehrere Makros aufgelistet würden. Das kann unter Umständen zur Verwirrung führen, wenn man das Programm nicht gerade als Add-In einbinden möchte.
Wenn die "Weitersuchen- Funktion nicht gewünscht wird, muss der Code angepasst werden, indem man die "Weitersuchen"-Zeilen auskommentiert und stattdessen die Kommentierung der "Exit Sub"-Zeilen aufhebt.
Dadurch, dass die Variable " strSuch" als public deklariert wird, steht der in ihr gespeicherte Suchbegriff auch beim nächsten Aufruf des Makros zur Verfügung und der Inhalt wird direkt in das Eingabefenster für den Suchbegriff eingefügt bzw. vorgeschlagen.
Wurde nichts gefunden, kommt am Ende die Erfolglos-Meldung und die Stelle vor der Ausführung des Makros wird im Workbook selektiert. Wird kein Suchbegriff eingegeben, wird das Makro abgebrochen.

 

Versionsinformation:
Im Unterschied zur Vorgängerversion sucht dieses Makro nun ab der auf die aktive Zelle folgende Zelle. Dadurch wird erreicht, dass auch ein auf einer Seite mehrfach vorhandener Suchbegriff sicher gefunden wird.
Erst wenn auf einer Seite zum letzten mal der Suchbegriff gefunden wurde, wird zur nächsten Seite gewechselt und immer wenn der Begriff nicht gefunden wurde, wird auch die nächste Seite aufgerufen.
Im allerletzten Schleifendurchlauf wird noch einmal die Startseite durchsucht. Denn abhängig von der Position der aktiven Zelle wird auf dem Start-Suchblatt ja nur der Rest der Zellen ab der Startzelle durchsucht. Darum muss am Ende ja auch noch der Teil vor der Startzelle durchsucht werden.
Der Grund für diese Vorgehen ist einfach:
Würde man auf dem Startblatt ab Zelle 1 die Suche beginnen, so würde bei jedem Weitersuchen-Durchlauf immer nur die erste Zelle, die den Suchbegriff enthält, gefunden werden -wir kämen nie von der Stelle.
Es gab bei der Entwicklung auch noch einige andere Probleme, die abhängig von der Anzahl der Fundstellen auf einem Blatt, der relativen Position der ersten Fundseite zur Startseite usw., unterschiedlich in Erscheinung traten. All diese Fehler sind in der hier vorliegenden Version beseitigt.

Option Explicit
Public strSuch As String

Sub Suchen_alle_Tabellen()
' Autor: Hubert Scheidgen
' Version: 2.0
' Versionsdatum: 18.06.2004

Dim I As Integer
Dim rng As Range 'das ist der Suchbereich auf jeder Seite
Dim strAddress As String, strFind As String
Dim Anfang As Range
Dim Anfangsblatt As Worksheet
Dim B, X, Y As Integer

If Application.Intersect(ActiveCell, Range("A1:G80")) Is Nothing And _
Application.ActiveSheet.Index <> Application.Worksheets.Count Then
MsgBox "Markierung nicht innerhalb" & Chr(13) & "des Datenbereiches!", False, Application.UserName
Exit Sub
End If

Weitersuchen:
Set Anfangsblatt = Application.ActiveSheet
Set Anfang = ActiveCell
B = Anfangsblatt.Index
X = ActiveCell.Row
Y = ActiveCell.Column

Application.ScreenUpdating = False

' die Position der InpuBox wurde hier auf einen 17-Zöller, rechts oben, angepasst:
strFind = InputBox("Bitte Suchbegriff eingeben:", Application.UserName, strSuch, 10000, 0)
If strFind = "" Then Exit Sub
strSuch = strFind

For I = B To Application.Worksheets.Count - 1
Worksheets(I).Select

If I = B Then
Set rng = Range("A1:G80").Find(strFind, ActiveCell, lookat:=xlPart, LookIn:=xlFormulas)
Else
Set rng = Range("A1:G80").Find(strFind, lookat:=xlPart, LookIn:=xlFormulas)
End If

If Not rng Is Nothing Then
If rng.Row <= X And rng.Column <= Y Then
X = 0
Y = 0
GoTo Weiter
End If

strAddress = rng.Address
X = rng.Row
Y = rng.Column
Application.Goto rng, Scroll:=False
Application.ScreenUpdating = True
'Exit Sub
GoTo Weitersuchen
End If

Weiter:
X = 0
Y = 0

Next I

For I = 1 To B
If I = Application.Worksheets.Count Then
Exit For
End If

Worksheets(I).Select
Set rng = Range("A1:G80").Find(strFind, lookat:=xlPart, LookIn:=xlFormulas)
If Not rng Is Nothing Then
strAddress = rng.Address
Application.Goto rng, Scroll:=False
Application.ScreenUpdating = True
'Exit Sub
GoTo Weitersuchen
End If
Next I

Anfangsblatt.Activate
Anfang.Select
MsgBox "Keine Fundstellen!", False, Application.UserName
Application.ScreenUpdating = True

End Sub
Die Excel Wühlkiste
Valid HTML 4.01 Strict
letzte Aktualisierung: 13.02.2009
Autor: Hubert Scheidgen / 04.02.2009
W3C CSS-Validierungsservice