SLSS SearchClass – Excelsuche leichtgemacht

Überlegungen und Vorgeschichte

Wie bei vielen anderen Menschen auch, gehört die Verwendung von Microsoft Excel bei mir zum Arbeitsalltag genauso dazu wie die morgentliche Tasse Kaffee oder das Online-Meeting via Microsoft Teams. Dabei bin ich in der Vergangenheit bei vielen meiner Listen an den Punkt gekommen, an welchem ich die aktuelle oder auch andere Exceldateien nach bestimmten Werten durchsuchen musste, oder dem Nutzer die Möglichkeit geben wollte dies zu tun. Jetzt bietet VBA* mit der Range.find Methode* schon eine recht gute Funktion zum Suchen nach bestimmten Werten an, doch musste ich hiermit entweder „das Grundgerüst“ für den Suchaufruf immer wieder neu schreiben und an die aktuelle Datei anpassen, oder den Code aus einer anderen Liste „recyclen“, wofür aber ebenfalls immer Anpassungen nötig waren.

Um mir diese Arbeit ein wenig zu erleichtern, kam mir die Idee eine Funktionsbibliothek oder Klasse zu programmieren, mit deren Hilfe ich die gewünschten Funktionen einfach in ein anderes Projekt, oder eine neue Liste importieren kann. Das Ergebnis ist die hier folgende SLSS SearchClass, in welcher ich initial erst einmal die für mich wichtigsten Funktionen umgesetzt habe.

Die folgenden Absätze geben einen tieferen Einblick in die Nutzungsmöglichkeiten und den Funktionsumfang der Klasse und sollten daher nicht als Schritt für Schritt Anleitung angesehen werden. Für die meisten Leute sollte sich die Anwendung der Klassenfunktionen eigentlich relativ leicht aus der im Downloadordner vorhanden Beispielsammlung (SLSS_SearchClass_X.X.X.X.xlsm) herauslesen lassen!   

KOMMENTAR DES AUTORS

 

Funktionsumfang

Die Klasse stellt verschiedene Suchmethoden zur Verfügung, mit deren Hilfe unterschiedliche Suchanfragen abgearbeitet werden können. Der Unterschied liegt hierbei in den zurückgelieferten Werten. Die Rückgabe ist ein Variant aus einzelnen Variants (Array), welche bis auf wenige Ausnahmen immer die folgenden Werte beinhalten:

 

Zusammensetzung des Rückgabewertes

  • Position [0]: Name der Arbeitsmappe in welchem das Objekt gefunden wurde.  
  • Position [1]: Name des Tabellenblattes in welchem das Objekt gefunden wurde
  • Position [2]: Die Zelladresse an welcher sich das gefundene Objekt befindet

Beispielaufbau eines Returns mit 3 Funden: [ [Mappe, Blatt, Fundadresse] , [Mappe, Blatt, Fundadresse] , [Mappe, Blatt, Fundadresse] ] 

 

Aktuell wurden folgende Rückgabefunktionen umgesetzt

  • Rückgabe des ersten Fundes innerhalb der aktuellen / einer ausgewählten Datei
  • Rückgabe aller Funde aus der aktuellen / einer ausgewählten Datei
  • Rückgabe einer abweichenden Position ausgehend von der aktuellen Fundstelle (Offset-Position)
  • Rückgabe des ersten Fundes innerhalb mehrerer ausgewählter Dateien
  • Rückgabe aller Funde aus mehreren ausgewählten Dateien
  • Rückgabe der Werte eines partiellen Zeilenbereiches / der kompletten Zeile des Fundes innerhalb der aktuellen / einer ausgewählten Datei*
  • Rückgabe der Werte eines partiellen Zeilenbereiches / der kompletten Zeile des Fundes aus mehreren ausgewählten Dateien*
  • Durchsuchen eines bestimmten Tabellenblattes
  • Durchsuchen aller vorhandenen Tabellenblätter
  • Farbiges Markieren der Fundstellen innerhalb eines Tabellenblattes / eines Bereiches innerhalb des Tabellenblattes 

* abweichender Rückgabetyp: [ [Wert1_Spalte1, Wert1_Spalte2, Wert1_Spalte3] , [Wert2_Spalte1, Wert2_Spalte2, Wert2_Spalte3] ]

Eine Sammlung an Beispielaufrufen zu den unterstützten Suchfunktionen befindet sich innerhalb der VBA-Module in der Datei SLSS_SearchClass_X.X.X.X.xlsm, welche Bestandteil des Download-Verzeichnisses ist. 

 

Klassendiagramm und Übersicht über die öffentlichen Klassenmethoden

Das Klassendiagramm und eine Übersicht über alle öffentlich verfügbaren Klassenmethoden habe ich in der folgenden Tabelle noch einmal zusammengestellt. Da die Liste an Funktionen und damit auch an verfügbaren Methoden mittlerweile recht lang ist, habe ich sie zur Verbesserung der Übersichtlichkeit minimiert. Für Interessierte kann die Liste durch Klicken auf den folgenden Banner angezeigt werden 

Zum Anzeigen der Methodentabelle bitte hier Klicken!

 

 

Einbinden der SLSS SearchClass in eine bestehende Exceldatei

Um die Suchklasse in ein bestehendes Exceldokument integrieren zu können, muss diese zuerst über den VBA-Editor, welchem man über den Menüpunkt „Entwicklertools“ und das Klicken der darin vorhandenen Schaltfläche „Visual Basic“ öffnen kann, eingebunden werden. Sollte der Menüpunkt „Entwicklertools“ nicht vorhanden sein, so muss dieser erst durch Anpassen des Menübandes sichtbar gemacht werden. Eine Schritt für Schritt Anleitung hierfür findet man unter „Wo finde ich in die VBA-IDE“ im Artikel Visual Basic for Applications*. 

In der VBA-IDE angelangt, öffnet man durch einen Rechtsklick auf das gewünschte VBAProject und die Auswahl des Menüpunktes „Datei importieren“ das Importfenster.

  

Screenshot der VBA-IDE mit dem Dropdown-Menü für das Importieren von Dateien

 

Im geöffneten Import-Auswahldialog navigiert man nun zum Ordner (Downloadverzeichnis), in welchem sich die heruntergeladene Klassendatei mit der Bezeichnung „SLSS_SearchClass.cls“ befindet. Diese wählt man anschließend aus und bestätigt den Import durch das Betätigen des Öffnen-Buttons.

 

Screenshot des Importfensters mit der angewählten Datei SLSS_SearchClass.cls

 

Nun sollte im Projekt-Explorer ein Unterordner mit der Bezeichnung „Klassenmodule“ vorhanden sein, in welchem sich die SLSS SearchClass befindet. Damit ist der Import der Klasse in ein bestehende Datei abgeschlossen.

Hinweis: Sollte es sich bei der aktuellen Excelliste um eine Datei ohne Makro-Funktionalität handeln (erkennbar an der Endung *.xlsx), so sollte diese jetzt als Datei mit Makros (*.xlsm) gespeichert werden. Dazu muss man im „Speichern unter“ Fenster den Dateityp auf  „Excel-Arbeitsmappe mit Makros (*.xlsm)“ umstellen und die Datei speichern.

 

Beispiel eines ersten Suchaufrufes

Nachdem die Klasse nun Bestandteil der Exceldatei ist, kann es mit dem ersten Suchaufruf weitergehen. Ich verwende für die erste Erklärung einfach das Minimalbeispiel, welches sich ebenfalls als Modul „G_minimalExample“ in der Beispielsammlung der Datei „SLSS_SearchClass_X.X.X.X.xlsm“ befindet.

 

Nur die erste Fundstelle auswerten

Innerhalb der Sub-Anweisung erfolgt als erstes das Initialisieren einer neuen Instanz der Suchklasse. Hierfür muss über die Anweisung Dim sClass As SLSS_SearchClass eine Variable vom Typ SLSS_SearchClass angelegt werden. Anschließend wird die Instanz mittels Set sClass = New SLSS_SearchClass erzeugt.

Nun kann man auf die Suchmethoden, welche durch die Klasse bereitgestellt werden, zugreifen. Im Beispiel wird das aktuelle Tabellenblatt dieser Arbeitsmappe durchsucht, weshalb die Methoden setWorkbook() und setSheet(), respektive setAllSheets() nicht explizit aufgerufen werden müssen. Durch das Ausführen der getFinding() Methode wird die Suche gestartet. Da diese Methode nur die erste Fundstelle zurückliefert und in diesem Beispiel nur das aktuelle Tabellenblatt durchsucht wird, kann die Variable auch bei erfolgreicher Suche nur maximal ein Element enthalten. Das Suchergebnis wird anschließend in der Variable finding als Array aus Arrays gespeichert, welcher anschließend durch Iteration über die einzelnen Werte durchlaufen werden kann. Dies macht bei einem Wert zwar wenig Sinn, doch auf Grund der Gleichheit mit den Rückgabewerten der anderen Methoden habe ich mich auch hier für den Array aus Arrays entschieden. Im Beispiel übergebe ich den Suchstring „gasse“ und führe eine Suche ohne Beachtung der Groß- und Kleinschreibung (zu erkennen am False) durch. Der komplette Aufruf sieht daher wie folgt aus finding = sClass.getFinding("gasse", False).

Nun folgt auch schon die Auswertung der Suchergebnisse. Als erstes sollte man überprüfen, ob überhaupt eine Übereinstimmung mit der Suchanfrage gefunden wurde. Ist dies nicht der Fall, so ist die Variable finding leer und der Versuch des Iterierens über einen leeren Array würde zur Ausgabe eines Fehlers führen. Aus diesem Grund prüfe ich zuerst mittels IsEmpty(finding) = False ob der Array Elemente enthält.

Befinden sich Elemente innerhalb von finding, so nutze ich im Beispiel eine „for Each“-Schleife um die einzelnen Funde zu durchlaufen. Diese gebe ich im gezeigten Beispiel lediglich in einer Messagebox aus. Es ist aber kein großes Problem die Werte auch in anderer Form zu verwenden. Auch hierfür habe ich in die Beispielsammlung einige Verwendungsmöglichkeiten integriert.

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Sub minimalExample_Single()
Dim sClass As SLSS_SearchClass
Set sClass = New SLSS_SearchClass
finding = sClass.getFinding("gasse", False) 'Aufruf von getFinding, weshalb nur die erste Übereinstimmung zurückgegeben wird
If IsEmpty(finding) = False Then
For Each element In finding
MsgBox "FIRST FOUND ONLY METHOD" & vbCrLf & _
"WBook: " & vbTab & element(0) & vbCrLf & _
"Sheet: " & vbTab & element(1) & vbCrLf & _
"Adress: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Address() & vbCrLf & _
"Value: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Value & vbCrLf
Next
Else
MsgBox "No findings with actual parameters!" & vbCrLf & vbCrLf & "Es wurde keine Übereinstimmung mit den eingegebenen Suchkriterien gefunden!"
End If
End Sub
Sub minimalExample_Single() Dim sClass As SLSS_SearchClass Set sClass = New SLSS_SearchClass finding = sClass.getFinding("gasse", False) 'Aufruf von getFinding, weshalb nur die erste Übereinstimmung zurückgegeben wird If IsEmpty(finding) = False Then For Each element In finding MsgBox "FIRST FOUND ONLY METHOD" & vbCrLf & _ "WBook: " & vbTab & element(0) & vbCrLf & _ "Sheet: " & vbTab & element(1) & vbCrLf & _ "Adress: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Address() & vbCrLf & _ "Value: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Value & vbCrLf Next Else MsgBox "No findings with actual parameters!" & vbCrLf & vbCrLf & "Es wurde keine Übereinstimmung mit den eingegebenen Suchkriterien gefunden!" End If End Sub
Sub minimalExample_Single()
Dim sClass As SLSS_SearchClass
    
    Set sClass = New SLSS_SearchClass
    finding = sClass.getFinding("gasse", False) 'Aufruf von getFinding, weshalb nur die erste Übereinstimmung zurückgegeben wird 
    
    If IsEmpty(finding) = False Then
    
        For Each element In finding
            MsgBox "FIRST FOUND ONLY METHOD" & vbCrLf & _
                   "WBook: " & vbTab & element(0) & vbCrLf & _
                   "Sheet: " & vbTab & element(1) & vbCrLf & _
                   "Adress: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Address() & vbCrLf & _
                   "Value: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Value & vbCrLf
        Next
    Else
        MsgBox "No findings with actual parameters!" & vbCrLf & vbCrLf & "Es wurde keine Übereinstimmung mit den eingegebenen Suchkriterien gefunden!"
    End If

End Sub

 

Alle Fundstellen auswerten

Möchte man nun nicht nur die erste, sondern alle potentiellen Übereinstimmungen auswerten, so ändert sich lediglich der Aufruf der Suchmethode. Anstatt der zuvor verwendeten getFinding() Methode nutzt man hierfür die getFindList() Methode, welche die gleichen Parameter erwartet. Diese liefert jedoch alle Fundstellen im aktuellen Tabellenblatt. 

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Sub minimalExample_Multiple()
Dim sClass As SLSS_SearchClass
Set sClass = New SLSS_SearchClass
finding = sClass.getFindList("gasse", False) 'Aufruf von getFindList, weshalb alle Übereinstimmungen zurückgegeben werden
If IsEmpty(finding) = False Then
For Each element In finding
MsgBox "MULTIPLE FINDING METHOD" & vbCrLf & _
"WBook: " & vbTab & element(0) & vbCrLf & _
"Sheet: " & vbTab & element(1) & vbCrLf & _
"Adress: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Address() & vbCrLf & _
"Value: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Value & vbCrLf
Next
Else
MsgBox "No findings with actual parameters!" & vbCrLf & vbCrLf & "Es wurde keine Übereinstimmung mit den eingegebenen Suchkriterien gefunden!"
End If
End Sub
Sub minimalExample_Multiple() Dim sClass As SLSS_SearchClass Set sClass = New SLSS_SearchClass finding = sClass.getFindList("gasse", False) 'Aufruf von getFindList, weshalb alle Übereinstimmungen zurückgegeben werden If IsEmpty(finding) = False Then For Each element In finding MsgBox "MULTIPLE FINDING METHOD" & vbCrLf & _ "WBook: " & vbTab & element(0) & vbCrLf & _ "Sheet: " & vbTab & element(1) & vbCrLf & _ "Adress: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Address() & vbCrLf & _ "Value: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Value & vbCrLf Next Else MsgBox "No findings with actual parameters!" & vbCrLf & vbCrLf & "Es wurde keine Übereinstimmung mit den eingegebenen Suchkriterien gefunden!" End If End Sub
Sub minimalExample_Multiple()
Dim sClass As SLSS_SearchClass
    
    Set sClass = New SLSS_SearchClass
    finding = sClass.getFindList("gasse", False) 'Aufruf von getFindList, weshalb alle Übereinstimmungen zurückgegeben werden 
    
    If IsEmpty(finding) = False Then
    
        For Each element In finding
            MsgBox "MULTIPLE FINDING METHOD" & vbCrLf & _
                   "WBook: " & vbTab & element(0) & vbCrLf & _
                   "Sheet: " & vbTab & element(1) & vbCrLf & _
                   "Adress: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Address() & vbCrLf & _
                   "Value: " & vbTab & Workbooks(element(0)).Sheets(element(1)).Range(element(2)).Value & vbCrLf
        Next
    Else
        MsgBox "No findings with actual parameters!" & vbCrLf & vbCrLf & "Es wurde keine Übereinstimmung mit den eingegebenen Suchkriterien gefunden!"
    End If

End Sub

 

Wichtig – doCleanUp() am Ende des Suchaufrufes

Da man mit der SLSS SearchClass auch andere Arbeitsmappen durchsuchen kann, diese dazu aber geöffnet werden müssen, wollte ich das anschließende Schließen dieser so einfach wie möglich gestalten. Aus diesem Grund habe ich keinen öffentlichen CloseWorkbook-Befehl, sondern die doCleanUp() Methode eingeführt. Diese schließt alle durch die Suche geöffneten Arbeitsmappen und stellt den Ausgangszustand wie eingangs der Suche wieder her. Durchsuchte Arbeitsmappen, welche vorab bereits geöffnet waren, bleiben hingegen geöffnet um evtl. Änderungen in diesen nicht zu verwerfen. 

Aus diesem Grund sollte die doCleanUp() Methode am Ende jeder durchgeführten Suche einmalig ausgeführt werden!   

 

Weitere Beispiele für die Nutzung der Suchklasse

Da die vorab gezeigten Standard-Suchaufrufe der SLSS SearchClass nur einen Teil des aktuellen Umfangs zeigen, möchte ich hier nochmal auf einige weitere Funktionen ein wenig näher eingehen, da diese vielleicht für den einen oder anderen nützlich sein könnten. Einige dieser Funktionen nutzen dabei den gleichen Aufbau wie die bereits gezeigten Code-Snippets der beiden Minimalbeispiele. Dies soll nochmals veranschaulichen, wie die Nutzung der Klassenfunktionen in vielleicht bereits bestehende Projekte eingebunden werden könnte.

   

Die Klassenfunktionen in einem Userform nutzen (durch Klicken ausklappen)

Die Suche direkt von einem Tabellenblatt aus steuern (durch Klicken ausklappen)

Fundstellen innerhalb eines Bereiches farblich markieren (durch Klicken ausklappen)

Die Rückgabe von teilweisen oder kompletten Datenreihen (durch Klicken ausklappen)

 

Screenshots SLSS SearchClass

 

 

Fazit

Die Funktionen der SLSS SearchClass habe ich nun schon in einige meiner privaten Excellisten eingebaut und bin mit dem Funktionsumfang soweit recht zufrieden. Einige Ideen, wie das angesprochene Speichern und Wiederherstellen der farblichen Ursprungsformatierung, habe ich zwar schon noch, doch benötige ich diese nicht allzu dringend. Nun bin ich gespannt, ob die Suchklasse genauso „beliebt“ sein wird wie mein Basti-Kalender*, welcher wissentlich auch anderen Nutzern schon gute Dienste geleistet hat.

Falls es noch Fragen oder Anregungen zur Suchklasse geben sollte, so können diese wie immer gern unten in die Kommentare oder per Mail an info@langer-sebastian.de gesendet werden!  

 

Download SLSS SearchClass

Für meine Freunde und alle Interessierten biete ich hier die SLSS SearchClass zum Download an. Da es mit den *.ZIP Dateien evtl. zu Problemen beim Download kommen kann (ZIP-Archive werden in einigen Web-Browsern als potentielle Bedrohung erkannt und der Download blockiert), stelle ich die Datei sowohl als *.ZIP, als auch als *.7z zur Verfügung. Für die letztere Datei benötigt man das kostenlose Kompressionsprogramm 7-Zip* was hier* heruntergeladen werden kann. (https://www.7-zip.de/).  

 

Download “SLSS SearchClass (Zip-Archiv)”

SLSS_SearchClass-1.0.0.0.zip – 39-mal heruntergeladen – 289,55 kB

Download “SLSS SearchClass (7-Zip-Archiv)”

SLSS_SearchClass-1.0.0.0.7z – 10-mal heruntergeladen – 254,01 kB

 

Debugging:

Trotz größter Sorgfalt und mehrfachem Testen kommt es immer wieder vor, dass sich in Software Bugs oder Fehler einschleichen, welche beim Erstellen übersehen, oder einfach nicht gefunden werden. Wenn jemand so einen Fehler finden sollte, oder sonstige Anregungen, Ideen oder Verbesserungen zum Programm hat, dann wäre es schön wenn dies einfach im Kommentarbereich kommuniziert wird. So kann ich die Änderungen in das nächste Versions-Update einfach mit einfließen lassen. 

 

Haftungsausschluss:

Die hier veröffentlichte Software wurde auf mehreren Systemen fehlerfrei getestet. Dennoch kann für evtl. Beschädigungen, Instabilitäten oder sonstige Beeinträchtigungen, welche unmittelbar durch die Installation, Nutzung, oder in sonstiger Weise in Zusammenhang stehend mit der hier zum Download angebotenen Software auftreten keinerlei Haftung übernommen werden. Der Download, die Installation und Nutzung geschehen auf eigenes Risiko! Bei Problemen wenden sie sich bitte an info@langer-sebastian.de!

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert