yan2021
Goto Top

Suchfunktion in Excel per VBA-Code

Hallo,

ich habe eine Excel-Liste mit mehr als 200 Einträgen, die immer erweitert wird.
Daher habe ich eine Suchfunktion integriert über VBA-Code.

Dabei kann ich nach der eigentlichen Suche das Suchergebnis auf Knopfdruck filtern und per weiterem Knopfdruck den Filter wieder zurücksetzen. Das funktioniert prima.

Aber...
Wenn es bei einem gefundenen Suchbegriff darunter noch mehrere Zeilen gibt, die zum Suchbegriff dazugehören, wird bei der Filterung nur die Zeile angezeigt, die den Suchbegriff enthält.

Zur Verdeutlichung habe ich hier mal testweise eine Beispieldatei erstellt:

test liste

Suche ich z.B. nach "Google", wird mir die entsprechende Zeile angezeigt... alles prima.
Suche ich jedoch nach "Fotodatenbanken", wird mir nur die im Screenshot sichtbare Zeile 7 angezeigt nach der Filterung des Suchergebnisses.
Es sollen jedoch die dazugehörigen Zeilen 8 - 10 auch im Suchergebnis angezeigt werden.

Hier mal der VBA-Code, mit dem ich das Suchergebnis filtere und danach auch wieder löschen kann:
Diese beiden Makros sind in meiner Excel-Datei mit einer eingefügten Schaltfläche verbunden.
Sub Filtern()
'  
' gefundene Suchergebnisse nach Farben filtern  
'  
    Rows("2:2").Select  
    Selection.AutoFilter
    ActiveSheet.Range("A:A").AutoFilter Field:=1, Criteria1:=RGB(255, _  
        192, 0), Operator:=xlFilterCellColor

End Sub
--------------------------------------------------------------------------
Sub Suchfilter_löschen()
'  
' Suchfilter_löschen Makro  
'  
    ActiveSheet.Range("A:A").AutoFilter Field:=1  
    Selection.AutoFilter
    Range("H2").Select  
    Selection.ClearContents
    Range("A1:F1").Select  

End Sub

Gibt es eine Möglichkeit, irgendwie zugehörende Zeilen kenntlich zu machen oder sie irgendwie so zu formatieren, dass sie als zugehörig erkannt werden können?
Vielleicht sogar über die Möglichkeit, für die einzelnen Bereiche einfach einen Bereichs-Namen zu vergeben und dann nach diesen Namen suchen zu lassen...

Danke und Grüße von
Yan face-wink

Content-Key: 1747117050

Url: https://administrator.de/contentid/1747117050

Printed on: April 25, 2024 at 09:04 o'clock

Member: colinardo
Solution colinardo Jan 21, 2022 updated at 15:53:59 (UTC)
Goto Top
Servus Yan.

Also, als erstes hoffe ich ja nicht das du wirklich deine Passwörter mit Excel verwalten willst, da würden mir ehrlich gesagt die Haare zu berge stehen face-confused. Das nur so nebenbei ... für sowas sind geeignete Passwortmanager mit Datenbanken die geeignetere Wahl.

Der AutoFilter ist ja im Hintergrund auch nicht viel mehr als als ein Ausblenden von Zeilen, das kannst du auch nachbauen und hast damit alle Möglichkeiten offen.
Hier mal etwas Code an diesen Aufbau angepasst

screenshot


Option Compare Text ' ermöglicht den "Like" Operator beim Vergleich  

Sub FilterList()
    'Variablen  
    Dim rngCurrent As Range, rngHide As Range, found As Boolean
    With ActiveSheet
        .UsedRange.EntireRow.Hidden = False
        ' Wenn Suchbegriff leer blende alle Zeilen wieder ein und beende Prozedur  
        If .Range("E1").Value = "" Then  
            Exit Sub
        End If
        ' Startbereich festlegen  
        Set rngCurrent = .Range("A2")  
        ' so lange verarbeiten bis Bereich am Ende angelangt ist  
        While rngCurrent.Address <> .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Address  
            ' Wenn der Suchbegriff gefunden wurde  
            If rngCurrent.Value Like .Range("E1").Value Then  
                found = True
                ' prüfe ob für den Bereich Untereinträge existieren  
                If rngCurrent.Offset(1, 0).Value <> "" Then  
                    ' verschiebe Zeile über den aktuellen Bereich hinaus damit er nicht ausgeblendet wird  
                    Set rngCurrent = rngCurrent.End(xlDown).Offset(1, 0)
                Else
                    ' keine Untereinträge  
                    Set rngCurrent = rngCurrent.Offset(1, 0)
                End If
            Else
                ' Suchbegriff in der Zeile nicht enthalten, kombiniere den Bereich in einer Variablen um sie später auszublenden  
                If Not rngHide Is Nothing Then
                    Set rngHide = Union(rngHide, rngCurrent.EntireRow)
                Else
                    Set rngHide = rngCurrent.EntireRow
                End If
                Set rngCurrent = rngCurrent.Offset(1, 0)
            End If
        Wend
        ' Wenn der Suchbegriff gefunden wurde  
        If found Then
            ' blende die nicht zutreffenden Zellen aus  
            If Not rngHide Is Nothing Then rngHide.EntireRow.Hidden = True
        Else
            MsgBox "Kein Eintrag gefunden.", vbExclamation  
        End If
    End With
End Sub

Grüße Uwe
Member: Yan2021
Yan2021 Jan 24, 2022 at 07:36:04 (UTC)
Goto Top
Hallo Uwe und danke für Deine Mühe... find ich super klasse face-wink

Es geht tatsächlich um Kennwörter und ich habe schon verschiedene DB-Lösungen getestet (mit Access z.B. kam ich überhaupt nicht klar) und bin dann am Ende doch bei der Excel-Lösung geblieben, weil diese Excel-Datei in einem gesicherten Verzeichnis liegt, welches zusätzlich noch über Zugriffsrechte nur für 3 Personen editierbar ist.

Ich werde Deinen Code gleich mal an meine Datei anpassen und dann testen... bin super gespannt face-smile

Grüße von
Yan face-wink
Member: Yan2021
Yan2021 Jan 24, 2022 updated at 08:12:37 (UTC)
Goto Top
Ergänzung:

@colinardo
Wow... der Code funktioniert super face-smile

Zwar verstehe ich nicht alles, was in Deinem Code auftaucht (u.A. das mit dem "Like Operator").
Vielleicht kannst Du mir nochmal einfach grob mit Worten erklären, was über Deinen Code alles gemacht wird face-wink

Ich habe jetzt noch eine zweite Schaltfläche hinzugefügt mit "Suchfilter löschen", da das mit "wenn Suchbegriff leer, blende alle Zeilen wieder ein..." (Zeile 8 Deines Codes) offenbar nicht funktioniert.
Mit meinem Code stelle ich dann quasi wieder den Ausgangszustand der Tabelle her.

Hier habe ich folgenden Code eingesetzt:

Sub Suchfilter_löschen()
'  
    ActiveSheet.Range("A:A").AutoFilter Field:=1  
    Selection.AutoFilter
    Range("E1").Select  
    Selection.ClearContents
    Range("E1").Select  

End Sub

Würdest Du das genauso umsetzen oder wie wäre Dein Vorschlag?

Grüße von
Yan face-wink
Member: Yan2021
Yan2021 Jan 24, 2022 updated at 08:52:08 (UTC)
Goto Top
Ergänzung 2:

@colinardo

Habe den Code jetzt in der original Tabelle getestet.
Grds. funktioniert er.

Das Ergebnis wird auch farblich hinterlegt (also die Zelle mit dem Suchbegriff). Das hatte ich über eine Bedingte Formatierung gemacht. Das würde ich so lassen.

Aber es gibt auch ein Problem:
Wenn nur ein Teil eines Eintrages gesucht wird, erscheint die Messagebox und sagt "kein Eintrag gefunden".
Das würde passieren bei z.B. dem Eintrag "Banane (schön gelb)". Wenn ich hier nach "Banane" suche, erscheint die Messagebox.

Allerdings würde der korrekte Eintrag "Banane (schön gelb)" jedoch farbig unterlegt. Die Filterung nach Farbe funktioniert also offenbar... nur wird diese Auswahl nicht gefiltert.

Hier der Screenshot dazu:

fehler

Ginge es auch, dass er auch Teile des Zelleneintrages berücksichtigt?

Grüße von
Yan face-wink
Member: colinardo
Solution colinardo Jan 24, 2022 updated at 09:19:04 (UTC)
Goto Top
Ginge es auch, dass er auch Teile des Zelleneintrages berücksichtigt?
Geht schon out of the box, einfach das Wildcard Sternchen im Suchbegriff angeben "Banane*" oder eben per Default die Wildcards im Code hinterlegen
If rngCurrent.Value Like ("*" & .Range("E1").Value & "*") then  

Vielleicht kannst Du mir nochmal einfach grob mit Worten erklären, was über Deinen Code alles gemacht wird face-wink face-wink
Jede Zeile ist extra schon kommentiert.

wenn Suchbegriff leer, blende alle Zeilen wieder ein..." (Zeile 8 Deines Codes) offenbar nicht funktioniert.
Doch funktioniert einwandfrei, wenn du es aber in eine andere Prozedur packst musst du vor das .UsedRange noch ein ActiveSheet packen, denn das habe ich im vorhandenen Code mit dem With ActiveSheet ja schon inkludiert., das hast du wohl vergessen mitzunehmen 😉.
Autofilter nutze ich in meinem Code ja nicht, deswegen ist der dort überflüssig.

p.s. Ein Kommentar statt Drei hätte eigentlich auch gereicht ...
Member: Yan2021
Yan2021 Jan 24, 2022 at 10:03:33 (UTC)
Goto Top
Hallo und danke für die weitere Hilfe.

Mit dem Code für die Wildcard funktioniert es perfekt.

Bezüglich des leeren Suchfeldes habe ich jedoch das "With ActiveSheet" mit übernommen.
Die entsprechenden Zeilen in meinem Code sehen aus wie folgt:

Dim rngCurrent As Range, rngHide As Range, found As Boolean
    With ActiveSheet
        .UsedRange.EntireRow.Hidden = False

Woran könnte es ansonsten noch liegen, dass der Ausgangszustand nicht wiederhergestellt wird, wenn ich das Suchfeld leere?

Im Moment mache ich das ja über eine weitere Schaltfläche. Das funktioniert auch.

Sorry wegen der 3 Posts. Aber ich dachte, dass ich mehr Verwirrung stifte, wenn ich meine Antworten immer wieder abändere face-smile

Grüße von
Yan face-wink
Member: colinardo
colinardo Jan 24, 2022 updated at 10:12:53 (UTC)
Goto Top
Woran könnte es ansonsten noch liegen, dass der Ausgangszustand nicht wiederhergestellt wird, wenn ich das Suchfeld leere?
Das du bspw. parallel dazu AutoFilter einsetzt, das wird zu Problemen führen, leider können wir hier ja dein Sheet und deinen Code nicht sehen. Klappt hier übrigens einwandfrei, steckt ja ehrlich gesagt nichts großes dahinter.
Hier das Demo-Sheet zum download an dem du es selbst ausprobieren kannst.

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.

Grüße Uwe
Member: Yan2021
Yan2021 Jan 24, 2022 updated at 10:30:07 (UTC)
Goto Top
Hallo nochmal,

habe mir das Sheet runtergeladen.
Da ist ja jetzt auch eine Reset-Schaltfläche dabei. Damit funktioniert es.

Das hatte ich vorab ja ähnlich realisiert... nur halt mit anderem Code.
Ich hatte es aber vorher so verstanden, dass der Reset durchgeführt wird, indem man einfach das Suchfeld leert. Das funktionierte nämlich so nicht. Mit Reset-Button geht´s natürlich.
Ich werde jetzt jedoch den Code Deiner Reset-Schaltfläche übernehmen. Der ist kürzer und passt wohl auch besser zu Deinem anderen Code. Nur wird damit das Suchfeld nicht geleert face-smile

Danke nochmal und Grüße von
Yan face-wink
Member: colinardo
colinardo Jan 24, 2022 updated at 10:31:03 (UTC)
Goto Top
Zitat von @Yan2021:
Da ist ja jetzt auch eine Reset-Schaltfläche dabei. Damit funktioniert es.
Die hatte ich mir bei obigem Code einfach eingespart, denn die Funktion war schon im Suchenbutton mit enthalten, wenn man das Suchfeld einfach leer gemacht hat und dann erneut auf den Suchen Button klickt wurde die Ansicht automatisch zurückgesetzt face-wink

Danke nochmal und Grüße von
Yan face-wink
You're welcome.
Member: Yan2021
Yan2021 Jan 24, 2022 updated at 10:34:24 (UTC)
Goto Top
...darauf muss man aber erstmal kommen, dass man die Suche nochmal anklicken muss, damit ein Reset durchgeführt wird face-wink

Jetzt muss nur noch mit dem Reset das Suchfeld "H2" auch geleert werden, dann ist alles bestens.

Grüße von
Yan face-wink
Member: colinardo
Solution colinardo Jan 24, 2022 at 10:32:42 (UTC)
Goto Top
Jetzt muss nur noch mit dem Reset das Suchfeld "H2" auch geleert werden
ActiveSheet.Range("H2").ClearContents  
Member: Yan2021
Yan2021 Jan 24, 2022 at 10:35:44 (UTC)
Goto Top
@colinardo

PERFEKT...

Danke für Deine Mühe.
Thread ist jetzt durch und gelöst.

Grüße von
Yan face-wink
Member: Yan2021
Yan2021 Jan 24, 2022 updated at 11:32:52 (UTC)
Goto Top
Hmmm... ich weiß nicht, ob man bei einem gelösten Thread nochmal eine Frage stellen darf face-sad

Mir fiel eben folgendes auf:
Wenn ein Begriff in mehreren unterschiedlichen Zeilen steht, wird er nur einmal angezeigt nach Betätigung der Suchen-Schaltfläche.

In meiner Liste gibt es einige Begriffe auch mehrfach (z.B. in Zeile 50 und 208).
Da ich ja zusätzlich noch über die "Bedingte Formatierung" auch die gefundenen Begriffe farblich markieren lasse, fiel mir das auf. Das funktioniert nämlich. Beide Begriffe in den unterschiedlichen Zeilen wurden farblich hinterlegt. Aber es wird halt nur einer dann oben angezeigt (also gefiltert).

Könnte man das irgendwie lösen?
- z.B. indem eine zusätzliche Filterung geschieht, wenn der Begriff weiter unten erneut auftaucht
- oder über eine Messagebox mit "weiter suchen" Schaltfläche, die aber nur auftaucht, wenn der Begriff tatsächlich mehrfach gefunden wurde...

Sorry... und Grüße von
Yan face-wink
Member: colinardo
colinardo Jan 24, 2022 updated at 12:12:16 (UTC)
Goto Top
Zitat von @Yan2021:
Mir fiel eben folgendes auf:
Wenn ein Begriff in mehreren unterschiedlichen Zeilen steht, wird er nur einmal angezeigt nach Betätigung der Suchen-Schaltfläche.
Nö, funktioniert hier einwandfrei, die Suche hört nicht beim ersten gefundenen auf sondern durchläuft immer alle Zeilen, deswegen werden auch immer alle passenden Zeilen angezeigt.
Könnte man das irgendwie lösen?
Funktioniert bereits out of the box. Kann ich dir gerne demonstrieren.

back-to-topVorher


screenshot

back-to-topSuche nach OneDrive (2 mal vorhanden)


screenshot
Member: Yan2021
Yan2021 Jan 24, 2022 updated at 13:27:20 (UTC)
Goto Top
Sehr merkwürdig...

Habe jetzt "Paypal" nochmal in der Mitte der Liste eingetragen als "Paypal 2" und ganz unten nochmal als "Paypal 3".

Aber es wird mir nur das erste angezeigt.
Über die bedingte Formatierung werden die anderen beiden Paypal-Einträge jedoch farblich unterlegt.

Seltsam, da ich ja genau Deinen Code verwende für die Suche und auch für das Reset.
Meinen vorherigen "Suche löschen" Code hatte ich ja schon aus dem VBA-Code rausgenommen.

Woran könnte das liegen? face-sad

Grüße von
Yan face-wink

Update:

Und mir fällt erst jetzt durch Deine beiden Screenshots oben auf, dass in meiner Excel-Liste zwar immer zu dem Punkt gesprungen wird, wo ein Ergebnis gefunden wird, aber der Rest wird nicht weg gefiltert.
Das ist auch so, wenn der Begriff nur einmal existiert.
In Deinem 2. Screenshot sieht man ja, dass nur die beiden OneDrive Einträge zu sehen sind.
Oder liegt das nur daran, dass der zweite OneDrive Eintrag der letzte in der Liste ist?

Grüße von
Yan face-wink
Member: colinardo
colinardo Jan 24, 2022 updated at 13:25:11 (UTC)
Goto Top
Schick mir dein File per PN, keine Lust hier ne Raterunde zu veranstalten.
Member: Yan2021
Yan2021 Jan 24, 2022 at 13:27:57 (UTC)
Goto Top
...ich hatte noch ein Update zum letzten Post gemacht face-wink
Member: Yan2021
Yan2021 Jan 24, 2022 updated at 13:41:08 (UTC)
Goto Top
Ich sende Dir jetzt die Liste per PN (mal schauen, wie man das hier macht).

Grüße von
Yan face-wink


Die Liste habe ich Dir eben gesendet.

Grüße von
Yan face-wink