Excel-Tabelle mit mehreren hundert Einträgen (Zeilen); Der Tabellenkopf ist fixiert, um den Überblick zu behalten; Über dem Tabellenkopf befindet sich ein Feld, dass der Stichwortsuche dienen soll, also eine Art Suchfeld;
Folgendes Problem liegt vor:
Ich möchte nur die Zeilen eingeblendet lassen, die das gesuchte Stichwort in einer der Spalten der entsprechenden Zeile enthalten.
Lösungsansatz:
Alle Zeilen, die das gesuchte Stichwort NICHT enthalten, sollen nach der Eingabe (Aktualisierung) des Suchfeldes ausgeblendet werden.
----------------------
Vor einigen Jahren hatte ich einmal genau so ein Script bewerkstelligt, jedoch habe ich es inzwischen nicht mehr und finde auch ähnliches nicht mehr im weltweiten Netz. Ich hoffe, dass ihr mir helfen könnt.
Liebe Grüße
Ben
----------------------
Ich füge mal dem Anhang eine Demo-Tabelle bei, um die Grundstruktur deutlich zu machen.
so ganz habe ich das mit dem Stichwort in Verbindung mit Zeilenausblenden nicht verstanden. Deshalb mal ein genereller Tipp: schau dir mal die Filterfunktion(en) an - vllt. kommst du damit schon weiter.
Gruß Günter Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen. angebl. von Georg Christoph Lichtenberg (1742-1799)
Folgende(r) 1 Nutzer sagt Danke an WillWissen für diesen Beitrag:1 Nutzer sagt Danke an WillWissen für diesen Beitrag 28 • hatstick
21.06.2017, 21:18 (Dieser Beitrag wurde zuletzt bearbeitet: 21.06.2017, 21:20 von hatstick.)
Vielen Dank zunächst für die schnelle Rückmeldung,
die Filterfunktion ist mir bekannt, möchte ich jedoch in diesem Fall nicht nutzen, da ich tatsächlich kurz ein Stichwort, also eine Zeichen- oder Teilzeichenkette in ein Feld eintippen möchte. Nach dem Aktualisieren (z.B. durch das Drücken der Enter-Taste) sollen dann alle unpassenden Zeilen ausgeblendet werden.
Der Vorteil:
Man nutzt ein einziges Feld, um alle Zeilen mit relevantem Inhalt eingeblendet zu lassen, ohne, dass man sich durch die Filter klicken muss. ------------------------
21.06.2017, 23:36 (Dieser Beitrag wurde zuletzt bearbeitet: 21.06.2017, 23:36 von hatstick.)
Hallo ihr Lieben,
ich habe nun folgendes erfolgreich hinbekommen:
Code:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "C2" Then Exit Sub Call Search End Sub
Sub Search() ActiveSheet.Range("A1:U999").Select Selection.Rows.Hidden = False
'Jede Zeile >= 6 soll nun mit C2 abgeglichen werden. 'Ist der String aus C2 NICHT Teil einer Zelle der Zeilen >= 6, soll diese Zeile ausgeblendet werden. 'Dies Soll für jede befüllte Zeile >= 6 wiederholt werden.
ActiveSheet.Range("C2").Select MsgBox ("Suche wurde in C2 ausgelöst mit ") & ActiveSheet.Range("C2").Value & ("!") End Sub
Mir fehlt nur noch die Programmroutine, die für das sorgt, was im Mittelteil auskommentiert ist.
22.06.2017, 12:37 (Dieser Beitrag wurde zuletzt bearbeitet: 22.06.2017, 12:37 von hatstick.)
So liebe Leute,
ich habe das Problem gelöst. Wobei hier sicherlich noch Optimierungsmöglichkeiten vorhanden sein dürften.
Hier der Code:
Code:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "C2" Then Exit Sub Call Search End Sub
Sub Search() ActiveSheet.Range("A1:U999").Select Selection.Rows.Hidden = False
suche = ActiveSheet.Range("C2").Value ActiveSheet.Range("AA6:AA100").Select Dim cell As Range
For Each cell In Selection cell.EntireRow.Hidden = (InStr(1, cell, suche, vbTextCompare) = 0) Next ActiveSheet.Range("C2").Select End Sub
In der Spalte AA steht folgende Formel (die man sicherlich auch im Makro unterbringen kann):
=VERKETTEN(A6;B6;C6;D6;E6;F6;G6)
Damit werden alle Inhalte der Spalten, die durchsucht werden sollen in die Zelle AA gepackt. Das Script vergleicht dann das eingegebene Suchwort aus C2 mit den Einträgen unter AA und blendet alle Zeilen aus, die keinen Treffer haben.
26.06.2017, 19:40 (Dieser Beitrag wurde zuletzt bearbeitet: 26.06.2017, 19:42 von hatstick.
Bearbeitungsgrund: Grammatikfehler
)
Hallo ihr Lieben
ich habe die Tabelle mit einem Update versehen.
Neuerungen:
InStr wurde durch "like" ersetzt
Die Suche ist nun mit * möglich. (z.B. String1*String2)
Das Script durchsucht nur die Reihen, die befüllt sind
Die zusammengesetzten Suchstrings befinden sich jetzt in Spalte A, um Änderungen der Tabelle zu erleichtern
Die Einrichtung ist jetzt über zentral deklarierte Variablen möglich
Funktionsweise:
Das Script vergleicht den Suchstring, der im zuvor definierten Suchfeld, z.B. in C2, eingegeben wurde mit den befüllten Reihen unterhalb des vorher definierten Tabellenkopfes. Gibt es keine Übereinstimmungen mit dem Inhalt der jeweiligen Zeile, wird diese ausgeblendet. Danach wird die nächste Zeile verglichen, bis keine befüllte Zeile mehr vorhanden ist. Das Ergebnis ist, dass nur die Zeilen eingeblendet bleiben, die dem Suchkriterium entsprechen.
Ausgelöst wird die Suche durch die Aktualisierung der Tabelle (z.B. durch Drücken von Enter oder Tab). Nach beendeter Suche springt der Cursor automatisch wieder auf das Suchfeld.
Private Sub Worksheet_Change(ByVal Target As Range) Dim SearchField As String Dim SearchEntry As String Dim Keywords As String Dim DataStart As Integer Dim MaxRow As Integer Dim MaxColumn As String
Sub Search(a As Integer, b$, c$, d As Integer, e$, f As String) If e$ = "" Then ActiveSheet.Range("A1:A" & a).Select Selection.Rows.Hidden = False Else Dim Cell As Range Dim mRange As Range Set mRange = ActiveSheet.Range(c$ & d & ":" & c$ & a) For Each Cell In mRange.Cells
(26.06.2017, 19:44)RPP63 schrieb: Moin! Ich habe dies mal mit einem "Auto-Autofilter" gelöst. Macht imo mehr Sinn als eine Schleife.
Gruß Ralf
Hallo Ralf,
aus Sicherheitsgründen möchte ich keine makrofähigen Dateien herunterladen. Kannst du dein Beispiel als herkömmliche Excel-Tabelle und getrennt davon eine TXT-Datei mit dem VBA-Script hochladen?
Öffne sie, ohne Makros zu aktivieren. Ist auch kein Hexenwerk: In Tabelle1
Code:
Private Sub TextBox1_Change() Dim Letzte As Long Letzte = Cells(Rows.Count, 1).End(xlUp).Row With Range(Cells(2, 1), Cells(Letzte, 2)) .AutoFilter _ field:=1, Criteria1:=TextBox1.Text & "*", VisibleDropDown:=False .AutoFilter field:=2, VisibleDropDown:=False End With End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 27 Then 'bei ESC-Taste wird Filterung aufgehoben TextBox1 = "" If AutoFilterMode Then Cells(2, 1).AutoFilter End If End Sub
Private Sub CommandButton1_Click() TextBox1 = "" If AutoFilterMode Then Cells(2, 1).AutoFilter End Sub
Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)