Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Listbox mit Inhalt aus Textboxen durchsuchen

Listbox mit Inhalt aus Textboxen durchsuchen
06.05.2019 09:19:32
Tim
Guten Morgen zusammen,
ich hab Dank des Forums bereits Hilfe zu diesem Thema erhalten, jedoch stellt mich das "Weiterbauen" meiner Userform vor eine neue Herausforderung die mir bis Dato nicht bekannt gewesen ist.
Erreicht habe ich, dass ein Suchbegriff aus einer Textbox in der Listbox gesucht wird. Neu ist, dass ich mehrere Textboxen habe, deren Suchbegriff in verschiedenen Spalten gesucht werden soll. Das Makro konnte ich soweit anpassen.
Die Herausforderung liegt darin, dass einzelne Textbox zwischendrin geleert oder geändert werden. Dabei soll nur die Markierung aufgehoben/neugesetzt werden bei der die Änderung in der Textbox vorgenommen wurde und nicht alle Markierungen.
Heißt, mit jedem Change-Ereignis in der jeweiligen Textbox, soll das Makro die verbleibenden Einträge anderer Textboxen markiert lassen sofern diese gefüllt sind und eine Treffer des Suchbegriffes landen konnten und das aktuelle Change-Ereignis berücksichtigen.
Wer kann mir dabei behilflich sein?
Private Sub Textbox2_Change()
Dim i As Long
With UserForm1.ListBox1
If Me.TextBox1.Text = "" Then
For i = 0 To .ListCount - 1
If .Selected(i) Then .Selected(i) = False
Next i
Exit Sub
End If
If Me.TextBox2 = "" Then
For i = 0 To .ListCount - 1
If .Selected(i) Then .Selected(i) = False
Next i
Exit Sub
End If
For i = 0 To .ListCount - 1
If .List(i) Like "*" & TextBox1.Text & "*" Then
.Selected(i) = True
End If
If .List(i, 3) Like "*" & TextBox2.Text & "*" Then
.Selected(i) = True
End If
Next
End With
End Sub

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox mit Inhalt aus Textboxen durchsuchen
07.05.2019 13:22:44
Matthias
Moin!
Also ich würde das in eine Funktion auslagern und immer die Textbox übergeben. Der Ablauf ist ja für alle Textboxen gleich. Dadurch lässt sich der Code besser warten. Ablauf wäre: Durch alle Listboxzeilen gehen, prüfen ob die Vorausetzungen zur Markierung vorliegen und danach entweder die Markierung löschen oder setzen. Man könnte das auch noch optimieren. Da wäre aber die Frage, wieviele Textboxen hast du, wieviele Listboxspalten und ist jede Textbox auch genau (!) einer Spalte zugewiesen oder können mehrere Textboxen die gleiche Spalte beeinflussen? (im Code oben sind es nur 2 Boxen und die haben unterschiedeliche Spaltenzuordnungen). Mit den Antworten könnte man was basteln - noch besser wäre natürlich eine Beispielmappe, würde aber auch so gehen.
VG
Anzeige
AW: Listbox mit Inhalt aus Textboxen durchsuchen
07.05.2019 14:23:44
Tim
Hallo Matthias,
es sind insgesamt 3 Textboxen, davon sollen zwei Textboxen die erste Spalte durchsuchen und die dritte Textbox, die dritte Spalte.
Hier mal eine Vorlage dazu https://www.herber.de/bbs/user/129642.xlsm
AW: Listbox mit Inhalt aus Textboxen durchsuchen
07.05.2019 19:34:39
Matthias
Moin!
Hier mal der Code deiner UF angepasst. Habe dabei nur eine Funktion genommen. Ansonsten müsstest du bei Änderungen das dreimal machen. Hinweis noch: Der Vergleich unterscheidet Groß-/Kleinschreibung. Falls du das weghaben willst, bei den Vergleichen immer UCASE()für de Ausdrücke verwenden.
Private Sub TextBox2_Change()
Call aktualisieren
End Sub
Private Sub Textbox1_Change()
Call aktualisieren
End Sub
Private Sub TextBox3_Change()
Call aktualisieren
End Sub
Private Sub UserForm_Initialize()
UserForm1.ListBox1.ColumnCount = 5
UserForm1.ListBox1.ColumnWidths = "18cm;0cm;;0cm;5cm;2cm"
Call Daten_einlesen ' Modul1
End Sub
Private Sub aktualisieren()
Dim lngZeile As Long
Dim lngIndex As Long
Dim markieren As Boolean
With ListBox1
For lngZeile = 0 To .ListCount - 1
markieren = False
For lngIndex = 1 To 3
If Me.Controls("TextBox" & lngIndex)  "" Then
If lngIndex = 1 Or lngIndex = 2 Then
If .List(lngZeile) Like "*" & Me.Controls("TextBox" & lngIndex) & "*" Then  _
markieren = True
Else
If .List(lngZeile, 2) Like "*" & Me.Controls("TextBox" & lngIndex) & "*"  _
Then markieren = True
End If
End If
Next
If markieren = True Then
.Selected(lngZeile) = True
Else
.Selected(lngZeile) = False
End If
Next lngZeile
End With
End Sub

VG
Anzeige
AW: Listbox mit Inhalt aus Textboxen durchsuchen
08.05.2019 16:18:19
Tim
Vielen Dank Matthias, funktioniert wie gewünscht!
Wenn ich eine weitere Textbox dazuhaben will, muss ich nur diesen For lngIndex = 1 To 3 erhöhen oder!?
AW: Listbox mit Inhalt aus Textboxen durchsuchen
08.05.2019 17:17:02
Matthias
Moin!
Nicht nur. Der lngIndex ist die Anzahl der Textboxen. Die Nummern müssen aber auch alle vorkommen, sonst läuft der Code in einen Fehler! Also die nächste Box sollte TextBox4 sein (nicht TextBox5 etc.). Den also - richtig erkannt - erhöhen. Dann müsstest du aber noch die if Prüfung anpassen. Das wird dann bei mehreren Boxen aber ein Gewurstel von if / elseif / else. Damit das etwas übersichtlicher wird, habe ich den Code da mal angepasst. Jetzte werden die lngINdex in einem select case geprüft (Ergebnis ist das selbe, nur andere Vorgehensweise). Jeder Case Zweig gilt da für eine Spalte in der Listbox. Bei lngIndex 1 und 2 die erste Spalte bei 3 die 3. Spalte. Für jede weitere Box schauen, welche Spalte sie durchsucht. Hast du dafür schon einen case, dort einfach die Nummer der Box mit ergänzen. Bspw. case 1,2,4. Hast du die Spalte noch nicht, einfach einen Case einfügen. Dort die Nummer dahinter und in dem folgenden if die richtige Spalte beim .list() auswählen. Klingt jetzt kompliziert ist es aber nicht. Habe mal ein Bsp. für TB4 und Spalte 2 mit eingebaut (aber auskommentiert). Das war's dann eigentlich an Anpassungen - mehr ist nicht erforderlich. Natürlich der Box noch das Event zuweisen. :-) HIer mal der Code (die Zeilenumbrüche wieder zurüclsetzen):
Private Sub aktualisieren()
Dim lngZeile As Long
Dim lngIndex As Long
Dim markieren As Boolean
With ListBox1
For lngZeile = 0 To .ListCount - 1
markieren = False
For lngIndex = 1 To 3   'lngIndex entspricht der Nummer im TxtBox Namen
If Me.Controls("TextBox" & lngIndex)  "" Then
Select Case lngIndex
Case 1, 2   'Prüfung in Spalte 1
If .List(lngZeile) Like "*" & Me.Controls("TextBox" & lngIndex) & "*"  _
Then markieren = True
'Case 4      'Prüfung in Spalte 2
'   If .List(lngZeile, 1) Like "*" & Me.Controls("TextBox" & lngIndex) & "*" _
Then markieren = True
Case 3      'Prüfung in Spalte 3
If .List(lngZeile, 2) Like "*" & Me.Controls("TextBox" & lngIndex) & "*" _
Then markieren = True
End Select
End If
If markieren = True Then Exit For   'damit ist der Code ggf. schneller
Next
If markieren = True Then
.Selected(lngZeile) = True
Else
.Selected(lngZeile) = False
End If
Next lngZeile
End With
End Sub

VG
Anzeige
AW: Listbox mit Inhalt aus Textboxen durchsuchen
09.05.2019 21:57:43
Tim
Perfekt, vielen Dank!!
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Listbox mit mehreren Textboxen durchsuchen


Schritt-für-Schritt-Anleitung

  1. UserForm erstellen: Öffne Excel und erstelle eine neue UserForm. Füge mehrere Textboxen (z.B. TextBox1, TextBox2, TextBox3) und eine Listbox (ListBox1) hinzu.

  2. ListBox konfigurieren: Setze die Spaltenanzahl der Listbox im Code:

    UserForm1.ListBox1.ColumnCount = 5
  3. Textboxen initialisieren: Füge im UserForm_Initialize-Ereignis den Code zum Einlesen von Daten in die Listbox hinzu:

    Call Daten_einlesen ' Modul1
  4. Change-Ereignisse programmieren: Erstelle ein Change-Ereignis für jede Textbox, das die aktualisieren-Funktion aufruft:

    Private Sub TextBox1_Change()
       Call aktualisieren
    End Sub
  5. Aktualisierungslogik erstellen: Implementiere die aktualisieren-Funktion, um die Listbox basierend auf dem Inhalt der Textboxen zu aktualisieren:

    Private Sub aktualisieren()
       Dim lngZeile As Long
       Dim lngIndex As Long
       Dim markieren As Boolean
       With ListBox1
           For lngZeile = 0 To .ListCount - 1
               markieren = False
               For lngIndex = 1 To 3
                   If Me.Controls("TextBox" & lngIndex) <> "" Then
                       Select Case lngIndex
                           Case 1, 2
                               If .List(lngZeile) Like "*" & Me.Controls("TextBox" & lngIndex) & "*" Then markieren = True
                           Case 3
                               If .List(lngZeile, 2) Like "*" & Me.Controls("TextBox" & lngIndex) & "*" Then markieren = True
                       End Select
                   End If
                   If markieren = True Then Exit For
               Next
               .Selected(lngZeile) = markieren
           Next lngZeile
       End With
    End Sub

Häufige Fehler und Lösungen

  • Fehler bei der Listbox-Zuweisung: Stelle sicher, dass die Indizes in der Select Case-Anweisung mit den tatsächlichen Spalten der Listbox übereinstimmen. Ein falscher Index führt zu unerwarteten Ergebnissen.

  • Markierungen werden nicht aktualisiert: Überprüfe die Logik im aktualisieren-Code und stelle sicher, dass die markieren-Variable korrekt gesetzt wird.


Alternative Methoden

  • Funktionen auslagern: Um den Code übersichtlicher zu gestalten, kannst du die Logik in separate Funktionen auslagern, die für jede Textbox zuständig sind. Dies hilft, die Wartbarkeit zu verbessern.

  • Datenbankanbindung: Wenn du mit großen Datenmengen arbeitest, könntest du in Erwägung ziehen, die Daten aus einer Datenbank zu laden und die Filterung dort durchzuführen.


Praktische Beispiele

Hier ist ein einfaches Beispiel für den Code in einer UserForm mit drei Textboxen:

Private Sub UserForm_Initialize()
    UserForm1.ListBox1.ColumnCount = 3
    UserForm1.ListBox1.AddItem "Eintrag 1"
    UserForm1.ListBox1.AddItem "Eintrag 2"
    UserForm1.ListBox1.AddItem "Eintrag 3"
End Sub

In diesem Beispiel wird die Listbox mit drei Einträgen gefüllt. Du kannst die Textboxen nutzen, um nach bestimmten Einträgen zu suchen.


Tipps für Profis

  • Groß-/Kleinschreibung ignorieren: Verwende UCase() oder LCase(), um die Groß-/Kleinschreibung beim Vergleich zu ignorieren.

    If UCase(.List(lngZeile)) Like UCase(Me.Controls("TextBox" & lngIndex)) Then
  • Code optimieren: Vermeide die Wiederholung von Code durch die Verwendung von Schleifen und Funktionen. Dies macht deinen Code nicht nur kürzer, sondern auch leichter verständlich.


FAQ: Häufige Fragen

1. Wie viele Textboxen kann ich verwenden?
Du kannst beliebig viele Textboxen verwenden, musst jedoch sicherstellen, dass die Logik in der aktualisieren-Funktion entsprechend angepasst wird.

2. Was passiert, wenn ich die Anzahl der Spalten in der Listbox ändere?
Wenn du die Anzahl der Spalten änderst, musst du die Select Case-Anweisung entsprechend anpassen, um sicherzustellen, dass die richtigen Spalten für die jeweiligen Textboxen durchsucht werden.

3. Wie kann ich die Listbox zurücksetzen?
Du kannst eine Funktion erstellen, die alle Markierungen in der Listbox auf False setzt. Dies kann nützlich sein, wenn du die Suche zurücksetzen möchtest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige