excel-vba
Wykresy i wykresy
Szukaj…
Tworzenie wykresu z zakresami i ustaloną nazwą
Wykresy można tworzyć, pracując bezpośrednio z obiektem Series
który definiuje dane wykresu. Aby dostać się do Series
bez exisitng wykresie utworzyć ChartObject
na danym Worksheet
, a następnie uzyskać Chart
obiektu od niego. XValues
pracy z obiektem Series
jest to, że można ustawić Values
i Values
XValues
, odwołując się do obiektów Range
. Te właściwości danych poprawnie zdefiniują Series
z odniesieniami do tych zakresów. Wadą tego podejścia jest to, że ta sama konwersja nie jest obsługiwana podczas ustawiania Name
; jest to stała wartość. Nie będzie się dostosowywać do danych bazowych w oryginalnym Range
. Sprawdzanie formuły SERIES
i oczywiste jest, że nazwa jest ustalona. Należy to rozwiązać, tworząc bezpośrednio formułę SERIES
.
Kod użyty do utworzenia wykresu
Pamiętaj, że ten kod zawiera dodatkowe deklaracje zmiennych dla Chart
i Worksheet
. Można je pominąć, jeśli nie są używane. Mogą być jednak przydatne, jeśli modyfikujesz styl lub inne właściwości wykresu.
Sub CreateChartWithRangesAndFixedName()
Dim xData As Range
Dim yData As Range
Dim serName As Range
'set the ranges to get the data and y value label
Set xData = Range("B3:B12")
Set yData = Range("C3:C12")
Set serName = Range("C2")
'get reference to ActiveSheet
Dim sht As Worksheet
Set sht = ActiveSheet
'create a new ChartObject at position (48, 195) with width 400 and height 300
Dim chtObj As ChartObject
Set chtObj = sht.ChartObjects.Add(48, 195, 400, 300)
'get reference to chart object
Dim cht As Chart
Set cht = chtObj.Chart
'create the new series
Dim ser As Series
Set ser = cht.SeriesCollection.NewSeries
ser.Values = yData
ser.XValues = xData
ser.Name = serName
ser.ChartType = xlXYScatterLines
End Sub
Oryginalne dane / zakresy i wynikowy Chart
po uruchomieniu kodu
Zauważ, że formuła SERIES
zawiera "B"
dla nazwy serii zamiast odwołania do Range
który ją utworzył.
Tworzenie pustego wykresu
Punktem wyjścia dla ogromnej większości kodu wykresów jest utworzenie pustego Chart
. Należy pamiętać, że ten Chart
podlega domyślnemu szablonowi wykresu, który jest aktywny i może w rzeczywistości nie być pusty (jeśli szablon został zmodyfikowany).
Kluczem do ChartObject
jest określenie jego lokalizacji. Składnia wywołania to ChartObjects.Add(Left, Top, Width, Height)
. Po utworzeniu ChartObject
można użyć jego obiektu Chart
do faktycznej modyfikacji wykresu. ChartObject
zachowuje się bardziej jak Shape
aby umieścić wykres na arkuszu.
Kod, aby utworzyć pusty wykres
Sub CreateEmptyChart()
'get reference to ActiveSheet
Dim sht As Worksheet
Set sht = ActiveSheet
'create a new ChartObject at position (0, 0) with width 400 and height 300
Dim chtObj As ChartObject
Set chtObj = sht.ChartObjects.Add(0, 0, 400, 300)
'get refernce to chart object
Dim cht As Chart
Set cht = chtObj.Chart
'additional code to modify the empty chart
'...
End Sub
Wynikowy wykres
Utwórz wykres, modyfikując formułę SERIES
Aby uzyskać pełną kontrolę nad nowym obiektem Chart
i Series
(szczególnie w przypadku dynamicznej nazwy Series
), należy bezpośrednio zmodyfikować formułę SERIES
. Proces konfigurowania obiektów Range
jest prosty, a główną przeszkodą jest po prostu budowanie ciągów dla formuły SERIES
.
Formuła SERIES
przyjmuje następującą składnię:
=SERIES(Name,XValues,Values,Order)
Te treści mogą być dostarczane jako odniesienia lub jako wartości tablicowe dla elementów danych. Order
reprezentuje pozycję serii na wykresie. Pamiętaj, że odniesienia do danych nie będą działać, chyba że będą w pełni kwalifikowane przy użyciu nazwy arkusza. Na przykład działającej formuły kliknij dowolną istniejącą serię i sprawdź pasek formuły.
Kod, aby utworzyć wykres i skonfigurować dane przy użyciu formuły SERIES
Zwróć uwagę, że do tworzenia ciągów znaków w celu utworzenia formuły SERIES
używa .Address(,,,True)
. Gwarantuje to, że zostanie użyte zewnętrzne odniesienie zakresu, aby uwzględnić w pełni kwalifikowany adres z nazwą arkusza. Otrzymasz błąd, jeśli nazwa arkusza zostanie wykluczona .
Sub CreateChartUsingSeriesFormula()
Dim xData As Range
Dim yData As Range
Dim serName As Range
'set the ranges to get the data and y value label
Set xData = Range("B3:B12")
Set yData = Range("C3:C12")
Set serName = Range("C2")
'get reference to ActiveSheet
Dim sht As Worksheet
Set sht = ActiveSheet
'create a new ChartObject at position (48, 195) with width 400 and height 300
Dim chtObj As ChartObject
Set chtObj = sht.ChartObjects.Add(48, 195, 400, 300)
'get refernce to chart object
Dim cht As Chart
Set cht = chtObj.Chart
'create the new series
Dim ser As Series
Set ser = cht.SeriesCollection.NewSeries
'set the SERIES formula
'=SERIES(name, xData, yData, plotOrder)
Dim formulaValue As String
formulaValue = "=SERIES(" & _
serName.Address(, , , True) & "," & _
xData.Address(, , , True) & "," & _
yData.Address(, , , True) & ",1)"
ser.Formula = formulaValue
ser.ChartType = xlXYScatterLines
End Sub
Oryginalne dane i wynikowy wykres
Zauważ, że dla tego wykresu nazwa serii jest poprawnie ustawiona z zakresem do żądanej komórki. Oznacza to, że aktualizacje zostaną rozpowszechnione na Chart
.
Układanie map w siatkę
Częstym obowiązkiem związanym z wykresami w Excelu jest standaryzacja rozmiaru i układu wielu wykresów na jednym arkuszu. Jeśli zrobisz to ręcznie, możesz przytrzymać klawisz ALT podczas zmiany rozmiaru lub przenoszenia wykresu, aby „trzymać się” granic komórek. Działa to dla kilku wykresów, ale podejście VBA jest znacznie prostsze.
Kod, aby utworzyć siatkę
Ten kod utworzy siatkę wykresów rozpoczynającą się od określonej pozycji (u góry, z lewej), ze zdefiniowaną liczbą kolumn i zdefiniowanym wspólnym rozmiarem wykresu. Wykresy zostaną umieszczone w kolejności, w jakiej zostały utworzone i zawiną się wokół krawędzi, tworząc nowy rząd.
Sub CreateGridOfCharts()
Dim int_cols As Integer
int_cols = 3
Dim cht_width As Double
cht_width = 250
Dim cht_height As Double
cht_height = 200
Dim offset_vertical As Double
offset_vertical = 195
Dim offset_horz As Double
offset_horz = 40
Dim sht As Worksheet
Set sht = ActiveSheet
Dim count As Integer
count = 0
'iterate through ChartObjects on current sheet
Dim cht_obj As ChartObject
For Each cht_obj In sht.ChartObjects
'use integer division and Mod to get position in grid
cht_obj.Top = (count \ int_cols) * cht_height + offset_vertical
cht_obj.Left = (count Mod int_cols) * cht_width + offset_horz
cht_obj.Width = cht_width
cht_obj.Height = cht_height
count = count + 1
Next cht_obj
End Sub
Wynik z kilkoma wykresami
Te zdjęcia pokazują oryginalny losowy układ wykresów i wynikową siatkę z uruchomienia powyższego kodu.
Przed
Po