W Excelu bardzo lubię twórcze pomysły i sprytne rozwiązania. Czasami przy niewielkim wysiłku można stworzyć narzędzie, które jest cenne i pozwala na sporą elastyczność w analizowaniu danych.
Podział Kontrolek
Jednym z takich narzędzi są kontrolki, które możemy umieszczać bezpośrednio w arkuszu.
Zasadniczo dzieli się je na dwie kategorie: formanty ActiveX (właśnie takie wykorzystuje się na formularzu), a także formanty… formularza. Brzmi jak groch z kapustą? Takie są definicje :).
Mimo, że moim konikiem jest projektowanie formularzy, to w arkuszu wolę korzystać z tej drugiej kategorii kontrolek. Są one bezpieczniejsze w używaniu i moim zdaniem prezentują się lepiej wizualnie od kontrolek ActiveX.
Kontrolki Formularza
W czym tkwi potęga tych formantów?
Chyba przede wszystkim w tym, że pozwalają podjąć konkretne działanie w zależności od wartości formantu. Tą wartość można w bardzo prosty sposób przechwycić.
Co więcej, pod taki formant można podpiąć makro, a to oznacza, że w momencie zmiany wyboru, makro uruchomi się automatycznie. Możemy to przyrównać do zdarzenia Change w formantach ActiveX.
Zmiana Typu Wykresu
Rozważmy poniższy przykład, w którym wykorzystaliśmy pole kombi. Listą dla tego formantu są dane zawarte w zakresie B3:B8, czyli nazwy różnych wykresów.
Naszą intencją jest to, aby wybierając nazwę wykresu na polu kombi, automatycznie zmienił nam się jego typ.
Od czego zacząć?
Skoro mamy już listę załadowaną do pola kombi, to trzeba napisać makro, które pobierze wartość tego formantu i zamieni ją na odpowiedni typ wykresu.
Makro
Private Const msMODUL As String = "Module1"
Option Explicit
Public Sub ZmienWykres()
Dim objWykres As ChartObject ' Wykres znajdujący się w arkuszu "wksWykres"
Dim iWybranaPozycja As Integer ' Pozycja typu wykresu na liście DropDown
Const sWYKRES_NAZWA As String = "MojWykres" ' Stała przechowująca nazwę mojego wykresu
Const sPROC As String = "ZmienWykres"
'Aktywuj obsługę błędów na starcie
1 On Error GoTo ObslugaBledu
'Przypisz zmienną do wykresu
2 Set objWykres = wksWykres.ChartObjects(sWYKRES_NAZWA)
'Sprawdź pozycję wybraną na polu kombi
3 iWybranaPozycja = wksWykres.DropDowns(1).ListIndex
4 Select Case iWybranaPozycja:
Case 1: objWykres.Chart.ChartType = xlLine 'Liniowy
5 Case 2: objWykres.Chart.ChartType = xlPie 'Kołowy
6 Case 3: objWykres.Chart.ChartType = xlRadar 'Radarowy
7 Case 4: objWykres.Chart.ChartType = xlArea 'Powierzchniowy
8 Case 5: objWykres.Chart.ChartType = xlColumnClustered 'Kolumnowy
9 Case 6: objWykres.Chart.ChartType = xlXYScatter 'Punktowy
10 End Select
'Wyświetl odpowiednią nazwę wykresu
11 objWykres.Chart.ChartTitle.Text = "Wykres " & _
wksWykres.DropDowns(1).List(iWybranaPozycja)
Wyjscie:
12 Set objWykres = Nothing
13 On Error GoTo 0
14 Exit Sub
ObslugaBledu:
'If gbDEBUG_TRYB Then Stop
15 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!"
16 Resume Wyjscie
End Sub
Analiza Kodu
W swoim makrze pobieram pozycję wybranego tekstu na formancie. Czyli pierwsze na liście jest słowo Liniowy, drugie Kołowy, trzecie Radarowy itd.
Tak naprawdę jest to właściwość ListIndex, którą możemy znać z kontrolek formularza. Różnica polega na tym, że tutaj indeksowanie zaczynamy od 1, natomiast w przypadku kontrolek ActiveX pozycja pierwszej wartości na liście to 0.
Za pomocą instrukcji Select Case przechwytuję tą pozycję i zmieniam typ wykresu (przypisuję mu stałą).
Na końcu jeszcze pobieram zaznaczony tekst w polu kombi (tutaj niestety nie mamy właściwości Value – musimy kombinować poprzez właściwość List i ListIndex) i wyświetlam go jako nazwę wykresu.