Autofilter auf Datum funktioniert nicht
#1
Thumbs Up 
Hallihallo,

ich verzweifle an der depperten Autofilterfunktion in  vba. (Alleine, dass man bei mehr als zwei Kriterien in einem Kriterienarray keine Wilcards in Strings einbauen darf, hat mich Stunden gekostet).
Jetzt hocke ich da und mir raucht der Kopf wegen einem Datumsfilter.

Ausgangslage:
Eine Tabelle mit einer Spalte mit Datumsangaben im Format YYYY-MM-DD. Egal welches Format ich in der Tabelle selbst festlege (auch wenn ich von Standard explizit auf Datum umstelle), bleibts beim String "YYYY-MM-DD".

Maßnahme: Ich bereininge die Daten sowieso schon zeilenweise, also habe ich eine Typkonversion eingebaut: CDate (String).... und damit habe ich dann jede Zelle überschreiben.
=> War erfolgreich. Im VBA-Editor sehe ich jetzt als Typ Variait/Date statt Variant/String und wenn man jetzt in der Tabelle das Datumsformat ändert, dann funktioniert das auch. Auch beim Filter werden jetzt Datumsfilter angezeigt und nicht mehr Textfilter.

Damit kann das Filtern mit Autofilter mit Date-Variablen als Kriterium ja nicht mehr schwer sein....
Bspw. Worksheets("Imported data").Range("A1").AutoFilter 4, ">=" & daStartDate
(dStartDate ist vom Format Date).


Ergebnis: Tabelle leer. Alles weggefiltert.
Also hab ich mir den Filter in der Tabelle angeschaut.
Aktiviert ist: Datumsfilter -> benutzerdefinierter Filter -> "ist nach oder gleich" -> korrektes Datum.

WTF. Stimmt doch alles.

Und jetzt kommts.
Ich ändere nichts (!) und drücke nur OK und schwupps ist die Tabelle perfekt gefiltert und die Daten sind da.


Ich mag nicht mehr und bin für jeden Denkanstoß dankbar.
Antworten Top
#2
Hallo, 19 

Datum und VBA ist - wenn das Datum nicht im amerikanischen Format ist - etwas zickig. Dodgy

Probiere es mal mit Cdbl oder DateSerial.
[attachment=46506]

Die Beispieldatei soll dir das nur etwas verdeutlichen. 21
[-] Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:
  • Duderinho
Antworten Top
#3
Ich bin weitergekommen...
Zum Vergleichen habe ich den Makro-Recorder verwendet und witzigerweise hat der Code dann auch nicht funktioniert. Das war ein Filter auf "Criteria1:=">=15.01.2022".  (Von Excel selbst generiert!!!)
Was dann sehr wohl funktioniert hat war die Variante Criteria1:=">=01/15/2022".
Gut gemacht Microsoft....
 
Insofern vielen Dank für den Hinweis mit dem US-Format des Datums.


Was jetzt tatsächlich funktioniert ist ein verkorkstes Durcheinander von Datentypen.
Quelle: Text im Format YYYY-MM-DD.

1. Zeilenweise die Zelle mit dem Datum mit CDate konvertieren. Heraus kommt wie erwähnt Variant/Date.

2. Start- und Enddatum, die im Format Date vorliegen, in eine Stringvariable schreiben:
sStartDate = Month(daStartDate) & "/" & Day(daStartDate) & "/" & Year(daStartDate)

3. Autofilter setzen
Worksheets("Imported data").Range("A1").AutoFilter 4, ">=" & sStartDate, xlAnd, "<=" & sEndDate

Klingt komisch.... ist es auch.

War ja auch naiv zu denken, man könne Date-Daten mit Date-Variablen filtern, wenn man kein US-Amerikaner in den USA ist...


Danke jedenfalls für den Support. Mit Umwandlung in Double hätte es bestimmt auch geklappt.
Antworten Top
#4
(09.01.2023, 18:50)Duderinho schrieb: Mit Umwandlung in Double hätte es bestimmt auch geklappt.
Bei Datum: Wandlung in Long. 

Vorteile:
- Date-Variablen bleiben Date; Date ist wie Long eine Zahl.
- keine Verrenkungen mit Stringverkettungen

Zu den Stringverkettungen schau dir auch mal die Methode Format() an.

Der Makrorekorder ist maximal eine Krücke, um Einsteigern zu helfen, ernstzunehmender Code wird da nicht produziert und das war sicher auch nie das Ziel. Auf MS einzudreschen nutzt da wenig, genauso wenig wie der immer wieder angebrachte Hinweis, dass man ja mal googeln könnte, bevor man eine Frage das Millionste Mal stellt… ;)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste