Trafiłam ostatnio na ciekawy przypadek. Tabela Excela, w jednej z kolumn – daty. Kolumna sformatowana jako data, dodatkowo jeszcze włączona poprawność danych, że musi tam być data. Wszystko działa prawidłowo.

W oddzielnej komórce, poza tabelą – numer roku jako pojedyncza liczba (tu akurat 2022). Bez problemu ręcznie ustawiam filtr niestandardowy – działa:

Filtr działa i wskazuje właściwe rekordy. To samo zrobiłam za pomocą procedury VBA, odwołując się do komórki I1 arkusza, gdzie jest wartość roku:
Public Sub Filtruj() Dim JROK As Integer Dim JDataOD As Date Dim JDataDO As Date With Arkusz1 JROK = .Range(„I1”) JDataOD = DateSerial(JROK, 1, 1) JDataDO = DateSerial(JROK, 12, 31) .ListObjects(„Tabela1”).Range.AutoFilter Field:=6, Criteria1:= _ „>=” & JDataOD, Operator:=xlAnd, Criteria2:=”<=” & JDataDO End With End Sub |
Również pięknie działa. Niestety, nie wszędzie. Na komputerze docelowym. gdzie miał pracować – – filtr uruchamiany procedurą nie działał. Wprawdzie tu przedstawiam tylko symulację problemu, prawdziwy plik był bardziej rozbudowany, ale problem wystąpił właśnie w tym miejscu. Co ciekawe – przy sztywnym wpisaniu kryteriów w kodzie – było OK.
Cóż, nie wiem jakie były ustawienia systemowe tamtego komputera,
w zasadzie wiem tylko, że to Excel 2021 i nic poza tym. Udało mi się rozwiązać problem w wypróbowany już wcześniej sposób. Za każdym razem, gdy mam do czynienia z problemami z datami (zarówno w Excelu jak i Accessie) – zamieniam daty na liczby.
Data i czas to liczby
W tym konkretnym przypadku – wstawiam do tabeli nową kolumnę (można ją ukryć), która będzie bezpośrednio odwoływać się do daty, ale będzie sformatowana jako liczba.

Po dopasowaniu procedury VBA:
Public Sub Filtruj() Dim JROK As Integer Dim JDataOD As Date Dim JDataDO As Date Dim LDataOD As Long Dim LDataDO As Long With Arkusz1 JROK = .Range(„I1”) JDataOD = DateSerial(JROK, 1, 1) JDataDO = DateSerial(JROK, 12, 31) LDataOD = CLng(JDataOD) LDataDO = CLng(JDataDO) .ListObjects(„Tabela1”).Range.AutoFilter Field:=7, Criteria1:= _ „>=” &LDataOD, Operator:=xlAnd, Criteria2:=”<=” &LDataDO End With End Sub |
Zadziałało od razu bez problemu.