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

Suchfunktion in bestehender Listfunktion einbinden ...

Forumthread: Suchfunktion in bestehender Listfunktion einbinden ...

Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 16:41:57
Saffi
Hallo Freunde,

habe mir eine Funktion gebastelt, mit der ich eine Listbox befülle. Verwendung fand die Funtkion Rowsource. Nun scheitere ich daran, dass ich mit dieser Funktion keine Suchabfrage generieren kann. zumindest sehe ich den Wald vor lauter Bäumen nicht.^^

Private Sub Suchbegriff_Change()


'richtiges Tabellenblatt auswählen
ThisWorkbook.Worksheets("Lager").Activate

'Listbox leeren
'Me.ListBoxLager.Clear

'Zellbereich einlesen
Dim rng As Range
Set rng = shLager.Range("A1").CurrentRegion
Set rng = rng.Offset(1, 0).Resize(rng.Rows.Count - 1)

'Listbox befüllen
With ListBoxLager

.RowSource = rng.Address(external:=True)
.ColumnCount = rng.Columns.Count ' Spaltenanzhal festlegen
.ColumnWidths = "20;80;80;50;40;40;40;50;50;40;40;80;50;50;40;30;30;30" 'Spaltenbreite festlegen
.ColumnHeads = True
.ListIndex = 0

End With

End Sub


Dies ist der derzeitige Code für das Befüllen meiner ListBox. Nun möchte ich aber mit einem Suchfeld (über der Listbox) die Auswahl eingrenzen, da die Daten gefühlt unendlich erscheinen. Hier wollte ich quasi über mehrere Spalten einer Tabelle die Suchfunktion wirken lassen. Ergebnisse sollen dann gefiltert in der Listbox erscheinen.

Weiter wollte ich im Vorfeld die ListBix leeren, damit die Ergebnisse angezeigt werden können. Die Funktion habe ich weiter oben stehen und auskommentiert, da ich dort einen Fehler bekomme.

Danke euch.
Anzeige

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 16:48:49
Onur
Das geht NICHT, wenn du mit RowSource arbeitest.
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 17:02:20
daniel
HI
wie der Kollege schrieb.
wenn du mit RowSource arbeitest, kannst du in der Listbox nichts verändern, da die Listbox mit dem Zellbereich verknüpft ist.
wenn, dann müsstest du die Daten in dem Zellbereich ändern.

du kannst aber die Tabellenblattinhalte einmalig als Werte in die Listbox schreiben:

ListboxLager.List = rng.Value


und dann nicht benötigte Elemente wieder rausschmeißen das funktioniert auch bei Listboxen mit mehr als 10 Spalten
For i = ListboxLager.ListCount - 1 to 0

If ListboxLager.List(i, 0) > "was weis ich" then ListboxLager.RemoveItem i
Next


oder du legst dir eine Kopie der Originaltaqbelle an, löschst dort die nicht benötigten Inhalte und setzt dann die RowSource auf diese Tabelle.
ab Excel 2022 könntest du dir die Liste sogar mit einer Excelformel filtern und und die Listbox mit dieser Filterformel als RowSource verknüpfen. dann ließe sich das sehr einfach mit sehr wenig Code realisieren.

Gruß Daniel
Anzeige
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 17:17:31
Saffi
Hallo Daniel,

würde gern den Vorschlage aufgreifen. Leider weis ich nicht recht, wo genau
ListBoxLager.List = rng.Value
eingefügt werden muss. Erhalte immer einen Laufzeitfehler 70.^^

Danke
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 17:26:29
daniel
naja wo wohl?
dort wo du die Listbox mit Inhalt befüllst.
also anstelle der Zeile mit ListboxLager.RowSource = rng.Address(...)
ist das nicht irgendwie logisch?
du darfst, wenn du die Listbox so befüllen willst, vorher die RowSource nicht füllen, das Feld muss leer sein, auch in der Eigenschaftsliste im Editor.
wenn du ganz sicher gehen willst, leerst du den Eintrag per Code, bevor du die Listbox wieder füllst, also

ListboxLager.RowSource = ""

ListboxLager.List = rng.Value


kleiner Nachteil bei der Aktion: Datums- und Zahlenwerte werden so ggf nicht mehr formatiert angezeigt, sondern als Zahlenwert.

Gruß Daniel
Anzeige
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 18:36:15
daniel
Hi
mal so als Idee, wie du das einfach realisieren kannst:

1. suche dir eine freie Zelle.
in diese kommt später der Text aus der Textbox für die Suche.
Die Zelle sei jetzt mal U1 im Tabellenblatt lager

2. füge der Liste "Lager" eine weitere Spalte hin zu (Spalte S)
in diese kommt eine Formel, die eine 1 ausgibt, wenn die Zeile später in der Liste angezeigt werden soll und ein "x" wenn nicht, also sowas wie
=Wenn(Istzahl(Suchen($U$1;B2));1;"x")


3. im Change-Event der Textbox für die Suche machst du jetzt folgendes:
- Textboxwert in die Zelle U1 schreiben
- die Lagerliste nach der neuen Spalte S aufsteigend sortieren, die Zeilen mit 1, die angezeigt werden sollen, stehen jetzt ganz oben.
- den Zellbereich mit 1 ermitteln und diesen als RowSource verwenden
um das zu machen, kannst du den Ausdruck Columns("S:S").SpecialCells(xlcelltypeformulas, 1) verwenden, das referenziert auf alle Zellen, die in Spalte 1 eine Formel haben, die eine Zahl als ergebnis ausspuckt.

konkreter Code dazu sähe so aus:

Private Sub Suchbegriff_Change()


'richtiges Tabellenblatt auswählen
ThisWorkbook.Worksheets("Lager").Activate
Range("U1").Value = Me.Suchbegriff.Value

'Listbox leeren
'Me.ListBoxLager.Clear

'Zellbereich einlesen
Dim rng As Range
Set rng = shLager.Range("A1").CurrentRegion
rng.Sort key1:=rng.Cells(1, rng.Columns.Count), order1:=xlAscending, Header:=xlYes
If WorksheetFunction.Sum(rng.Columns(rng.Columns.Count)) = 0 Then
Set rng = rng.Offset(rng.Rows.Count + 3).Resize(1)
Else
Set rng = rng.Columns(rng.Columns.Count).SpecialCells(xlCellTypeFormulas, 1).Offset(0, 1 - rng.Columns.Count).Resize(, rng.Columns.Count)
End If
'Listbox befüllen
With ListBoxLager
.RowSource = rng.Address(external:=True)
.ColumnCount = rng.Columns.Count ' Spaltenanzhal festlegen
.ColumnWidths = "20;80;80;50;40;40;40;50;50;40;40;80;50;50;40;30;30;30;0" 'Spaltenbreite festlegen
.ColumnHeads = True
.ListIndex = 0
End With

End Sub


wenn du deine Datumswerte als Datum angezeigt bekommen und auch die Spaltenüberschriften haben willst, dann bekommst du das nur mit einer Befüllung über RowSource.
dann geht das Filtern aber nur mit einer separat Tabelle, oder wenn du wie hier die anzuzeigenden Zeilen nach oben sortierst (damit sie unter der Überschriftenzeile stehen) und diesen Bereich als RowSource verwendest.

Gruß Daniel
Anzeige
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 16:51:07
Saffi
Ah, dass dachte ich mir schon fast. Da die Funktion nur Bereiche als solches verarbeitet oder?
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 16:57:30
Onur
Der Bereich ist fixiert, also kannst du nix an der Liste ändern.
Du solltest sie mit ".Add" füllen.
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 17:04:49
daniel
Listboxen, die mit .AddItem gefüllt werden, enthalten immer 10 Spalten.
hier werden aber mehr benötigt, zumindest deutet die Zeile mit den ColumnWidth darauf hin.
also wird da wahrscheinlich nicht funktionieren.
Gruß Daniel
Anzeige
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 17:38:11
Saffi
Ja so ist es. Mit den anderen Listboxen geht es besser. Da habe ich nicht soviel Spalten in Verwendung. Da aber hier eine direkte Lageransicht angezeigt werden soll, müssen daher auch alle relevanten Felder angesprochen werden.
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 17:41:51
Onur
Poste doch einfach mal die Datei, statt nur den Code.
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 17:48:19
Saffi
Ok kann ich machen. Ich möchte aber im Vorfeld daran erinnern, dass ich hier noch einige Baustellen drin habe. Sollte euch was auffallen, was noch nicht komplett ist. Wird halt so wie es zeitlich passt erneuert. Und ich als Hans Dampf fang gern parallel mit mehreren Sachen gleichzeitig an.^^

https://www.herber.de/bbs/user/171281.xlsm

Um eine Beispieldatein anzufertigen, wäre der Aufwand meiner Meinung nach zu groß.
Anzeige
AW: Suchfunktion in bestehender Listfunktion einbinden ...
27.07.2024 00:35:53
Onur
Guckst du hier:
https://www.herber.de/bbs/user/171289.xlsm

Jetzt kannst du nach beliebigen Textteilen oder Zahlen suchen, die Listbox wird gefiltert, sobald du irgendwas oben eintippst.

Ich habe einige deiner Zeilen in anderen Subs deaktiviert, da sie dauernd dazwischenfunkten - bitte noch korrigieren.
Anzeige
AW: Suchfunktion in bestehender Listfunktion einbinden ...
27.07.2024 01:04:53
Onur
DAS kann auch weg:
ReDim arr(1 To anzz + 1)
AW: Suchfunktion in bestehender Listfunktion einbinden ...
27.07.2024 12:54:17
Saffi
Hallo Onur,

vielen lieben Dank für Deine Mühe. Weiß garnicht, wie ich mich bedanken soll. Perfekt!

Beste Grüße saffi
Anzeige
Gerne !
27.07.2024 12:59:46
Onur
Gerne !
27.07.2024 13:05:09
Onur
Das bitte auch weg:
rng.Select
AW: Gerne !
27.07.2024 13:25:38
Saffi
Hallo Onur,

habe beide Zeile rausgenommen.

Es funktioniert wunderbar soweit. Leider muss ich doch nochmal nach Deinem Rat fragen. Die Filterung klappt. Aber wenn ich dann aus der gefilterten Liste einen Artikel anklicke und in bearbeiten will, erscheint dann nicht der, sondern ein anderer Datensatz. bspw. habe ich Geeetech ausgewählt. Dann sehe ich alle Datensätze und dann habe ich als bsp. die 22 ausgewählt, aber im nachfolgenden Formular kommt dann der Datensatz 17. Sicher kein großes Probelm. Er nimmt hier wohl dann anstatt die 20 die genaue Position (17) der gefilterten Liste mit.

Gruß saffi
Anzeige
AW: Gerne !
27.07.2024 13:38:37
Onur
Tja, der Rest ist DEIN Code, da habe ich nix geändert. :)
In einer gefilterten Liste steht natürlich alles woanders, und dein Code orientiert sich nur nach ListIndex.
Beste Möglichkeit: Eine Spalte hinzufügen (Spalte S), wo die Zeilennummer drin steht (kannst du ja ausblenden). Dies auch in die Listbox aufnehmen und du kannst dich nach der letzten Spalte der Listbox orientieren, um zu wissen, wo sich der Datensatz auf dem Blatt befindet.
Anzeige
AW: Gerne !
27.07.2024 13:41:35
Onur
Obwohl - du hast ja schon Spalte A - daran kannst du dich genauso orientieren.
AW: Gerne !
27.07.2024 13:45:20
Onur
SO sollte es klappen:
Private Sub Bearbeiten()    

Dim frm As New UserFormLageransichtbearbeiten
frm.aktuelleZeile = ListBoxLager.List(ListBoxLager.ListIndex, 0) + 1 'weil mit 0 begonnen wird und weil eine Überschrift darüber steht!
frm.Show
Call listboxbefuellen
End Sub
Anzeige
AW: Gerne !
27.07.2024 13:49:32
Saffi
;O)

Ich habe jetzt gerade versucht, den Faden zufinden, wo ich genau ansetzen sollte. Und Deine Vorschläge kommen im Minutentakt. Wahnsinn.^^

Du hast mich gerade gerettet. Ich glaube ich hätte wohl möglich wieder die hälfte vom Code so geändert, dass was anderes wieder nicht gefuntz hätte.

ok. Perfekt. Nun sollte ich weiter kommen.

Nochmals besten Dank für Deine Mühe!

gruß saffi
Anzeige
AW: Suchfunktion in bestehender Listfunktion einbinden ...
26.07.2024 17:52:02
Saffi
Achso, es handelt sich hier speziell um die Lageransicht. Ich habe dort ein Suchfeld bereits erstellt. Sorry für die UNordnung!
;

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