Dzisiaj na tapetę weźmiemy dość popularny temat – zaznaczenie aktywnego wiersza i kolumny.
Problem
Wydawać by się mogło, że taka opcja powinna być standardowo dostępna w Excelu – tymczasem mamy jakby jej atrapę.
Domyślnie, po zaznaczeniu komórki (lub zakresu) Excel podświetla nam na pomarańczowo (wersja 2010) same nagłówki. Zawsze to coś, jednak w sytuacji gdy nasza tabela ma kilkadziesiąt kolumn, trudno jest ogarnąć wzrokiem dane, które znajdują się w tym samym wierszu i jednocześnie w tej samej kolumnie. Trochę się to miesza…
Rozwiązanie
Rozwiązaniem takiego problemu może być makro, które zaznacza nam aktywny wiersz i aktywną kolumnę w tabeli źródłowej.
Celowo nie używam określenia podświetla ponieważ w makrze nie stosujemy żadnej zmiany kolorystycznej, nie formatujemy wiersza i kolumny innym kolorem.
Jest to bowiem rozwiązanie, które wymagałoby wyczyszczenia koloru czcionki lub koloru wypełnienia we wszystkich komórkach tabeli. Być może użytkownik ma sformatowane kolorem jakieś dane i wg koloru później je sortuje lub filtruje. Wystarczy nam zatem jedynie zaznaczenie aktywnego wiersza i kolumny.
Screen
Kod Makra
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'// Makro zaznacza aktywny wiersz i aktywną komórkę w tabeli
Dim rngTabela As Excel.Range ' Tabela danych
Dim rngUnia As Excel.Range ' Aktywny wiersz i kolumna
'Pozwalamy tylko na zaznaczenie jednej komórki
1 If Target.Cells.Count <> 1 Then Exit Sub
'Przypisz zmienną dla calej tabeli danych
2 Set rngTabela = Range("A1").CurrentRegion
'Sprawdź czy zaznaczyliśmy komórkę z tabeli
3 If Not Intersect(Target, rngTabela) Is Nothing Then
'Przypisz do zmiennej Range aktywny wiersz i kolumnę
4 Set rngUnia = Union(Target.EntireRow, Target.EntireColumn)
'Wyłącz zdarzenia żeby nie uruchamiać ponownie makra
5 Application.EnableEvents = False
6 rngUnia.Select ' zaznacz aktywny wiersz i komórkę
7 Application.EnableEvents = True
8 End If 'If Not Intersect(Target, rngTabela) Is Nothing Then
End Sub
Analiza Makra
Makro działa w obszarze samej tabeli. Zakładam, że zaczyna się ona od komórki A1 i nie posiada pustych wierszy w swoim obrębie.
Jeżeli użytkownik kliknie obszar poza tabelą, wówczas nic nie zostanie zaznaczone (metoda Intersect sprawdza czy dwa zakresy mają jakąś wspólną komórkę).
Drugim warunkiem jest konieczność zaznaczenia tylko jednej komórki. Ograniczeń tych można się jednak łatwo pozbyć dopasowując makro pod swoje potrzeby.
Kluczowe jest zastosowanie innej metody obiektu Application – Union. Pozwala ona na utworzenie jednego zakresu typu Range z kilku rożnych. W naszym przypadku pobieramy do zmiennej rngUnia aktywny wiersz i aktywną kolumnę.
Przed zaznaczeniem zakresu musimy wyłączyć na chwilę zdarzenia ponieważ zaznaczenie nowego zakresu w arkuszu wyzwala ponowne zdarzenie Worksheet_SelectionChange.
Po zaznaczeniu aktywnego wiersza i kolumny, możemy ponownie włączyć zdarzenia.