Excel 2010 i VBA - formatowanie warunkowe
Kiedyś już pisałem jak można formatować komórki w excelu za pomocą funkcji formatowania warunkowego. W większości przypadków jest to zupełnie wystarczająca umiejętność.
Jest jednak sposób który zabezpieczy dodatkowo nasze arkusze przed nieumyślnym skasowaniem lub nadpisaniem reguł formatowania, tym bardziej że do edytora Visual Basic osoby z nim nieobeznane bardzo niechętnie zaglądają nawet gdybyśmy nie zabezpieczyli dostępu do odczytania samego makra.
W dalszym ciągu będziemy korzystać z przykładu omówionego poprzednio nieco go tylko poszerzając.
Wiemy już jak określić ostatnią kolumnę i ostatni wiersz.
Tym razem chcę wprowadzić coś nowszego polegającego na użyciu pętli for…next wewnątrz której będzie kilka instrukcji warunkowych if i w zależności od wartości w komórce wykona się instrukcja zmieniająca kolor tła komórki
Cells(wiersz, kolumna).Interior.ColorIndex = indeks_koloru
indeks_koloru - to wartość powinna być w przedziale od 1 do 56
Ponieważ nie wiemy jakie kolory są dostępne pod jakim indeksem to sobie trochę pomożemy generując tabelę kolorów. Zrobimy to w kolumnie ósmej. Po wklejeniu poniższego kodu do okna Visual Basic. Czyli w Excelu za pomocą Lewy Alt + F11 uruchamiamy VBA wybieramy Arkusz1 i wklejamy ten kod
Sub kolory ()
For w = 1 To 56
Cells(w, 7).Value = w
Cells(w, 8).Interior.ColorIndex = w
Next
End Sub
W liniach wewnątrz pętli for znajdują się instrukcje, które kolejno:
1 wstawiają wartość w kolumnę 7
2 zmieniają kolor tła komórki w koluminie 8
Wszystko po to by można było zidentyfikować jaki indeks odpowiada danemu kolorowi.
Będzie to wyglądać mniej więcej tak
Kiedy już wiemy jaki kod ma dany kolor możemy przejść do sedna
Wpiszmy następujący przykładowy kod.
Sub kolory()
For w = 1 To 16
If Cells(w, 2).Value < 5 Then
Cells(w, 1).Interior.ColorIndex = 33
End If
If Cells(w, 2).Value > 5 And Cells(w, 2).Value < 10 Then
Cells(w, 1).Interior.ColorIndex = 26
End If
If Cells(w, 2).Value > 10 Then
Cells(w, 1).Interior.ColorIndex = 3
End If
If Cells(w, 2).Value = 5 Then
Cells(w, 1).Interior.ColorIndex = 3
End If
If Cells(w, 2).Value = 10 Then
Cells(w, 1).Interior.ColorIndex = 44
End If
Next
Po uruchomieniu tego makra dostaniemy coś takiego
Aby pogrubić tekst w danej komórce stosujemy polecenie
Cells(w, 1).Font.Bold = True
Podobnie w przypadku tekstu pochylonego.
Cells(w, 1).Font.Italic = True
Wnioski
Można oczywiście mieć zastrzeżenia do ilości pracy jaką należy w to włożyć bo pisanie warunków to jednak dość uciążliwe zajęcie. Dodatkowo wadą tego rozwiązania jest konieczność uruchomienia makra aby efekt był widoczny, zaletą jest z kolei zupełna swoboda formatowania tekstu i coś jeszcze a mianowicie fakt że formatować możemy nie tylko te komórki których wartość ulega zmianie ale te które chcemy zmienić w bezpośrednim sąsiedztwie (tak naprawdę to możemy zmieniać wszystkie inne komórki). Nieraz mi brakowało tej ostatniej własności.
Ciekawą opcją wydaje się także zamiana formatu koloru komórki na wartość innej komórki
Spróbujmy:
Sub kolory()
For w = 1 To 16
If Cells(w, 1).Interior.ColorIndex = 33 Then
Cells(w, 3).Value = “niebieski”
End If
Next
End Sub
i efekt tego
Funkcja ta sprawdza kolor tła komórki i jeśli natrafi na wartość 33 to wpisuje w słowo “niebieski” w tym samym wierszu ale w kolumnie 3 (C)