Clever-Excel-Forum

Normale Version: Suchfeld über VBA in Excel
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hi Leute,

ich bin im Tema VBA in Excel leider nicht bewandert und hatte/habe aber folgendes Problem:

Ich habe eine Tabelle, welche quasi täglich erweitert wird. Oberhalb dieser Tabelle wollte ich ein Suchfeld einfügen. Das hat soweit auch gut geklappt. Als Verknüpfung für den Code habe ich ein Formularsteuerelement eingefügt und dieses mit dem Code/Makro verknüpft. Auf Knopfdruck sollte nun die Tabelle automatisch gefiltert werden, so dass nur noch die Felder angezeigt werden, die mit dem Suchbegriff übereinstimmen. Leider ist es jedoch so, dass bei mehreren identischen Suchbegriffen wohl nur der erste rausgesucht wird und dahinter die "falschen" Spalten nicht mehr gelöscht werden. Zumindest die mit einem Eintrag in Spalte B. Wenn in Spalte B etwas steht, egal was, löscht er sie nicht. Wenn die Spalte leer ist, wird die komplette Zeile gelöscht.

So sieht die Tabelle vor der Eingabe eines Suchbegriffs aus:

[attachment=45229]

Wenn ich nach dem Nachnamen Müller suche, sieht das ganze so aus:

[attachment=45228]

Er sucht, wie beschrieben, zumindest nach dem ersten übereinstimmenden Begriff, aber danach geht es nicht mehr richtig weiter, wenn die Spalte B beschrieben ist. Ist B leer, werden die Zeilen gelöscht.

Hier einmal der Code:

Code:
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("C2").Value = "" Then
            Exit Sub
        End If
        ' Startbereich festlegen
        Set rngCurrent = .Range("B5")
        ' so lange verarbeiten bis Bereich am Ende angelangt ist
        While rngCurrent.Address <> .Cells(Rows.Count, "B").End(xlUp).Offset(1, 0).Address
            ' Wenn der Suchbegriff gefunden wurde
            If rngCurrent.Value Like .Range("C2").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


Ich hoffe, ihr könnt mir helfen. Ich habe mir das schon zusammensuchen müssen. Mit Formeln geht es leider nicht, auch nicht mit bedingter Formatierung, da unsere Excel Version zu alt ist und diese Formeln/Formatierungen nicht unterstützt. Daher muss es leider über VBA gehen.

LG
Hi,

schau dir mal diese Demo_Tabelle an,
vieleicht hilft dir das...

Gruß
omron2003
Hi,

kann ich vom Arbeitsrechner gerade leider nicht drauf zugreifen.
Was müssen wir mit Bildern in einem Excelforum ?
Eine Tabelle mit leere listrows ist murks.
Jede dynamische Tabelle hat Autofilter eingebaut: ein Suchfeld ist murks.
Spätere Excelversionen enthalten Slicers für dynamische Tabellen.
Ich kann mich den Vorrednern nur anschließen: du hast doch schon den Autofilter für die Tabelle aktiviert. Wieso nutzt du nicht einfach diesen?
Hallöchen,

wenn Du bei Deinem Code bleiben willst, dann lasse ihn mal mit F8 schrittweise durchlaufen. Du solltest dann anhand der programmierten Bedingungen (If ...) die Stelle sehen, wo es klemmt.
rngCurrent.End(xlDown).Offset(1, 0)

bei einer formatierten Tabelle landet dieser Befehl am Ende der ganzen Tabelle und nicht an der letzten (sichtbar) beschriebenen Zelle.
der Code sollte auf Listobjects umgebaut werden, sofern überhaupt vba zum Filtern nötig ist. Siehe Autofilter.