Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1792to1796
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array in ListBox filtern

Array in ListBox filtern
10.11.2020 20:32:03
Peer
Hallo und guten Abend.
Durch je Menge Hilfe durch dieses Forum habe ich ein Projekt erstellt, dass Ausmaße eines fast richtigen Programmes hat.
Dafür muss ich nachfolgend allen ehemalige und auch zukünftigen Helfern danken.
Trotzdem bleiben für mich als VBA-Anfänger noch einige Fragen offen.
Eine Frage ist...
Kann ich bei dem Array, das bestimmte Daten über mehrere Blätter enthält, für die mehrspaltige ListBox auch einen Filter setzen, der in erster ComboBox (cbx_FilterMonat) mit Auswählen des Monats die Einträge nach Monat anzeigt?

Private Sub UserForm_Initialize()
'----------- ListBox mit Daten von allen Sheets füllen mit Hilfe von ralf_b von herber.de ------ _
Dim lngMonth As Long, ialngIndex As Long, lngRow As Long
Dim lngColumn As Long, lngDauer As Long
Dim datBeginn As Date, datEnde As Date, strBeginnOrt As String
Dim strEndeOrt As String, strReiseOrt As String
Dim avntValues() As Variant, avntTemp As Variant, vntItem As Variant
Dim datAbgabe As Date, datAnnahme As Date, datGezahlt As Date
For lngMonth = 1 To 2 'auf 12 Monate erhöhen!!!
lngRow = 12
With Worksheets(MonthName(Month:=lngMonth))
Do
If IsEmpty(.Cells(lngRow + 1, 26).Value) Then
lngRow = .Cells(lngRow, 26).End(xlDown).Row
Else
lngRow = lngRow + 1
End If
If lngRow = 24
avntTemp(1, 7) = "24:00"
If strBeginnOrt = "A" Or strEndeOrt = "A" Then
avntTemp(1, 8) = "40,00 €"
ElseIf strBeginnOrt = "I" Or strEndeOrt = "I" Then
avntTemp(1, 8) = "40,00 €"
Else
avntTemp(1, 8) = "28,00 €"
End If
Case Is > 8
If strBeginnOrt = "A" Or strEndeOrt = "A" Then
avntTemp(1, 8) = "27,00 €"
ElseIf strBeginnOrt = "I" Or strEndeOrt = "I" Then
avntTemp(1, 8) = "27,00 €"
Else
avntTemp(1, 8) = "14,00 €"
End If
Case Else
avntTemp(1, 8) = "Fehler"
Debug.Print vntItem
End Select
For Each vntItem In avntTemp
Select Case lngColumn
Case 2, 5, 7
avntValues(lngColumn, ialngIndex) = Format$(vntItem, "Hh:Nn")
lngColumn = lngColumn + 1
Case Else
avntValues(lngColumn, ialngIndex) = vntItem
lngColumn = lngColumn + 1
End Select
Next
'schreibt den Tabellennamen und die Zeile getrennt durch ein Pipe in das  _
Array
'wird für das Click-Event lst_Dienstreise benötigt
avntValues(12, ialngIndex) = MonthName(Month:=lngMonth) & "|" & CStr(lngRow) _
ialngIndex = ialngIndex + 1
Else
Exit Do
End If
Loop
End With
Next
lst_Dienstreise.Column = avntValues
'--------- Ende Füllen ListBox ---------------------------------------------------------------
'--------- ComboBox "Monat" mit Monatsnamen vom Sheet füllen ---------------------------------
Dim j As Integer
cbx_FilterMonat.AddItem "alle Monate"
For j = 1 To 2  'auf 12 Monate ändern
cbx_FilterMonat.AddItem Worksheets(j).name
Next j
cbx_FilterMonat.ListIndex = 0   'ersten Eintrag als Standard
'--------- ComboBox "Reisezweck" füllen -------------------------------------------------------- _
cbx_FilterZweck.AddItem "alle Reisezwecke"
cbx_FilterZweck.ListIndex = 0
'--------- ComboBox "offene Abrechungen" füllen ------------------------------------------------ _
cbx_FilterOffen.AddItem "keine"
cbx_FilterOffen.ListIndex = 0

https://www.herber.de/bbs/user/141457.xlsm
Wie kann ich bei den drei ComboBoxen die Filter setzen, die vielleicht sogar noch untereinander in Abhängigkeit sind.
Also im Monat "Januar" keine "keine eingereicht"en Abrechnungen vorhanden sind, der ComboBox-Eintrag auch nicht angeboten wird.
Gruß
Peer

30
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array in ListBox filtern
11.11.2020 12:52:48
Peer
Hallo ralf_b.
Danke für diesen Link. Ich hatte das Web lange Zeit durchforstet, da ist dieser Link wahrscheinlich durchgerutscht.
Dann werde mich ich heute Abend mal hinsetzen und verstehen und probieren.
LG
Peer
AW: Array in ListBox filtern
11.11.2020 11:24:09
Matthias
Moin!
Den Filter müsstest du dir selbst basteln. Klingt jetzt aber schwieriger als es ist. Du durchläufst deine Listbox von unten nach oben. In jeder zeile prüfst du deine Filteroptionen (Einträge in den Combos) und wenn die Einträge damit nicht übereinstimmen, löscht du die Zeile aus der Liste.
Am Ende hast du deine gefilterte Liste. Ich habe mir meist in einem globalen Array die Liste vorher "zwischengespeichert". Das hat den Vorteil, dass du bei einer Änderunge des Filers (evtl. weil man das Falsche ausgewählt hatte). Nicht die urspr. Liste wieder erstellen und dann filtern muss. Man spiegelt dann einfach die alte Liste in die Listbox und filtert wieder. Spart meist Rechenzeit.
Hinweis noch zur Funktion Filter. Die geht m.W. nur bei eindimensionalen Arrays. Da du mehrere Spalten hast, sollte das da vermtl. nicht gehen.
VG
Anzeige
AW: Array in ListBox filtern
11.11.2020 12:49:17
Peer
Hallo Matthias.
Danke für deine Info.
Das ist ja Schade, das das in meinem Fall nicht gehen wird. Dann muss ich die Idee begraben?
Gruß Peer
AW: Array in ListBox filtern
11.11.2020 14:24:21
ralf_b
Wieso sollte das nicht gehen? Du hast doch schon mit Arrays zutun. Die Liste durchgehen und die drei Werte aus den Spalten abfragen ist keine Aktion.
brauchst nur noch einen Knopf ,der dir die gesicherte Komplettliste wieder einspielt. So eine Filter reset
AW: Array in ListBox filtern
11.11.2020 17:38:23
Peer
Ok, ralf_b.
Ich werde mal deine Link durchgehen und probieren.
AW: Array in ListBox filtern
11.11.2020 20:37:43
Peer
Hallo ralf_b.
Da klingt bei dir so einfach, für dich ist es bestimmt auch.
Durch Matthias Erläuterungen bin ich ein wenig dahinter gestiegen.
Mal sehen, was ich diese Woche mit euren Tipps anstelle.
Gruß
Peer
Anzeige
AW: Array in ListBox filtern
11.11.2020 15:30:05
Matthias
Moin!
Wie Ralf schon schrieb, brauchst du deine Idee nicht aufgeben. Lediglich die Funktion geht halt nicht. Wie ich es schon kurz beschrieben haben und Ralf auch andeutete, eine Schleife durch die Liste und selber filtern. Sieht schnell programmiert ungefähr so aus:
Dim Zwischenspeicher
Private Sub CommandButton2_Click()
'filtern
Dim zeile As Long
Dim löschen As Boolean
'Liste aktuelle eintragen
Me.ListBox1.List = Zwischenspeicher
For zeile = ListBox1.ListCount - 1 To 0 '-1 da listcount adie Anzahl angibt beim Zugriff mit  _
listindex aber 0 basiert ein Wert "fehlt"
'jetzt die Prüfung
löschen = False
'PRüfung Spalte 1
If ListBox1.List(zeile, 0)  Combo1 Then löschen = True
'PRüfung Spalte 2
If ListBox1.List(zeile, 1)  Combo2 Then löschen = True
'die Prüfung könnte man auch mit instr() etc. durchführen.
If löschen = true Then Me.ListBox1.RemoveItem (zeile)
Next zeile
End Sub
Dabei vorher beim Initialize bzw. wenn die Listbox gefüllt wurde, den .list in die Variable Zwischenspeicher schreiben. Die lese ich hier vor dem Filtern wieder ein, damit alle Werte rauskommen können. Das kann man aber auch weglassen.
VG
Anzeige
AW: Array in ListBox filtern
11.11.2020 18:03:30
Peer
Hallo Matthias.
Tut mir wirklich leid, ich verstehe hier nicht viel.
Mit "Zwischenspeicher" legst du die kompletten Listeneinträge mit ihren Spalten temporär ab?
Dann prüfst du mit der Schleife die Einträge von der letzten (-0) bis zur ersten Zeile (0), um mit "löschen" was zu machen?
Und bezweckst du mit

'Prüfung Spalte 1
If lst_Dienstreise.List(zeile, 0)  Combo1 Then löschen = True
'Prüfung Spalte 2
If lst_Dienstreise.List(zeile, 1)  Combo2 Then löschen = True
?
Gruß
Peer
AW: Array in ListBox filtern
11.11.2020 19:20:01
Matthias
Moin!
Also das mit dem Zwischenspeicher ist die komplette Liste deiner Listbox. Was ich bei meiner Erklärung meine, ist so eine art Reset wie Ralf es anmerkte. Die speichere ich häufig am Anfang. Damit kann kann man die Liste dann wieder in den Ausgangspunkt bringen. Das sollte aber nicht in dem selben Makro passieren, da du sonst beim Zweiten Anlicken / Ausführen die urspr. Liste mit der neu gefilterten überschreibst. Das Ganze Ding ist aber nur optional.
Jetzt zum Code.
Der Gedanke ist, die Liste direkt in der Listbox zu löschen. Das macht man idR von unten nach oben, da sich bei einem Löschen die Reihenfolge ändert und man das mit beachten musst. Der Code geht deshalb alle Einträge durch. Im Beispielcode war noch ein Fehler. Dort hätte bei der for Schleife ein step -1 reingemusst.
Da die Liste 0 - basiert ist (Zählung beginnt bei 0) die gesamte Anzahl (listcount) aber die Anzahl aller Elemente angibt, musst man das umrechen. Deshalb steht da die -1.
Bspw. die Listbox hat 10 Elemente. Listocunt gibt 10 an. Um In der liste die Elemente anzusprechen, geht man aber vom Index 9 bis 0.
In der Schleife prüfst du deine Kriterien mit der aktuellen Zeile. Stimmt nicht alles überein, soll der Wett in der Liste ja nicht mehr angezeigt werden - also löschen wir sie aus der Liste. Sie ist aber nur in der Liste gelöscht. Die Daten im Blatt bestehen weiterhin.
Ich hoffe das erklärt es ein wenig. Hier mal eine schnell gebastelte Datei. Da kannst du sehen, was ich meine.
https://www.herber.de/bbs/user/141481.xls
Beachte bei den Filtern. In der LIstbox stehen Zahlen in der Combo Text. Deshalb ist beim Prüfen im Code beim zweiten Filter noch eine Typumwandlung (clng).
Alternativ könntest du natürlich auch die Daten aus der Listbox in ein Blatt (ggf. dafür temporär angelegt) kopieren und dort mit dem Autofilter arbeiten. Anschließend die Daten wieder zurück in die Listbox schreiben. Dauert aber m.E. wesentlich länger.
Soweit erstmal. Kann mir von dem Rechner aus deine Datei nicht ansehen - wird erst morgen was. Dashalb habe ich das mal nur so erklärt ohne auf dein Problem anzupassen.
VG
Anzeige
AW: Array in ListBox filtern
11.11.2020 20:34:45
Peer
Hallo Matthias.
Vielen Dank für deine verständliche Erläuterung. Vieles davon habe ich nun verstanden und ist nachvollziehbar.
Ich habe mir deine Datei mal angeschaut und durchgespielt und festgestellt, dass meine Gedanken gar nicht so weit von deinen entfernt waren. Aber vielleicht ist es auch nur Aberglaube. ;-)
Bin auf deine Antwort von morgen gespannt. Inzwischen werde ich mich noch ein bisschen mit den Codes beschäftigen.
Guten Abend.
Peer
AW: Array in ListBox filtern
11.11.2020 23:37:30
ralf_b
Hallo Peer,
bitteschön. macht nen Fuffi.
Option Explicit
Private mBaseArray As Variant
Dim bInitcombo As Boolean
Private Sub cbx_FilterMonat_Change()
If Not bInitcombo Then filterListbox
End Sub
Private Sub cbx_FilterOffen_Change()
'If Not bInitcombo Then filterListbox
End Sub
Private Sub cbx_FilterZweck_Change()
If Not bInitcombo Then filterListbox
End Sub
Private Sub CommandButton1_Click()
'reset button noch einfügen
lst_Dienstreise.Clear
lst_Dienstreise.List = mBaseArray
End Sub
dieser Abschnitt ist der untere teil des Initialize
   lst_Dienstreise.Column = avntValues
mBaseArray = lst_Dienstreise.List
'--------- Ende Füllen ListBox ---------------------------------------------------------------
bInitcombo = True
'--------- ComboBox "Monat" mit Monatsnamen vom Sheet füllen ---------------------------------
Dim j As Integer
cbx_FilterMonat.List = Array("alle Monate", "Januar", "Februar", "März", "April", "Mai", " _
Juni", "Juli", "August", "September", "Oktober", "November", "Dezember")
cbx_FilterMonat.ListIndex = 0   'ersten Eintrag als Standard
'--------- ComboBox "Reisezweck" füllen ---------------------------------------------------- _
cbx_FilterZweck.AddItem ("alle Reisezwecke")
Dim x As Range
For Each x In Worksheets("Parameter").Range("Reisezweck")
cbx_FilterZweck.AddItem (x.Value)
Next
cbx_FilterZweck.ListIndex = 0
'--------- ComboBox "offene Abrechungen" füllen -------------------------------------------- _
cbx_FilterOffen.List = Array("keine", "nicht eingereicht", "nicht abgerechnet", "nicht  _
bezahlt")
cbx_FilterOffen.ListIndex = 0
bInitcombo = False
End Sub
Ende Initialize
'filtermakro
Sub filterListbox()
'filtern
Dim artemp
Dim zeile As Long, cnt As Long, i As Integer
Dim bFundZweck  As Boolean
Dim bFundMonat As Boolean
Dim bFundStatus As Boolean
lst_Dienstreise.Clear
ReDim artemp(0 To UBound(mBaseArray, 2), 0 To 0)
cnt = 0
For zeile = LBound(mBaseArray, 1) To UBound(mBaseArray, 1)
bFundZweck = False
bFundMonat = False
bFundStatus = False
'PRüfung Spalte 1
If cbx_FilterZweck = cbx_FilterZweck.List(0) Or _
mBaseArray(zeile, 0) = cbx_FilterZweck Then bFundZweck = True
'Prüfung spalte 2
If cbx_FilterMonat = cbx_FilterMonat.List(0) Or _
Format(mBaseArray(zeile, 1), "mmmm") = cbx_FilterMonat Then bFundMonat = True
If cbx_FilterOffen = cbx_FilterOffen.List(0) Or _
mBaseArray(zeile, 1) = cbx_FilterOffen Then bFundStatus = True
If bFundZweck And bFundMonat Then 'And bFundStatus Then  'wenn zeile nicht  _
herausgefiltert wird
'array dimensionieren
ReDim Preserve artemp(0 To UBound(mBaseArray, 2), 0 To cnt)
'zeile zusammenbauen
For i = 0 To UBound(mBaseArray, 2)
artemp(i, cnt) = mBaseArray(zeile, i)
Next
'hochzählen
cnt = cnt + 1
End If
Next zeile
'liste füllen
If UBound(artemp, 2) = 0 Then
lst_Dienstreise.AddItem "Keine Filterergebnisse"
Else
lst_Dienstreise.Column = artemp
End If
Erase artemp
End Sub

Anzeige
AW: Array in ListBox filtern
12.11.2020 15:44:36
Peer
Hallo ralf_b.
Vielen Dank, dass du dich am Abend noch it meinem Problem beschaäftigt hast und gleich eine Lösung gebarcht hast.
Aber so einfach sieht es nicht aus, wie du vorher geschrieben hast. ;-)
Ich bin deinen Code durchgegangen und kann vieles davon mangels Verständnis nicht nachvollziehen, daher habe ich deinen Code einfach mal nur eingesetzt und wollte probieren.
Der Filter "offene Rechnungen" funktioniert noch nicht.
Wo kommen denn die Werte hin, die von datAbgabe (Spalte10), datAnnahme (Spalte11) und _ datGezahlt (Spalte12) abhängig sind? Muss ich für jeden Status diese Abfrage

If cbx_FilterOffen = cbx_FilterOffen.List(0) Or _
mBaseArray(zeile, 1) = cbx_FilterOffen Then bFundStatus = True
neu erstellen?
Also

If cbx_FilterOffen = cbx_FilterOffen.List(0) Or _
mBaseArray(zeile, 10) = cbx_FilterOffen Then bFundStatus = True
für Spalte 10 (datAbgabe)?
If cbx_FilterOffen = cbx_FilterOffen.List(0) Or _
mBaseArray(zeile, 11) = cbx_FilterOffen Then bFundStatus = True
für datAnnahme und

If cbx_FilterOffen = cbx_FilterOffen.List(0) Or _
mBaseArray(zeile, 12) = cbx_FilterOffen Then bFundStatus = True
für datGezahlt?
VG
Peer
Anzeige
AW: Array in ListBox filtern
12.11.2020 16:28:38
ralf_b
Und? wo ist der Fuffi?
die dritte Abfrage funktioniert nicht weil ich nicht weis woher du die Information nehmen möchtest. In der Listbox sehe ich sie nicht. Aber da müssten sie rein.
Die If cbx_FilterOffen = cbx_FilterOffen.List(0) .... bedeutet das entweder der erste Wert(kein Filter) oder ein combo-Listenwert mit dem Datensatz übereinstimmen muß, um die Variable auf true zu setzen. Wenn die Variable auf true steht, dann wird der Datensatz für die Listbox berücksichtigt.
Der erste Teil der Abfrage ist notwendig weil sonst der Datensatz für die anderen Abfragen combo 1 und combo2 nicht berücksichtigt werden würde. Um das zum Funktionieren zu bringen hat es schon etwas gedauert. Ich mach das auch nicht jeden Tag.
Der Ablauf ist aber so einfach wie vorher beschrieben.
Anzeige
AW: Array in ListBox filtern
12.11.2020 16:54:17
Peerli
Hallo ralf_b.
Bin leider noch unterwegs und kann nur auf dem Handy lesen und antworten.
Die drei Werte z.B für "nicht eingereicht" (also Variable datAbgabe="") werden zwar nicht angezeigt, aber sind doch in avntTemp enthalten. Daraus ziehe ich den Wert für lbl_Status in der UF. Respektive den anderen beiden Spalten für datAbgabe und datGezahlt.
Kann man diese Werte nicht nutzen für den Filter?
Gruß Peer
AW: Array in ListBox filtern
13.11.2020 01:04:27
ralf_b
sorry, die sind mir irgendwie durchgerutscht.
kommentar zeichen wegnehmen
Private Sub cbx_FilterOffen_Change()
If Not bInitcombo Then filterListbox
End Sub
 Dim iOffset As Integer
für die dritte prüfung. im Fall das der entsprechende Wert null ist wird die zeile angezeigt
Select Case cbx_FilterOffen
Case "nicht eingereicht": iOffset = 0
Case "nicht abgerechnet": iOffset = 1
Case "nicht bezahlt": iOffset = 2
Case Else
End Select
If cbx_FilterOffen = cbx_FilterOffen.List(0) Or _
mBaseArray(zeile, 9 + iOffset) = 0 Then bFundStatus = True
If bFundZweck And bFundMonat And bFundStatus Then  'wenn zeile nicht herausgefiltert wird

Anzeige
AW: Array in ListBox filtern
13.11.2020 12:51:46
Peer
Hallo ralf_b.
Funktioniert (fast) super. Vielen Dank.
Du mußt aber zugeben, daß es so einfach nicht wahr. Zumindest nicht für einen Laien wie mich.
Mit "fast" meinte ich, das für den Filter in cbx_FilterZweck der Bereich einer Tabelle genommen wird. Aber wenn sich der Bereich ändert, z.B. weil sich die Bezeichnung der Einträge ändert, oder einer gelöscht wurde, funktioniert die Suche nicht mehr, da die Einträge in den Monattabellen stehen bleiben und aufgelistet werden in der ListBox.
Daher ist es doch ratsam, den Filter aus der Variable anvtTemp (1,19 zunehmen. Habe ich _ probiert,

'--------- ComboBox "Reisezweck" füllen -------------------------------------------------------- _
Dim x As Range
With cbx_FilterZweck
.AddItem "alle Reisezwecke"
.ListIndex = 0
End With
For Each x In avntTemp (1,1)    'Worksheets("Parameter").Range("Reisezweck")
cbx_FilterZweck.AddItem (x.Value)
Next
aber ohne Erfolg
Wo soll die Spende hin? ;-)
Noch eine
LG
Peer
Anzeige
AW: Array in ListBox filtern
13.11.2020 18:43:02
ralf_b
ich nehme auch amazon gutscheine. :)
@ralf_b / @Nepumuk Array in ListBox filtern
14.11.2020 10:36:10
Peer
Hallo ralf_b und Nepumuk.
Eigentlich dachte ich, es war nur Spaß. Bis jetzt hatte ich in Foren auch nie erwartet, dass Hilfe etwas kostet.
Ich möchte mich nochmals bedanken und eine Ausnahme machen und eure Mühe honorieren, aber so fair sein, da Nepumuk hier auch einen wesentlichen Anteil daran hatte, die Spende zu teilen und ihn die Hälfte zukommen zu lassen. Bleibt nur zu hoffen, das nicht alle hier jetzt einen Nebenjob gefunden haben.
Also wie soll die Spende zu euch kommen?
Ich möchte erwähnen, das viele User hier uns Laien mit Leidenschaft geholfen haben, dabei vielleicht selbst etwas noch dazugelernt haben, und daher ein sehr wichtiger Teil dieses Forums sind (wenn nicht sogar DAS Excel-Forum überhaupt) und ihr mit eurem Wissen dazu beigetragen habt und es hoffentlich auch noch weiterhin tut.
Gruß
Peer
AW: @ralf_b / @Nepumuk Array in ListBox filtern
14.11.2020 12:29:32
Matthias
Moin!
Kam gestern nicht mehr dazu, die Datei hochzuladen. Auch wenn ihr jetzt schon eine Lösung habt, würde ich es nachholen. Ist aber eine abgespeckte Version. Wie in der Vergangenheit lässt dein Userform tag mein Excel kapitulieren. Desalb musste ich mir deine relevanten Blätter erst importieren und die Datei zusammenbasteln. Sind deshalb nur die UF und 3 Blätter drin. Zum Aufruf der UF sind oben zwei Button drin.
https://www.herber.de/bbs/user/141547.xlsm
Auch wenn du es nicht mehr brauchst, kannst du dir es ja anschauen.
Achja - mich bitte nicht an irgendwelchen Zahlungen beteiligen.
Zu deinem letzen noch unbeantworteten Problem:
Da ich nicht den aktuellen Code habe, nehme ich mal die vorliegenden Dateien und die Codesegmente hier. Demnach müsste der Zweck nicht in anvtTEmp sondern in anvtvalues stehen. Und dort in der ersten Spalte. Daher solltest du einem deinem Codeteile es so einbauen (ungetestet):
        cbx_FilterZweck.AddItem avntTemp (0,0)
Wobei du da eine Schleife brauchst. Dein For each bezieht sich ja nur auf ein Element, dass in (1,1) bzw. (0,0). Du müsstest da durch die Spalte 1 (index 0 im Array) gehen. Zudem müsstest du dir da merken, was schon erfasst wurde, sonst kommen die Werte doppelt
Ich habe das in meiner Datei in eine Sub ausgelagert und ein wenig anders gelöst. Die rufe ich auch nach dem Change des Monats auf, da dann ggf. andere Zwecke vorliegen und die CB aktualisiert werden müsste. Falls du / ihr das braucht, kann man das wohl auch in eure jetzige Datei rüberkopieren.
VG
AW: @ralf_b / @Nepumuk Array in ListBox filtern
14.11.2020 14:14:12
Peer
Hallo Matthias.
Genial, wie du es gelöst hast.
Ich habe deine Beispiel-Datei angeschaut und ausprobiert. Und es es macht alles, wie ich es mir vorgestellt habe und musste den gesamten Code gleich mal in meiner Datei probieren. Und alles funktioniert immer noch, wie gewollt. Prima!
Trotzdem habe ich mit ral_b und Nepumuk's Code weiter gespielt und deinen Vorschlag

cbx_FilterZweck.AddItem avntTemp (0,0)
ausprobiert und auch die Schleife

'--------- ComboBox "Reisezweck" füllen --------------------------------------------------------
Dim x
With cbx_FilterZweck
.AddItem "alle Reisezwecke"
.ListIndex = 0
End With
For Each x In avntTemp(0, 0)
cbx_FilterZweck.AddItem (x.Value)
Next
durchlaufen lassen.
Der Debugger bringt immer Laufzeitfehler 9 (Index...)
auch

For Each x In avntTemp(1, 1)
ohne Erfolg. "Typ unverträglich"
Ich habe es probiert mit avntValues und mBaseArray, aber es kam immer der Debugger, entweder mit Laufzeitfehler 9 oder 13.
Also ich habe noch keine Lösung gefunden, wie ich im Code von ralf_b bzw Nepumuk auf die erste Spalte des Arrays der ListBox zugreife und den Wert ohne doppelte Einträge in die ComboBox zu bekommen.
Warum du immer noch das Problem mit meiner UF hast, verstehe ich nicht. Andere User, die die Datei geöffnet haben, meldeten noch keine Fehler. Oder täusche ich mich hier?
Ich möchte mich nochmal ausdrücklich bei dir bedanken, Matthias. Du bist einfach ein Profi und ein sehr hilfreicher Mensch. Ich wünschte, ich kenne mich hiermit auch gut aus und könnte mit der selben Leidenschaft ran gehen, wie du. Aber ich bin leider beruflich ein "praktischer" bzw. handwerklicher Mensch und für mich sind die Codes, die ihr für logisch hält, oftmals unlogisch.
Deshalb bin ich froh, hier von so vielen Leuten Hilfe zu bekommen. Und du gehörst definitiv dazu.
Und das du dafür nicht mal Geld haben möchtest, zeigt, wie viel Spaß du daran hast, anderen zu helfen. Ehrenwert.
Gruß
Peer
bis denne
14.11.2020 15:01:29
ralf_b
Moin Peer,
freut mich das du von Matthias die geniale Lösung ohne Zahlungsaufforderung erhalten hast.
Dennoch bin ich etwas erstaunt das du dich über meine Anfrage so irritiert zeigst. Immerhin beschäftigst du hier schon mehrere Menschen über Tage, die dir hier deinen Code zusammenschreiben.
Wo bitteschön bekommt man das noch umsonst? Es ist auch klar das du die Codes beruflich nutzt und somit auch ein monetäres Interesse deinerseits damit verbunden ist.
Diese Foren sind nicht dazu da dir deine beruflichen Aufgaben abzunehmen. Wir wollen Hilfestellungen geben. Aber in deinem Fall ist es schon ein bisschen Mehr. Das kannst du kaum abstreiten. Für Auftragsprogrammierung gibt es andere Forenteile. Klar gibt es immer mal Leute, auch zum Teil ich selbst, die solche Aufgabenstellungen als Herausforderung sehen und sich selbst damit weiterbilden. Aber auf der anderen Seite gibt es immer wieder mal Leute, die das ausnutzen.
In Anbetracht der Programmteile, die du hier gezeigt hast, sollte man annehmen, das diese deine Kenntnisse widerspiegeln und die Erklärungen zum Code dir bei bestimmten Problembereichen die Stolpersteine aus dem Wege räumen können. Doch dein letzter Post zeigt mir wiederholt das es so nicht ist.
Den Fuffi kannst du behalten. Diese Art der Wertschätzung scheint dir nicht angebracht. Ok, es wäre eh nur ein symbolischer Wert, der den Aufwand nicht annähernd abdeckt.
Ich bin dann raus.
Gruß
RB
AW: bis denne
14.11.2020 15:29:13
Peer
Hallo ralf_b.
Mir ging es gar nicht um den Fünfziger. Das du dir den verdient hast, habe ich nicht abgestritten und gezahlt hätte ich ihn gern. Aber viele haben mir hier geholfen und dann wäre es fair, allen den symbolischen Fünfziger zu geben. Wo fängt es dann an oder hört auf. Ich war nur überrascht, dass es so etwas in Foren gibt.
Ich gebe dir recht, dass man für größerer Projekte, und schon gar für monetäre, Geld hinlegen wird. Doch dieses Projekt dient nur meiner eigenen Erleichterung in meiner Arbeit und hat nichts mit der Firma zu tun. Eventuell stelle ich 2 Kollegen diese Datei kostenlos zur Verfügung.
Viele Ideen und Arbeiten sind auch von mir und es wäre fatal, von meinem Kollegen hiervon Geld zu verlangen. Also dient alles nicht meinem finanziellen Interesse.
Ich bleibe bei meiner Aussage von vorhin. Die Wertschätzung deiner Hilfe hast du so oder so von mir, egal ob mit symbolischen Werten oder mit Worten.
Nochmal, wie soll ich dir das Geld zukommen lassen.
P.S.
Und ich bin nicht der Einzige hier im Forum, bei denen User über mehrere Tage von vielen Helfern unterstützt werden.
VG
Peer
AW: @ralf_b / @Nepumuk Array in ListBox filtern
14.11.2020 17:02:23
Matthias
Moin!
Also für dein Array geht for each nicht, da es mehrdimensional ist. Da brauchst du eine Schleife über die Arraygröße, bei dir also über die betreffende Spalte. Das kannst du entweder selber fest programmieren oder mit LBOUND(=untere Grenze) und UBOUND(=obere Grenze) automatisch nutzen. Bei dir entstanden zudem die Fehler, da anvt(1,1) kein Array ist sondern nur ein Wert. Um das im bisherigen Code anzupassen, wäre das hier eine Lösung (etwas anders als in meiner Datei - gibt ja aber viele Wege nach Rom).
Damit geht die Schleife an Hand der Grenzen über die 1. Spalte (mit dem Index 0 ). Damit keine Werte doppelt auftreten, habe ich diesmal kein dictinary genutzt sonders das über einen String gelöst. Dabei wird vor jedem Eintragen in die CB geprüft, ob der String schon erfasst wurde. Wenn er eingetragen wird, wird er auch dem String hinzugefügt. Die "@#" dienen dabei zur Absicherung, dass der Wert auch wirklich da ist. Falls sonst ein String gleichzeitig auch ein Teilstring eines anderen Eintrags sein kann, würde es zu Fehlern kommen.
  Dim x, eintrag
With cbx_FilterZweck
.AddItem "alle Reisezwecke"
.ListIndex = 0
End With
For x = LBound(Me.lst_Dienstreise.List) To UBound(Me.lst_Dienstreise.List)
If InStr(1, eintrag, "@#" & Me.lst_Dienstreise.List(x, 0) & "@#", vbTextCompare) =  _
0 Then
cbx_FilterZweck.AddItem Me.lst_Dienstreise.List(x, 0)
eintrag = eintrag & "@#" & Me.lst_Dienstreise.List(x, 0) & "@#"
End If
Next
Den Code müsstest du dann aber auch nach dem Ändern des Monats (in dem Event nach dem Filteraufruf) eintragen, da du sonst keine Abhängigkeit hinbekommst. Deshalb hatte ich den in eine Sub ausgelagert.
VG
ListBox filtern - Fehler abfangen
14.11.2020 18:08:23
Peer
Hallo Matthias.
Diese Lösung arbeitet ebenfalls korrekt. Danke für die zweite Lösung.
Leider ist auch bei dieser Lösung das Problem, das bei fehlenden Einträgen, der Laufzeitfehler 380 angezeigt wird.
Nun habe ich in Userform_Initialize Event den Fehler abfangen wollen

Private Sub UserForm_Initialize()
'----- ListBox mit Daten von allen Sheets füllen mit Hilfe von ralf_b von herber.de ------
On Error GoTo Fehler
Dim lngMonth As Long, ialngIndex As Long, lngRow As Long
Dim lngColumn As Long, lngDauer As Long
Dim datBeginn As Date, datEnde As Date, strBeginnOrt As String
Dim strEndeOrt As String, strReiseOrt As String
Dim avntValues() As Variant, avntTemp As Variant, vntItem As Variant
Dim datAbgabe As Date, datAnnahme As Date, datGezahlt As Date

lst_Dienstreise.Column = avntValues
mBaseArray = lst_Dienstreise.List
Fehler:
If Err.Number = 380 Then
MsgBox "Liste leer", vbOKOnly + vbInformation, "Meldung"
Exit Sub
End If
Es funktioniert zwar auf dem ersten Blick, aber ich bin mir als Laie nicht sicher, ob das auch zukünftig die richtige Lösung ist. Vor allem, weil ich nicht weiß, warum die Fehlermeldung kommt. Ist der Namensbereich von "Reisezweck" der Grund?
Ich schicke nochmal die leicht angepasste Datei.
https://www.herber.de/bbs/user/141560.xlsm
LG
Peer
AW: ListBox filtern - Fehler abfangen
14.11.2020 20:01:43
Matthias
Moin!
Also Fehlermeldung kann man nutzen, aber eigentlich sollte Code so geschrieben sein, dass er Fehler abfängt bzw. durch Prüfungen elemeniert. Problem ist, dass du damit ja jeden Fehler zur selben Meldungen führst. Ich würde es anders machen.
Das Problem bei dir ist eine leere Liste. Dein Array avntvalues ist zwar deklariert (also mit dim angelegt) aber noch nicht initialisiert. Das geschieht erst in der for Schleifen. Wenn nix drin steht, wird der Teil mit der Initialisierung nicht aufgerufen. Deshalb am Ende der Schleifen vor der Zuweisung an die Listbox prüfen, ob dein Array belegt wurde. Sieht dann so aus.
    Next
If (Not Not avntValues) = 0 Then
MsgBox "Liste leer", vbOKOnly + vbInformation, "Meldung"
Exit Sub
End If
lst_Dienstreise.Column = avntValues

Damit kann die Fehlermeldung raus. Zum Prüfen gibt es verschiedene Varianten, ich habe jetzt mal die oben genommen.
VG
AW: ListBox filtern - Fehler abfangen
14.11.2020 20:54:49
Peer
Hallo Matthias.
Ich dachte mir schon, dass es eine vernünftigere Lösung gibt. Ich wusste nur nicht, wo und wie sie gestalten muss.
Not Not Array?
Ok, funktioniert. Besten Dank.
Gruß
Peer
AW: ListBox filtern - Fehler abfangen
14.11.2020 21:24:10
Matthias
Moin!
Wie gesagt gibt mehrere Möglichkeiten das zu prüfen. Ersichtlicher ist vielleicht folgende.
If ialngIndex = 0 Then
MsgBox "Liste leer", vbOKOnly + vbInformation, "Meldung"
Exit Sub
End If
Nur wenn du eine Zeile in der Listbox befüllst, wird ialngIndex größer 0. Das sind deine Zeilen in der Listbox. Wenn nix eingetragen wird, steht die bei 0. UNd wenn das eintritt, ist die Liste leer und würde dann zu deinem Fehler führen.Das kann man sich ggf. besser herleiten als das not not Konstrukt.
VG
AW: ListBox filtern - Fehler abfangen
14.11.2020 21:28:16
Peer
Guten Abend.
Ah, jetzt ist es klar.
Schönen Abend und nochmal danke dafür.
LG
Peer
AW: @ralf_b / @Nepumuk Array in ListBox filtern
14.11.2020 16:16:15
Peer
Hallo Matthias.
Ich habe den Code in mein Projekt integriert und es schien alles prima zu laufen, bis ich aus den Monatsblättern alle bisherigen Eingaben entfernt habe, um ein neues Jahr anzulegen. Jetzt meldet der Debugger einen Laufzeitfehler 380 (Column-Eigenschaft) beim Öffnen der UF. Da jetzt noch keine Einträge in den Blättern sind, vermute ich daher den Fehler.
Ich kann es mir nicht erklären. Wenn keine Einträge vorhanden sind, dann wäre die ListBox in der UF eigentlich leer.
Woran kann es liegen?
Gruß
Peer

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige