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:
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.
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
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:
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1747117050
Url: https://administrator.de/forum/suchfunktion-in-excel-per-vba-code-1747117050.html
Ausgedruckt am: 11.04.2025 um 23:04 Uhr
18 Kommentare
Neuester Kommentar
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
. 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
Grüße Uwe
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
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
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
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 hinterlegenIf 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
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 ...
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
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 
Danke nochmal und Grüße von
Yan
You're welcome.Yan
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.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.
Könnte man das irgendwie lösen?
Funktioniert bereits out of the box. Kann ich dir gerne demonstrieren.