Jeśli dokonujemy obliczeń – warto się upewnić, że nie mamy wierszy ukrytych filtrem. Niektóre funkcje i instrukcje VBA pomijają dane ukryte i wyniki mogą nas zaskoczyć. Istnieją właściwości, które pozwalają sprawdzić czy filtr jest założony. Inaczej jednak musimy podejść do tematu, gdy korzystamy z obiektu Tabela.
Problem ukrytych wierszy
Pomijanie ukrytych danych może prowadzić do problemów.
Przykładem może być wykorzystanie metody Find do znalezienia ostatniego niepustego wiersza. Gdy część danych jest ukryta filtrem, funkcja może zwrócić błędny wynik.
Jest to niebezpieczna sytuacja, bo otrzymujemy nieprawidłowe wyniki. Co zatem robić? Czy musimy rezygnować z ulubionych rozwiązań na rzecz innych?
Moim zdaniem niekoniecznie. Możemy zawsze sprawdzić czy w arkuszu znajduje się filtr. Jeżeli tak jest – ściągamy go makrem, aby pokazać wszystkie dane.
Ukryte wiersze vs. obiekt Tabela
Kilka dni temu trafiłem na ciekawy problem.
Standardowo, w celu ustalenia czy arkusz ma założony autofiltr używa się właściwości AutoFilterMode. Opcjonalnie może być też FilterMode, jeśli chcemy dodatkowo sprawdzić czy mamy wyfiltrowane dane.
To są jednak właściwości arkusza. Problem pojawia się, gdy korzystamy z obiektu Tabela Jest to wbudowane narzędzie Excela wcześniej znane jako Lista.
Takie wiersze nie reagują na stan właściwości AutoFilterMode, bowiem reprezentują zupełnie inny obiekt. Nawet jeśli widzimy gołym okiem filtr założony na tabelę, to właściwość AutoFilterMode zwróci w wyniku FALSE. I to może być źródłem potencjalnych błędów.
Kod makra
Jak sobie z tym poradzić? Aby sprawdzić czy filtr znajduje się w arkuszu lub w obiekcie Tabela – można się posłużyć takim fragmentem kodu…
1 2 3 4 5 6 7 8 9 10 11 12 13 |
For Each wksArkusz In ThisWorkbook.Worksheets If wksArkusz.ListObjects.Count > 0 Then If Not wksArkusz.ListObjects(1).AutoFilter Is Nothing Then wksArkusz.Range("A1").AutoFilter End If Else If wksArkusz.AutoFilterMode Then wksArkusz.Range("A1").AutoFilter End If End If Next wksArkusz |