Pewną irytującą rzeczą w pracy z wykresami jest wyświetlanie etykiet z wartością zero. W przypadku liczb dodatnich widzimy słupek i przypisaną mu liczbę. W przypadku zer, nie widzimy słupka, ale widzimy etykietę 0. Ukrycie zer na wykresie ma za zadanie poprawić jego estetykę.
Słupki i punkty
Niedawno stanąłem przed wyzwaniem, który opisałem w pierwszym nagłówku. Projekt dotyczył wizualizacji poziomu zapasów wyrobów gotowych.
Na wykresie miałem pięć serii danych. Dwie były wyświetlone w słupkach, trzy pozostałe w punktach. W przypadku serii punktowych użyłem własnej grafiki z kolorową pionową kreską. Uznałem, że taka forma pokazania poziomu zapasów będzie najlepsza. O dziwo, taki oczywisty znacznik nie jest standardowo wbudowany w Excelu.
Kolorowe znaczniki
W praktyce okazało się, że bardzo często te trzy znaczniki (żółty, niebieski i czarny) nachodziły na siebie. Wynikało to z faktu, że poziom zapasu na tych trzech magazynach był zerowy.
Uznaliśmy, że w takiej sytuacji nie ma sensu pokazywać tych znaczników, ponieważ będzie to nieestetyczne, nieczytelne i niekonsekwentne. 3xNIE :). Zdecydowaliśmy, że to ukrycie zer na wykresie jest niezbędne. Ale nie wiedzieliśmy jak się do tego zabrać…
Kod makra
W Excelu możemy kliknąć na pojedynczy znacznik (możemy też zaznaczyć całą serię) i go usunąć lub ukryć. Wiedziałem, że skoro taka operacja jest możliwa w Excelu, to można ją zautomatyzować w VBA.
Makro, które napisałem ukrywa znaczniki dla zer dla wszystkich trzech serii punktowych.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
Public Sub UkryjZerowePunkty() Const sPROC As String = "UkryjZerowePunkty" Dim objWykres As Chart 'Obiekt wykresu Dim objSeria As Series 'Seria danych Dim avWartosci As Variant 'Wartości X dla serii danych Dim iWartOsX As Integer 'Pojedyncza wartość z osi X Dim x As Integer 'Licznik 'Aktywuj obsługę błędów na starcie 1 On Error GoTo ObslugaBledu 'Przypisz zmienną obiektową do wykresu 2 Set objWykres = wksLayout.ChartObjects(gsWYKRES_LINIA).Chart 'Pętla po wszystkich seriach 3 For Each objSeria In objWykres.SeriesCollection 'Weź pod uwagę tylko serie punktowe 4 If objSeria.ChartType = xlXYScatter Then 'Zaczytaj wartości do tablicy 5 avWartosci = objSeria.XValues 'Przejedź w tablicy po elementach i ukryj znaczniki zerowe 6 For x = LBound(avWartosci) To UBound(avWartosci) 'Zaczytaj pojedynczą wartość 7 iWartOsX = avWartosci(x) 'Jeśli jest równa 0, to nie wyświetlaj znacznika dla punktu 8 If iWartOsX = 0 Then 9 objSeria.Points(x).MarkerStyle = xlMarkerStyleNone 10 Else 11 objSeria.Points(x).MarkerStyle = xlMarkerStylePicture 12 End If ' If iWartOsX = 0 Then 13 Next x ' For x = LBound(avWartosci) To UBound(avWartosci) 14 End If ' If objSeria.ChartType <> xlBarStacked Then 15 Next objSeria ' For Each objSeria In objWykres.SeriesCollection Wyjscie: 16 Set objWykres = Nothing 17 Set objSeria = Nothing 18 On Error GoTo 0 19 Exit Sub ObslugaBledu: 20 Application.ScreenUpdating = True 21 If gbDEBUG_TRYB Then Stop 22 MsgBox "Wystąpił błąd nr " & Err.Number & " (" & Err.Description & ")." & _ vbCr & vbCr & "Linia kodu nr " & Erl & " w procedurze " & _ "'" & sPROC & "' modułu '" & msMODUL & "'.", vbInformation, "BŁĄD!" 23 Resume Wyjscie End Sub |
Screen
A tak wygląda efekt końcowy, wyświetlamy tylko te znaczniki, których wartości są większe od zera.