Wykresy animowane
Excel potrafi wyświetlać proste animacje, na przykład animowane kształty i wykresy. Przeanalizujmy wykres XY pokazany na rysunku 1.
Rysunek 1. Prosta procedura w języku VBA przekształci ten wykres w ciekawą animację
Wartości X (kolumna A) zależą od wartości w komórce Al. Wartość w każdym kolejnym wierszu jest obliczana jako suma wartości z poprzedniego wiersza i wartości w komórce Al. Kolumna B zawiera formuły obliczające funkcję sinus dla wartości z kolumny A. Poniższa prosta procedura tworzy interesującą animację, modyfikując wartość w komórce Al, co powoduje zmianę wartości dla zakresów X i Y. W efekcie otrzymujemy efektowny wykres animowany.
Sub Animation1()
Dim i As Long
Range("A1") = 0
For i = 1 To 150
DoEvents
Range("A1") = Range("A1") + 0.035
DoEvents
Next i
Range("A1") = 0
End Sub
Kluczem do sukcesu podczas tworzenia wykresów animowanych jest zastosowanie jednego lub więcej poleceń DoEvents. Wykonanie tego polecenia powoduje chwilowe przekazanie sterowania do systemu operacyjnego, co w momencie powrotu sterowania do Excela powoduje (najwyraźniej...) aktualizację wykresu. Bez zastosowania poleceń DoEvents zmiany wykresu dokonywane wewnątrz pętli nie będą wy świetlane.
W skoroszyte Animacja_1.xlsm znajduje się przykład, zawierający nasz animowany wykres, oraz kilka innych przykładów animacji.
Przykład Animacja_Sin.xlsm - do samodzielnego wykonania.
Przewijanie wykresów
Na rysunku 2 przedstawiono wykres zawierający 5218 punktów danych w każdej serii. W skoroszycie zostały zdefiniowane następujące nazwy:
Range("$F$1").Name = "StartDay"
StartDay - nazwa dla komórki Fl.
Range("$F$2").Name = "NumDays"
NumDays - nazwa dla komórki F2.
Range("$F$3").Name = "Increment"
Increment - nazwa dla komórki F3 (wykorzystywanej do automatycznego przewijania).
Użycie nazw pozwala użytkownikowi na użycie wartości komórek przez Range("StartDay"), Range("NumDays"), Range("Increment").
Skoroszyt z tym przykładem - w pliku Przewianie.xlsm.
Rysunek 18.22. Wartośći w kolumnie F determinują dane prezentowane na wykresie
Przewijanie wykresu jest realizowane przez względnie proste makro. Przycisk umieszczony na arkuszu powoduje uruchomienie makra, które przewija wykres.
Sub AnimateChart()
Range("$F$1").Name = "StartDay"
Range("$F$2").Name = "NumDays"
Range("$F$3").Name = "Increment"
ActiveSheet.ChartObjects(1).Select
For r = Range("StartDay") To 5219 - Range("NumDays") _
Step Range("Increment")
DoEvents
zakres = "$A$" + CStr(Range("StartDay")) + ":$C$" _
+ CStr(Range("StartDay") + Range("NumDays"))
ActiveChart.SetSourceData Source:=Workbooks(1).Worksheets(1).Range(zakres)
`ActiveChart.SetSourceData Source:=Workbooks(1).Worksheets(1). _
`Range(Cells(Range("StartDay"), 1), Cells(Range("StartDay") + Range("NumDays"), 3))
DoEvents
Range("StartDay") = r
DoEvents
Next r
Range("$F$1").Value = 2
End Sub
Animacja realizowana jest w pętli, która zmienia wartość w komórce StartDay (Range("StartDay")=r). Ponieważ wartość ta jest wykorzystywana przez dwie serie danych, wartość początkowa wykresu jest nieustannie aktualizowana. Szybkość przewijania wykresu jest kontrolowana przez wartość komórki Increment.
Przykład Animacja_Hipocykloida.xlsm - do samodzielnego wykonania.
Modyfikacja danych wykresu na podstawie aktywnej komórki
Na rysunku 3 pokazano wykres utworzony na podstawie danych z wiersza aktywnej komórki. Kiedy użytkownik przesunie wskaznik komórki, wykres zostanie automatycznie uaktualniony.
Rysunek 3. Ten wykres zawsze wyświetla dane na podstawie wiersza odpowiadającego aktywnej komórce
W przykładzie użyto procedury obsługi zdarzenia dla obiektu Sheetl. Kiedy użytkownik zmienia zaznaczenie, przenosząc wskaźnik komórki, zachodzi zdarzenie SelectionChange. Procedura obsługi tego zdarzenia (umieszczona w module kodu obiektu Arkuszl) jest następująca:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Call UpdateChart
End Sub
Za każdym razem, kiedy użytkownik przemieści wskaźnik do innej komórki, wykonywana jest procedura Worksheet_SelectionChange. Procedura obsługi zdarzenia wywołuje procedurę UpdateChart, której kod został przedstawiony poniżej:
Sub UpdateChart()
Dim ChtObj As ChartObject
Dim UserRow As Long
Set ChtObj = ActiveSheet.ChartObjects(1)
UserRow = ActiveCell.Row
If UserRow < 4 Or IsEmpty(Cells(UserRow, 1)) Then
ChtObj.Visible = False
Else
ChtObj.Chart.SeriesCollection(1).Values = _
Range(Cells(UserRow, 2), Cells(UserRow, 6))
ChtObj.Chart.ChartTitle.Text=Cells(UserRow, 1).Text
ChtObj.Visible = True
End If
End Sub
Zmienna UserRow zawiera numer wiersza aktywnej komórki. Instrukcja If sprawdza, czy aktywna komórka znajduje się w wierszu z danymi (dane rozpoczynają się od wiersza numer 4). Jeżeli wskaźnik aktywnej komórki znajduje się w wierszu, który nie zawiera danych, obiekt ChartObject zostaje ukryty, a zamiast niego wyświetlany jest komunikat Nie mogę wyświetlić wykresu. Jeżeli w wierszu znajdują się dane do wyświetlenia, procedura ustawia właściwość Values obiektu Serie na zakres kolumn 2-6 aktywnego wiersza oraz nadaje obiektowi ChartTille wartość reprezentującą tekst w kolumnie A.
Skoroszyt z tym przykładem - Wykres aktywnej komórki.xlsm.
Formuła SERIE
Dane wykorzystane w każdej serii wykresu określa formuła SERIE, która pojawia się na pasku formuły po zaznaczeniu serii danych na wykresie. Nie jest to formuła w pełnym tego słowa znaczeniu; mówiąc inaczej, nie można użyć jej w komórce i odwrotnie, w formule SERIE nie można wykorzystać funkcji arkuszowych. Można jednak modyfikować jej argumenty.
Rysunek 4. Formuła SERIE pojawia się na pasku formuły po zaznaczeniu serii danych na wykresie
Formuła SERIE ma następującą składnię:
=SERIE(nazwa_serii, etykiety_kategorii, wartości, kolejność, rozmiary)
Argumenty formuły SERIE opisano poniżej:
• nazwa_serii (opcjonalny) - odwołanie do komórki zawierającej nazwę serii do wykorzystania w legendzie. Jeżeli wykres składa się tylko z jednej serii danych, argument ten jest wykorzystywany jako tytuł. Można go także podać jako tekst ujęty w cudzysłów. Jeżeli argument zostanie pominięty, Excel utworzy domyślną nazwę serii (np. Seria 1).
• etykiety_kategorii (opcjonalny) - odwołanie do zakresu zawierającego etykiety dla osi kategori. Jeżeli argument zostanie pominięty, Excel zastosuje kolejne liczby całkowii począwszy od 1. Dla wykresów XY ten argument definiuje etykiety dla osi X. Poprawne jest także odwołanie do nieciągłego zakresu. W takim przypadku adresy zakresów powinny być oddzielone przecinkami i ujęte w nawiasy. Argument można także zdefiniować w postaci tablicy wartości oddzielonych przecinkami (lub tekstów w cudzysłowach) ujętych w nawiasy klamrowe.
• wartości (wymagany) - odwołanie do zakresu zawierającego wartości dla serii Dla wykresów XY ten argument definiuje wartości dla osi Y. Poprawne jest także odwołanie do nieciąpłeso zakresu. W takim przypadku adresy zakresów powinny być oddzielone przecinkami i ujęte w nawiasy. Argument można także zdefiniować w postaci tablicy wartości oddzielonych przecinkami, ujętych w nawiasy klamrowe.
• kolejność (wymagany) - liczba całkowita określająca kolejność wykreślania serii. Ten argument ma znaczenie tylko wtedy, gdy wykres składa się z więcej niż jednej serii. Zastosowanie odwołania do komórki nie jest dozwolone.
• rozmiary (tylko dla wykresów bąbelkowych) - odwołanie do zakresu zawierającego wartości rozmiarów bąbelków w wykresach bąbelkowych. Poprawne jest także odwołanie do nieciągłego zakresu. W takim przypadku adresy zakresów powinny być oddzielone przecinkami i ujęte w nawiasy. Argument można także zdefiniować w postaci tablicy wartości ujętych w nawiasy klamrowe.
Odwołania do zakresów w formule SERIE zawsze są bezwzględne i zawsze zawierają nazwę arkusza. Oto przykład:
=SERIE(Arkuszl!$B$1,,Arkuszl!$B$2:$B$7,l)
Odwołanie do zakresu może składać się z obszaru nieciągłego. W takim przypadku poszczególne zakresy składowe należy oddzielić średnikami i ująć argument w nawiasy. W poniższym przykładzie formuły SERIE wartości należą do zakresu B2:B3 oraz B5:B7:
=SERIE(,,(Arkuszl!$B$2:$B$3,Arkuszl!$B$5:$B$7),l)
Odwołania do zakresów można zastąpić nazwami zakresów. Jeżeli wybierzesz takie rozwiązanie (ą nazwy zostały zdefiniowane na poziomie skoroszytu), Excel zmodyfikuje odwołania, wprowadzająć w formule SERIE nazwę skoroszytu. Oto przykład:
=SERIE(Arkuszl!$B$1,,budżet.xlsx!MojeDane,1)
Zastosowanie języka VBA do identyfikacji zakresu danych prezentowanych na wykresie
W tym podrozdziale omówiono zastosowanie makr VBA do identyfikacji zakresów serii danych prezentowanych na wykresie, kiedy na przykład trzeba zwiększyć serię danych poprzez dodanie do zakresu nowej komórki.
Poniżej zamieszczono opis trzech właściwości, które będą potrzebne do wykonania tego zadania.
• Właściwość Formuła - zwraca lub ustawia formułę SERIE dla serii danych. Po zaznaczeniu serii danych na wykresie w pasku formuły wyświetla się formuła SERIE. Właściwość Formuła zwraca tę formułę jako łańcuch znaków.
Rysunek 5. Właściwość Formuła zwraca formułę jako łańcuch znaków (?ActiveChart.SeriesCollection(1).Formula)
• Właściwość Values - zwraca lub ustawia kolekcję wszystkich wartości w serii. Można ją podać jako zakres danych w arkuszu lub tablicę stałych, ale nie można użyć kombinacji obu tych sposobów.
• Właściwość XValues - zwraca lub ustawia tablicy wartości osi X dla serii danych wykresu. Właściwość XValues można podać jako zakres danych w arkuszu lub tablicy stałych, ale nie mozna użyć kombinacji obu tych sposobów. Właściwość XValues może także być pusta.
Kiedy ustawiasz właściwość Values obiektu Series możesz określić obiekt Range lub tablice. Jednak odczytywanie tej właściwości zawsze zwraca tablicy. Niestety model obiektowy wykresu nie pozwala na odczytanie obiektu Range wykorzystywanego przez obiekt Series.
Jednym ze s|iosobów rozwiązania tego problemu jest napisanie kodu, który analizuje formułę SlRIE i wydobywa z niej adresy zakcesów. Brzmi to dosyć prosto, ale w rzeczywistości jest to trudne zadanie - ze względu na zlozoność formuły SlRIE. Poniżej podano kilka przykładów poprawnych formuł SlRIE:
=SERIE(Arkuszl!$B$1, Arkuszl!$A$2:$A$4, Arkuszl!$B$2:$B$4, 1)
=SERIE(,,Arkuszl!$B$2:$B$4,1)
=SERIE(, Arkuszl! $A$2: $A$4, Arkuszl! $B$2:$B$4, l)
=SERIE("Podsumowanie sprzedaży", , Arkuszl!$B$2:$B$4, l)
=SERIE( , {"Sty","Lut","Mar"}, Arkuszl!$B$2:$B$4, 1)
=SERIE( , (Arkuszl!$A$2.Arkuszl!$A$4), (Arkuszl!$B$2.Arkuszl!$B$4), l)
=SERIE (Arkuszl!$B$1, Arkuszl!$A$2:$A$4, Arkuszl!$B$2:$B$4, l, Arkuszl!$C$2:$C$4)
Jak widać, formuła SERIE nie zawsze musi posiadać wszystkie argumenty, może używać tablic, a nawet adresów nieciągłych zakresów komórek. Aby było jeszcze trudniej, dla wykresów bąbelkowych istnieje dodatkowy argument. Próba przeanalizowania składni argumentów z pewnością nie jest trywialnym zadaniem nawet dla doświadczonego programisty.