Załóżmy, że mamy tabelę z danymi i chcemy podsumować wartości komórek, których kolor został zaznaczony na zielony i różowy. O tak:
W Excelu nie ma wbudowanej funkcji, która potrafiłaby to zrobić. Jeśli koniecznie chcemy rozwiązać sprawę funkcją – musimy sobie ją sami napisać. Tym właśnie zajmę się w tym artykule.
Ale! Zanim przejdę dalej, to od razu powiem, że analizowanie danych na podstawie koloru ich komórki czy jakiegokolwiek formatowania nie jest dobrym pomysłem! Excel jest strasznie słaby w analizie formatowania komórek, za to świetnie sobie radzi z analizą wartości komórek, czyli gdyby w kolumnie obok napisać jakiś konkretny komentarz, zamiast kolorowania komórek:
Wtedy wystarczy już nawet prehistoryczna funkcja SUMA.JEŻELI i po temacie.
No ale. Ma być funkcja sumująca na podstawie koloru, zatem proszę bardzo 😊
Tworzenie funkcji użytkownika sumującej po kolorze komórki
Przejdźmy do edytora VBA: Alt + 11, i wstawmy nowy moduł: Insert → Module.
I napiszmy kod rozpoczynający naszą funkcję. Funkcja będzie się nazywać SumaKolor.
Od razu też zdefiniujmy sobie zmienne, których funkcja będzie potrzebowała od użytkownika:
- Zakres sumowanych komórek: ZakresLiczb
- Komórka, zawierająca kolor, jaki będziemy sumować: KomorkaKolor
Oto kod:
Function SumaKolor(ZakresLiczb As Range, KomorkaKolor As Range) As Double End Function
To jeszcze będziemy potrzebować na pewno samego koloru (w VBA jest to liczba), a nie tylko komórki zawierającej ten kolor, oraz techniczną zmienną obiektową typy Range dla pętli for each, której za chwilę użyjemy. Mamy zatem dwie kolejne zmienne, tym razem już w środku procedury:
Dim Kolor As Long, Komorka As Range
Kolor od razu możemy sobie uzupełnić poprzez sczytanie go ze zmiennej KomorkaKolor, pobranej od użytkownika:
Kolor = KomorkaKolor.Interior.ColorIndex
Pętla for each sumująca po kolorze komórki
Przyszedł zatem czas, aby zacząć sumować.
Logika będzie taka, że przejedziemy się po każdej komórce zakresu podanego przez użytkownika (ZakresLiczb) i sprawdzimy, czy kolor każdej pojedynczej komórki (przechowywanej w technicznej zmiennej obiektowej Komorka) jest taki, jak ten, który nas interesuje (przechowywany obecnie w zmiennej Kolor). Zrobimy to za pomocą pętli for each.
Jeśli kolor komórki będzie się zgadzał, to jeszcze sprawdzimy, czy zawiera ona wartość, którą się da sumować, czyli liczbę.
A potem dokonamy sumowania, czyli powiększymy dotychczasową wartość funkcji SumaKolor o wartość komórki. Początkowy wynik funkcji wynosi oczywiście zero.
A kod jest następujący:
Function SumaKolor(ZakresLiczb As Range, KomorkaKolor As Range) As Double Dim Kolor As Long, Komorka As Range Kolor = KomorkaKolor.Interior.ColorIndex
For Each Komorka In ZakresLiczb If Komorka.Interior.ColorIndex = Kolor Then If IsNumeric(Komorka.Value) = True Then SumaKolor = SumaKolor + Komorka.Value End If End If Next End Function
Teraz koniecznie trzeba zapisać plik jako plik z obsługą makr (xlsm lub xlsb) i śmiało można już użyć napisanej przez nas funkcji jako funkcji arkuszowej. O tak:
=SumaKolor($E$4:$E$28;G5)
Co ciekawe, tej funkcji możesz użyć również w innych plikach, ale tylko wtedy, gdy otwarty jest oryginalny plik, w którym funkcja została napisana.
A wynik wygląda tak (oryginalna tabela jest dłuższa niż na rysunku, dlatego wartości się nie zgadzają):
I to tyle!
https://malinowyexcel.pl/wp-content/uploads/2024/08/MalinowyExcel-VBA-SumaKolor.zip
Zapraszam też do filmu na Youtubie, gdzie pokazuję powyższe rozwiązanie:
0 komentarzy