Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1808to1812
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
Autofilter per vba
27.01.2021 08:15:22
Jürgen
Hallo, ich bitte um eure Hilfe. Irgendwo ist bei mir der Wurm drinnen.
Ich habe eine Form. auf der befindet sich eine Combobox und eine Listbox.
Die Listbox wird folgendermaßen gefüllt:
ListBox1.RowSource = "A4:f" & Range("f65536").End(xlUp).Row
nun versuche ich durch das Change Event der Combobox meine Liste zu filtern:
Dim Liste As Range
Set Liste = ActiveSheet.Range("A3:h3")
Liste.autofilter
Liste.autofilter Field:=7, Criteria1:=ComboBox2.Value 
manchmal funktioniert es manchmal nicht, ich vermute es liegt irgendwie daran ob der Autofilter ein oder ausgeschaltet ist. Ich komme jedoch nicht drauf.
Ich bedanke mich schon jetzt für eure Hilfe
lg Jürgen

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Autofilter per vba
27.01.2021 08:23:16
ChrisL
Hi Jürgen
Wenn ich raten müsste. Manchmal ist nicht das richtige Blatt aktiv.
Ersetze ActiveSheet durch Worksheets("Tabelle1")
Ansonsten wird eine Beispieldatei benötigt, womit man das Problem nachvollziehen kann.
cu
Chris
bringt nix
27.01.2021 08:59:58
ChrisL
damit kann ich nichts nachvollziehen
AW: bringt nix
27.01.2021 09:11:24
Jürgen
Sorry, hab die Excel Liste falsch abgespeichert. jetzt müsste es passen
https://www.herber.de/bbs/user/143347.xlsm
Anzeige
AW: bringt nix
27.01.2021 09:45:49
ChrisL
Hi Jürgen
Da du die ComboBox via RowSource füllst, führt eine Änderung des Filters zum Change der ComboBox, was das Change-Event erneut ausführt. Du landest quasi in einer Endlosschleife.
Die ListBox ist irrelevant.
Public b As Boolean
Private Sub ComboBox1_Change()
If b Then Exit Sub
b = True
With Tabelle1.Range("A3:E3")
.AutoFilter
.AutoFilter Field:=5, Criteria1:=ComboBox1.Value
End With
b = False
End Sub
Private Sub UserForm_Activate()
ComboBox1.RowSource = "e4:e" & Tabelle1.Cells(Rows.Count, 5).End(xlUp).Row
End Sub
cu
Chris
Anzeige
AW: bringt nix
27.01.2021 10:12:06
Jürgen
Hi Chris, danke erstmal. Nur leider funktioniert es nach wie vor nicht
Userbild
komisch
27.01.2021 10:23:04
ChrisL
Hi
Mit deiner Beispieldatei hat es funktioniert.
Ziemlich eigenartig ist, dass Excel autofilter nicht automatisch in AutoFilter auskorrigiert.
Vielleicht ist deine Datei inzwischen ganz generell "vermurkst" (z.B. verlorene Verweise im Menü Extras). Da bin ich überfragt.
Aber wie schon beim ersten Beitrag, ist deine Problembeschreibung mangelhaft. Du verrätst uns nicht einmal die Fehlermeldung und anhand eines Screenshots kann man keinen Fehler rekonstruieren.
cu
Chris
Anzeige
AW: komisch
27.01.2021 10:28:54
Jürgen
Hi Chris, folgender Fehler wird ausgespuckt:
Bezeichner unter dem Cursor nicht erkannt
offen
27.01.2021 10:35:31
ChrisL
fällt mir nix mehr ein
AW: offen
27.01.2021 11:57:26
Jürgen
Hi Chris.
Ich hab das mal so umgebaut damit zumindest keine Fehler mehr kommen:
Private Sub CommandButton11_Click()
On Error GoTo ErrorHandler
If b Then Exit Sub
b = True
With Sheets("daten").Range("a3:i3")
.autofilter
.autofilter Field:=7, Criteria1:=ComboBox2.Value
End With
b = False
ErrorHandler:
Resume Next
ListBox1.RowSource = "A4:f" & Sheets("daten").Cells(Rows.Count, 1).End(xlUp).Row
End Sub
Was mir dabei auffällt. Wähle ich in der Combobox den Wert aus Zeile 1 aus funktioniert der Filter
mit
ListBox1.RowSource = "A4:f" & Sheets("daten").Cells(Rows.Count, 1).End(xlUp).Row

Lade ich im Anschluss die Listbox wieder, alle benötigten Einträge sind da (in der Tabelle wird die gewünschte Spalte mit dem gewünschten Wert ausgewählt)
Wähle ich im Anschluss in der Combobox den Wert aus Zeile 2 werden in der Listbox wieder beide Zeilen angezeigt (in der Tabelle wird die gewünschte Spalte mit dem gewünschten Wert ausgewählt)
Also irgendwie werden da in meiner Listbox nicht die richtigen Wert geladen. Hast du ne Ahnung was ich falsch mache?
Muss ich vorher die Listbox irgendwie leeren?
Anzeige
AW: offen
27.01.2021 13:20:58
ChrisL
Hi Jürgen
Wenn du die Fehler einfach überspringst ist klar, dass du keine Fehlermeldungen mehr bekommst. Aber ein Endlosschleife solltest du definitiv nicht mittels Error-Handling abwürgen.
Wahrscheinlich hast du meinen Beispielcode nicht übernommen und Public b As Boolean einfach ausgelassen.
Zudem schau mal unter Extras, Verweise, ab da nicht etwas "gebrochen" ist (mal mit den Verweisen einer neuen Mappe vergleichen).
Nachfolgend wird die Listbox "dynamisch" geladen (n.b. auf eine Array-Lösung habe ich entsprechend dem Level bewusst verzichtet). Hiermit musst du jedoch auf ColumnsHeads verzichten und die Überschriften bei Bedarf manuell mittels Text-Label oberhalb der Listbox einfügen. Beides geht leider nicht, weil ColumnHeads nur mit RowSource funktioniert, aber damit lässt sich die Listbox nicht dynamisch gestalten.
Und die ComboBox habe ich dir ebenfalls angepasst. Sollte die letzte Zeile gefiltert sein, dann wäre diese mit dem bisherigen Code nicht in die ComboBox aufgenommen worden.
Public b As Boolean
Private Sub ComboBox1_Change()
If b Then Exit Sub
b = True
With Tabelle1.Range("A3:E3")
.AutoFilter
.AutoFilter Field:=5, Criteria1:=ComboBox1.Value
End With
Call LBladen
b = False
End Sub
Private Sub UserForm_Initialize()
' ListBox1.ColumnCount = 5  ' entfernen und direkt in der LB-Eigenschaft definieren
' LB-Eigenschaft ColumnHeads muss neu = False sein
Call LBladen
With Tabelle1.AutoFilter.Range
ComboBox1.RowSource = "e4:e" & .Rows.Count + .Row - 1
End With
End Sub
Private Sub LBladen()
Dim lngZeile As Long
ListBox1.Clear
With Tabelle1
For lngZeile = 4 To .Cells(Rows.Count, 5).End(xlUp).Row
If .Rows(lngZeile).Hidden = False Then
ListBox1.AddItem .Cells(lngZeile, 1)
ListBox1.List(ListBox1.ListCount - 1, 1) = .Cells(lngZeile, 2)
ListBox1.List(ListBox1.ListCount - 1, 2) = .Cells(lngZeile, 3)
ListBox1.List(ListBox1.ListCount - 1, 3) = .Cells(lngZeile, 4)
ListBox1.List(ListBox1.ListCount - 1, 4) = .Cells(lngZeile, 5)
End If
Next lngZeile
End With
End Sub
cu
Chris
Anzeige
AW: offen
27.01.2021 16:19:01
Jürgen
Hi Chris, erstmal danke für deine Bemühungen! Ist total nett.
Bei langem herum probieren hab ich irgendwann mal gelesen das der Verweis "F3dynamic" fehlt.
Ich kann mich dunkel erinnern das ich in vergangenheit das schon mal wo gelesen habe und ihn aus versehen gelöscht habe.
Hast du irgendeine Idee wie ich diesen verweis wieder zurück bekomme?
Wie muss ich da vorgehen?
Ich würd dich ja gerne auf ein Bier einladen für deine Mühe aber das wird wohl schwierig werden
Lg Jürgen
AW: offen
28.01.2021 16:35:24
Jürgen
Hi Chris, ich hab das mal übernommen. Aber irgendwo hab ich noch einen Wurm. Beim start der App bekomme ich sofort die Meldung: Laufzeitfehler 91 Objektvariable oder With-Blockvariable nicht festgelegt
Irgendwo dürft ich was vergessen haben, hier mal mein Code:

Public b As Boolean
Private Sub ComboBox2_Change()
If b Then Exit Sub
b = True
With Sheets("daten").Range("a3:i3")
.AutoFilter
.AutoFilter Field:=7, Criteria1:=ComboBox2.Value
End With
Call LBladen
b = False
End Sub
Private Sub UserForm_Initialize()
' ListBox1.ColumnCount = 5  ' entfernen und direkt in der LB-Eigenschaft definieren HAB ICH  _
ERLEDIGT
' LB-Eigenschaft ColumnHeads muss neu = False seinHAB ICH ERLEDIGT
Call LBladen
With Sheets("daten").AutoFilter.Range
ComboBox2.RowSource = "e4:e" & .Rows.Count + .Row - 1
End With
Dim lngZeile As Long
ListBox1.Clear
With Sheets("daten")
For lngZeile = 4 To .Cells(Rows.Count, 5).End(xlUp).Row
If .Rows(lngZeile).Hidden = False Then
ListBox1.AddItem .Cells(lngZeile, 1)
ListBox1.List(ListBox1.ListCount - 1, 1) = .Cells(lngZeile, 2)
ListBox1.List(ListBox1.ListCount - 1, 2) = .Cells(lngZeile, 3)
ListBox1.List(ListBox1.ListCount - 1, 3) = .Cells(lngZeile, 4)
ListBox1.List(ListBox1.ListCount - 1, 4) = .Cells(lngZeile, 5)
End If
Next lngZeile
End With
End Sub

Anzeige
AW: offen
28.01.2021 16:53:27
ChrisL
Hi Jürgen
Mal abgesehen davon, dass du diese beiden Zeilen ausgelassen hast:
End Sub
Private Sub LBladen()
LBladen wurde als separate Prozedur ausgelagert. So kannst du die (Unter-)prozedur im Initialize- und im Change-Ereignis mit Call aufrufen, ohne dass du den Code wiederholen musst.
Der Code geht davon aus, dass bereits ein Autofilter gesetzt ist. Vielleicht ist gar kein Autofilter mehr vorhanden und der Fehler wird dadurch bei der Initialisierung verursacht. Zur Sicherheit einfach noch einmal setzen (doppelt gemoppelt).
Private Sub UserForm_Initialize()
Call LBladen
Sheets("daten").Range("a3:e3").AutoFilter
With Sheets("daten").AutoFilter.Range
ComboBox2.RowSource = "e4:e" & .Rows.Count + .Row - 1
End With
End Sub
cu
Chris
Anzeige
AW: offen
28.01.2021 18:27:20
Jürgen
Hi Chris.
Nun is es so das ich immer 2 x auf "Ausführen" klicken muss. Beim 2. mal funktionierts dann immer. Beim 1. mal bekomme ich die Meldung von oben.
Der Filter funktioniert nun endlich.
3 kleine Problemchen:
1.) wie schaffe ich es das in der Combobox doppelte Einträge verhindert werden
2.) In meiner Tabelle habe ich 2 Spalten (D und E)die in folgendem Format vorhanden sind "10:00"
Leider werden diese Daten in der Listbox in etwar so angezeigt: "0,25" usw.
3.) Wie lautet der Code um die Listbox zu aktualisieren? Zum Beispiel wenn ich neue Daten einspiele
Ich weis das ist jetzt ziemlich viel, nimms mir bitte nicht übel! Wenn du keine Lust hast auf die 3 Fragen zu antworten ist es Ok und ich eröffne neue Threads.
Vielen lieben Dank für deine Bemühungen
Lg Jürgen
PS falls die Frage auftaucht wie ich die Daten einspiele:
Dim loletzte As Long
loletzte = Cells(Rows.Count, 1).End(xlUp).Row  'letzte beschriebene zelle in A
loletzte = loletzte + 1                         'erster freie
Range("A" & loletzte).Value = ComboBox1.Text          'wert einfügen
Range("B" & loletzte).Value = TextBox2.Text
usw..........

Anzeige
geschlossen (neuer Beitrag)
29.01.2021 09:41:59
ChrisL
Hi Jürgen
Ich klinke mich langsam aus. Bitte erstelle einen neuen Beitrag (mit Link auf diesen Beitrag) und bitte nimm dir Zeit für eine konkrete und "saubere" Musterdatei. Die Komplexität nimmt u.a. mit Duplikaten und Datentypen (Zeit/Zahl und Text) zu und du wirst Mühe bekommen, die Lösungen zu adaptieren, wenn du nicht mit einem konkreten Beispiel daher kommst.
Nun is es so das ich immer 2 x auf "Ausführen" klicken muss. Beim 2. mal funktionierts dann immer. Beim 1. mal bekomme ich die Meldung von oben.
kann ich nicht nachvollziehen
1.) wie schaffe ich es das in der Combobox doppelte Einträge verhindert werden
Bitte neuer Beitrag. Wichtig sind Details wie Datentyp (Text, Zahl etc.) und Sortierung...
2.) In meiner Tabelle habe ich 2 Spalten (D und E)die in folgendem Format vorhanden sind "10:00"
Leider werden diese Daten in der Listbox in etwar so angezeigt: "0,25" usw.

ListBox1.List(ListBox1.ListCount - 1, 4) = Format(.Cells(lngZeile, 5), "HH:MM")
3.) Wie lautet der Code um die Listbox zu aktualisieren? Zum Beispiel wenn ich neue Daten einspiele
Wenn du LBladen wie vorgeschlagen in eine separate Prozedur ausgelagert hast, dann kannst das Update mit Call LBladen aufrufen.
PS falls die Frage auftaucht wie ich die Daten einspiele:
Wenn du Zahlenwerte als Text in die Tabelle überträgst, bekommst u.U. Probleme beim nächsten Laden oder bei Berechnungen.
cu
Chris
Anzeige
AW: geschlossen (neuer Beitrag)
29.01.2021 14:52:00
Jürgen
Hi Chris.
Danke vielmals du hast mir da echt weiter geholfen.
Es lag daran:
Call LBladen
Worksheets("daten").Range("a3:h3").AutoFilter
Worksheets("daten").Range("a3:h3").AutoFilter
Du hattest es zwar schon einmal erwähnt, aber da hab ich nicht ganz verstanden was du meinst.
Jetzt geht alles!
Perfekt danke!
Lg Jürgen
AW: geschlossen (neuer Beitrag)
29.01.2021 15:22:39
Jürgen
Hi Chris.
Danke vielmals du hast mir da echt weiter geholfen.
Es lag daran:
Call LBladen
Worksheets("daten").Range("a3:h3").AutoFilter
Worksheets("daten").Range("a3:h3").AutoFilter
Du hattest es zwar schon einmal erwähnt, aber da hab ich nicht ganz verstanden was du meinst.
Jetzt geht alles!
Perfekt danke!
Lg Jürgen
AW: geschlossen (neuer Beitrag)
29.01.2021 18:07:13
ChrisL
supi... freut mich, dass es funktioniert
Verweis "F3dynamic" fehlt
27.01.2021 17:34:12
ChrisL
Hi Jürgen
Neues Thema:
https://www.herber.de/forum/messages/1808741.html
Bei langem herum probieren hab ich irgendwann mal gelesen das der Verweis "F3dynamic" fehlt.
Ich kann mich dunkel erinnern das ich in vergangenheit das schon mal wo gelesen habe und ihn aus versehen gelöscht habe.
Hast du irgendeine Idee wie ich diesen verweis wieder zurück bekomme?
Wie muss ich da vorgehen?

Mit Verweisen kenne ich mich wenig aus und insbesondere die erwähnte Bibliothek habe ich noch nie benötigt. Nicht dass ich eine Lösung bereit hätte, aber trotzdem mal nachgefragt:
Benutzt du spezielle Controlls (vielleicht ein Kalender Steuerelement)? Falls ja, weg damit und Standard-Steuerelemente verwenden (z.B. Datumspicker auf Basis Userform)
Welche Aktion löst die Fehlermeldung aus?
Welche Windows-, Office-, Excel-Version benutzt du?
Wird der Code Sheets("daten").Range("a3:i3").autofilter in einer neuen leeren Mappe angewendet auch so geschrieben (d.h. autofilter korrigiert sich nicht automatisch in AutoFilter)?
Bekommst du auch in anderen Dateien Fehlermeldungen?
Hiernach bestünde ein Zusammenhang von F3dynamic mit mscal.ocx
https://www.pcreview.co.uk/threads/f3dynamic-library.2836152/
Hier ein zufälliges Fundstück aus dem Netz (Anwendung auf eigene Gefahr!):
https://www.exefiles.com/de/ocx/mscal-ocx/
Bevor ich der Anweisung im letzten Link folgen würde, würde ich wohl eher mal eine vollständige Maleware-/Virenprüfung durchführen, Office Repair aktivieren und wenn auch das nicht hilft eine vollständige Deinstallation und Neuinstallation von Office durchführen.
Aber eben, eigentlich habe gar keinen Plan was F3dynamic oder mscal.ocx bedeutet.
cu
Chris
AW: Verweis "F3dynamic" fehlt
27.01.2021 19:52:44
Jürgen
Hallo Chris.
Die Office reperatur hat nichts verändert.
Die Filter funktionieren in der Excel Tabelle nur leider werden sie mir in der Listbox nicht korrekt angezeigt.
Es funktioniert ohne Fehlmeldungen.
Hier der Code wie ich die Listbox und Combobox mit Daten befülle:

Private Sub UserForm_Activate()
ListBox1.ColumnCount = 6
ListBox1.ColumnHeads = True
ListBox1.RowSource = "A4:f" & Sheets("daten").Cells(Rows.Count, 1).End(xlUp).Row
ComboBox4.RowSource = "A4:A" & Sheets("daten").Cells(Rows.Count, 1).End(xlUp).Row
end sub
nun im Change Event der Combobox:
Public b As Boolean
Private Sub ComboBox4_Change()
If b Then Exit Sub
b = True
With Sheets("daten").Range("a3:i3")
.autofilter
.autofilter Field:=1, Criteria1:=ComboBox4.Value
ListBox1.RowSource = "A4:f" & Worksheets("daten").Cells(Rows.Count, 1).End(xlUp).Row
End With
b = False
End Sub
ändere ich nun den Inhalt der Combobox sehe ich das in der Excel Tabelle die Filter richtig arbeiten. Nur wie gesagt in die Listbox werden sie nicht korrekt übergeben.
autofilter wird automatisch in "autofilter" geändert
Office 360
Wünsche einen schönen Abend
AW: Verweis "F3dynamic" fehlt
28.01.2021 08:18:15
ChrisL
Hi
Es sind zwei verschiedene Themen.
Dieser Ast/Faden ist für dein Verweisproblem gedacht, was nichts mit der Listbox zu tun hat.
Zur Listbox bitte im anderen Ast bleiben und meinen Input und Mustercode annehmen:
https://www.herber.de/forum/messages/1808705.html
cu
Chris

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige