Filtrowanie tabeli

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.

kliknij, aby powiększyć

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

kliknij, aby powiększyć

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.

kliknij, aby powiększyć

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *