Kwoty słownie bez wykorzystania VBA Formuły tablicowe w Excelu

Potrzebujemy, aby makro VBA (niekoniecznie makro, ale jakoś nie wymyśliłem jeszcze innego sposobu) zaznaczalo w kolumnie, przy pomocy róznych kolorów,  powtarzajęce się wartości. Mniej więcej tak:

Zaznaczanie powtarzających się wartości w Excelu

Moje makro zaznacza powtarzające się wartości mniej więcej w taki właśnie sposób

Gdyby chodziło tylko o zaznaczanie komórek, których wartość się po prostu powtarza skorzystałbym z Formatowania warunkowego. W omawianym przypadku sprawa jest jednak nieco bardziej skomplikowana, ponieważ chciałem, aby różne wartości zaznaczane były różnymi kolorami. Dodatkowo wymyśliłem sobie, że będę mógł łatwo wybrać sobie te kolory.

Mój arkusz pomocniczy (z kolorami) wygląda jakoś tak:

Excel VBA: Zaznaczanie różnymi kolorami powtarzających się wartości

Ustawienia kolorów

Kolorując odpowiednie komórki, dycydujemy jednocześnie o kolorach jakimi zaznaczane będą powtarzające się wartości kolumny z danymi. Makro pobiera po kolei kolory z pokazanych komórek i ustawia je jako kolor tła dla każdej z powtarzających się wartości.  Jeżeli “zabraknie” kolorów (powtarzających się wartości jest więcej niż zdefiniowanych kolorów), będą one (kolory) po prostu pobierane od początku.

Ponieważ chciałem, aby komórki “odświeżały się” po każdorazowym wpisaniu czegoś w komórkę, makro obsługuje zdarzenie onChange arkusza “Dane”.

Moje makro wygląda nastepująco:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rngKolory As Range
Dim rngDoPokolorowania As Range
Dim LicznikKolorow As Integer
Dim Licznik As Integer
Dim rngKolumna As Range
Dim rngDaneWypelnione As Range

' zakres komórek z kolorami
Set rngKolory = wksKolory.Range("rngKoloryStart").Resize(wksKolory.Range("settIleKolorow").Value, 1)
' zakres z danymi do pokolorowania
Set rngDoPokolorowania = wksDane.Range(Range("rngDaneStart"), Cells(65535, Range("rngDaneStart").Column).End(xlUp))

' kolumna z danymi
Set rngKolumna = Columns("B")

With wksDane
    Set rngDaneWypelnione = .Range(.Range("rngDaneStart"), .Range("rngDaneStart").Offset(10000).End(xlUp))
End With

If Not Intersect(Target, rngKolumna) Is Nothing Then ' jezeli zmiana w kolumnie z danymi

Application.ScreenUpdating = False ' wylaczam "mruganie" ekranu

' Czyscimy caly obszar danych (ustawiamy w calosci tlo domyslne)

rngDaneWypelnione.Resize(rngDaneWypelnione.Count + 1).Interior.ColorIndex = _
    wksKolory.Range("rngDomyslneTlo").Interior.ColorIndex

LicznikKolorow = 1 ' resetujemy licznik kolorow

With rngDoPokolorowania
   ' pierwsza komorka
   If Application.WorksheetFunction.CountIf(rngDoPokolorowania, .Cells(1).Value) > 1 Then
      .Cells(1).Interior.ColorIndex = rngKolory.Cells(LicznikKolorow).Interior.ColorIndex
      LicznikKolorow = LicznikKolorow + 1
      If LicznikKolorow > rngKolory.Count Then LicznikKolorow = 1
   End If

    'Jezeli jest wiecej niz jedna komorka
    If rngDaneWypelnione.Count > 1 Then
        ' to dla kolejnych komorek
        For Licznik = 2 To .Count
            If Application.WorksheetFunction.CountIf(rngDoPokolorowania, _
                                                    .Cells(Licznik).Value) > 1 Then
                If Application.WorksheetFunction.CountIf(Range("rngDaneStart").Resize(Licznik - 1), .Cells(Licznik).Value) > 0 Then
                    .Cells(Licznik).Interior.ColorIndex = _
                    rngDaneWypelnione.Find(what:=.Cells(Licznik).Value, after:=.Cells(Licznik), SearchDirection:=xlPrevious, lookat:=xlWhole).Interior.ColorIndex
                Else
                    .Cells(Licznik).Interior.ColorIndex = rngKolory.Cells(LicznikKolorow).Interior.ColorIndex
                    LicznikKolorow = LicznikKolorow + 1
                If LicznikKolorow > rngKolory.Count Then LicznikKolorow = 1
                End If
            End If
       Next Licznik
    End If
End With
Application.ScreenUpdating = True
End If

End Sub

Oczywiście nie jest to rozwiązanie idealne, ale w prostych przypadkach spełnia swoją rolę. Poza tym może służyć za inspirację i punkt wyjścia do bardziej kompleksowych rozwiązań. Poniżej, jak zwykle, do ściągnięcia plik z przykładem.
noaccess Rejestracja Zaloguj sie

Marcin

{ 1 comment }

Nietypowy wykres w Excelu – uaktualnienie wpisu

13.02.2010

Uaktualniłem dzisiaj mój wpis opisujący sposób wykonania nietypowego wykresu w Excelu. Nowy (uaktualniony) wpis jest lepszy od starego ponieważ:

dodałem kilka animacji (zamiast statycznych obrazków),
dodałem nową formułę sterującą formatowaniem warunkowym, która  umożliwia wybór kierunku “zapełniania się” wykresu. Do tej pory rozpoczynaliśmy w lewym dolnym rogu, teraz możemy “zaszaleć” i rozpocząć w rogu prawym,
wgrałem plik z przykładami.

Zapraszam […]

Czytaj cały wpis →

Jak wylosować niepowtarzające się liczby z określonego zakresu

10.02.2010

W kolumnie (na potrzeby przykładu załóżmy, że będzie to zakres $B$2:$B$11) mamy wpisane niepowtarzające się liczby. Pytanie na dzisiaj brzmi: w jaki sposób wylosować z takiego zakresu 5 niepowtarzających się liczb i umieścić je w jednym wierszu, oddzielone od siebie myślnikiem. Całość wygląda mniej więcej tak:

Poniżej przedstawiam moją propozycję rozwiązania problemu. Skorzystamy z kolumny pomocniczej, […]

Czytaj cały wpis →

Jak obliczyć sumę liczb wpisanych w jedną komórkę Excela

02.02.2010

Kilka dni temu pisałem o tym, w jaki sposób rozdzielić liczby znajdujące się w jednej komórce Excela. Dzisiaj kontynuacja tematu, czyli formuła pozwalająca obliczyć sumę wszystkich liczb wpisanych do komórki arkusza i oddzielonych od siebie jakimś znakiem.
W zasadzie, bazując na tym co napisałem kilka dni temu we wspomnianym wpisie oraz na moich wcześniejszych tekstach, sam […]

Czytaj cały wpis →

Separacja liczb wpisanych w jedną komórkę Excela

28.01.2010

Załóżmy, że w komórce Excela masz ciąg liczb oddzielonych od siebie jakimś symbolem. Na przykład tak, jak na obrazku poniżej.

Oczywiście taki tekst możesz łatwo rozdzielić na poszczególne liczby przy pomocy narzędzia “Tekst jako kolumny”. Nie jest to jednak dokładnie to, o co mi chodzi, dlatego dzisiaj postanowiłem napisać o tym, w jaki sposób możesz pobrać  […]

Czytaj cały wpis →

Kilka wierszy w komórce Excela – dodatkowe przemyślenia

25.01.2010

Kilka dni temu pisałem o usuwaniu z komórki Excela znaków podziału linii, które wstawiamy sobie od czasu do czasu przy pomocy kombinacji klawiszy ALT+ENTER.
W rezultacie, mamy oczywiście komórkę, w której znajduje się ciąg tekstowy podzielony na kilka wierszy. Dzisiaj napiszę o tym w jaki sposób można wybrać i wyświetlić tylko jeden, wskazany wiersz z tej […]

Czytaj cały wpis →

Problem kilku wierszy w komórce Excela (Alt+Enter)

21.01.2010

Pracując z Excelem, od czasu do czasu, dzielisz prawdopodobnie jeden długi ciąg tekstowy, znajdujący sie w komórce Excela, na kilka wierszy. Nowy wiersz rozpoczynasz wtedy przy pomocy kombinacji klawiszy ALT+ENTER.
Krótki filmik poniżej pokazuje dokładnie o czym piszę. Oczywiście w przypadku  “kilku wierszy” do nowej linii przechodziłem uzywając wspomnianej kombinacji Alt+Enter.

Zdarzają sie jednak sytuacje kiedy taki […]

Czytaj cały wpis →