Niedawno w pracy stanąłem przed bardzo ciekawym wyzwaniem dotyczącym ukrycia zer na wykresie.
Ukrywanie Zer
Temat jest dość popularny w kontekście ukrywania etykiet.
W przypadku liczb dodatnich jest ok, bo widzimy słupek i przypisaną mu liczbę. Dla zera nie widzimy słupka, ale widzimy etykietę 0. I jest to co mało eleganckie.
Na wykresie miałem pięć serii danych – dwie wyświetlone za pomocą wykresu słupkowego i trzy wyświetlone za pomocą wykresu punktowego (własna grafika z pionową kreską – o dziwo taki oczywisty znacznik nie jest standardowo wbudowany w Excelu).
W praktyce okazało się, że bardzo często te trzy znaczniki (żółty, niebieski i czarny) nachodzą na siebie, ponieważ w wielu przypadkach ich wartość wynosi 0.
Uznaliśmy, że w takiej sytuacji nie ma sensu pokazywać znaczników z wartością zero, ponieważ będzie to nieczytelne i niekonsekwentne (dlaczego bowiem mielibyśmy faworyzować którąś z tych trzech serii?).
W Excelu możemy kliknąć na pojedynczy znacznik (możemy oczywiście zaznaczyć również całą serię) i go usunąć lub ukryć.
Kod Makra
Makro, które napisałem ukrywa znaczniki dla wartości zerowych dla trzech serii danych.
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.