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.

vba_fw__r_dane.png

Wiemy już jak określić ostatnią kolumnę i ostatni wiersz.

vba_fw__r_granice.png

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

kolor-index.png

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

makro_kolory.png

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

odczyt-koloru.png

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)

onlyregistered1.png

Przydała Ci się ta informacja? Subskrybuj mój kanał RSS, by być na bieżąco z nowymi wiadomościami.