Nie, nie, wbrew temu co może sugerować tytuł artykułu nie będę tu poddawał niczego resocjalizacji 🙂 Otóż, chciałbym zwrócić uwagę na siłę jaką niesie za sobą formatowanie warunkowe w Excelu. O samym formatowaniu warunkowym można by wiele artykułów napisać, ja pokażę na przykładzie jak za pomocą formatowania warunkowego można zrobić coś, co większość mniej lub bardziej ogarniętych „excelowców” próbowałoby (i na pewno z pozytywnym skutkiem) zrobić w VBA. Nie przeciągając powiem, że chodzi o zegarek wyświetlany (i oczywiście „chodzący” 🙂 ) na arkuszu. Wielu czytelników pewnie żachnie się teraz – „Ha, banał, wystarczy funkcja arkusza Teraz z odpowiednim formatowaniem komórki do formatu czasowego!„. W porządku, ale ja chcę zaprezentować zupełnie inny zegarek…Wygląd zegarka można zobaczyć na poniższej animacji.
Jak działa taki zegarek? Otóż poszczególne składowe czasu są podane w oddzielnych kolumnach – godzina w kolumnach BC, minuty w kolumnach EF i sekundy odpowiednio w kolumnach HI. Dla przedstawionego przykładu jest to godzina około 15:34:xx (sekund oczywiście nie podaję, bo się ciągle zmieniają i nie mogłem zauważyć 😉 ). Poszczególne cyferki w trakcie zmiany aktualnego czasu jakby „spadają”. Teraz mała dygresja i wyjaśnienie skąd pomysł na taką prezentację czasu? Przyznam się szczerze, że ten arkusz powstał przy okazji projektowania przeze mnie elektronicznego zegarka, gdzie właśnie tarcza i sam sposób zachowania się cyferek wyglądały podobnie. Oczywiście w wykonaniu elektronicznym cyferki „aktywne” były podświetlane przez diody LED, zaś pozostałych cyfr nie było widać. Efekt wizualny jest piorunujący, zwłaszcza w ciemnych pomieszczeniach lub w nocy (postaram się zrobić zdjęcia i zamieścić na stronie filmik z działania zegara).
Ale wracajmy do tematu, czyli naszego zegarka. Pewnie większość z Was myśli, że wszystko zostało zrobione w VBA? Nic bardziej mylnego 😀 :D. Cały kod wykorzystywany przez zegarek zamieszczam poniżej:
Option Explicit Dim CykCyk Sub zegarekstart() ThisWorkbook.Sheets(1).Range("B1").Calculate CykCyk = Now + TimeValue("00:00:01") Application.OnTime CykCyk, "zegarekstart" End Sub Sub zegarekstop() On Error Resume Next Application.OnTime CykCyk, "zegarekstart", , False End Sub |
Jak widać całość składa się tylko z dwóch procedur, których zadaniem jest włączanie lub wyłączanie zegarka. Wyjaśnień wymaga zapewne procedura zegarekstart – otóż zadaniem jej jest przeliczenie komórki B1 w pierwszym arkuszu i zmiana wartości zmiennej CykCyk tak, by wskazywała aktualny czas powiększony o 1 sekundę i ustawiała parametry do obsługi zdarzenia OnTime (jest to wywołanie określonej procedury/makra o zdefiniowanej jako parametr porze – po szczegóły odsyłam do pomocy Excela lub do internetu). W naszym wypadku procedura wymusza po nadejściu czasu CykCyk ustawienie nowego czasu (czyli następnej sekundy) i ustawienie jaka wtedy procedura ma się wykonać. A jaka się wykona? Tak! Dokładnie ta sama procedura 🙂 – która znów ustawi nowy czas i znów każe siebie samą wykonać za sekundę. I tak w kółko… Tyle o kodzie VBA. A co z tym formatowaniem warunkowym?
Za „ruch” cyferek odpowiada odpowiednio ustawione formatowanie warunkowe. Na początek ustalimy formatowanie „nieczynnych” cyferek. Zaznaczamy odpowiednie komórki – czyli w przypadku naszego przykładu są to obszary B3:C12, E3:F12 i H3:I12. Wybieramy tło komórek w kolorze czarnym, czcionki w kolorze szarym i pogrubione. Teraz zajmiemy się ożywieniem zegarka. Dla każdej z kolumn trzeba ustawić odrębne formatowanie. Zaczniemy od dziesiątek godzin. Zaznaczamy obszar B3:B12 i wybieramy z menu Format->Formatowanie warunkowe. Zmieniamy teraz warunek z „Wartość komórki jest” na „Formuła jest” i w polu formuły wpisujemy formułkę „=B3=WARTOŚĆ(LEWY(TEKST(TERAZ();”gg”);1))„. Ilustruje to poniższy obrazek:
Co robi formuła? Funkcja Teraz pobiera aktualny czas systemowy (w formacie daty), funkcja Tekst „wyciąga” tylko godziny i przy okazji przekształca je w tekst (odkrywcze 😀 ) zaś funkcja Lewy z tego tekstu pobiera tylko jeden znak od lewej strony czyli dziesiątki godzin. Na koniec konwertujemy znak na wartość… i gotowe.
Żeby nie przedłużać tego opisu dla pozostałych kolumn podaje rysunki jak ustawić formuły w formatowaniu warunkowym. Pamiętajcie, że trzeba najpierw zaznaczyć stosowny obszar a później ustawić formatowanie.
– dla obszaru C3:C12 (jednostki godzin):
– dla obszaru E3:E12 (dziesiątki minut):
– dla obszaru F3:F12 (jednostki minut):
– dla obszaru H3:H12 (dziesiątki sekund):
– dla obszaru I3:I12 (jednostki sekund):
To tyle o formatowaniu. Teraz wystarczy dodać dwa przyciski na arkuszu z podpiętymi naszymi makrami zegarekstart() i zegarekstop() i gotowe 🙂
Plik źródłowy do artykułu:
Zegarek_cyferkowy.xls (42,5 KiB, 35 hits)
Krzysztof
Świetny artykuł.