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ł.

dane i wynikowy wykres

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

przykład pustego wykresu

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 .

dane i wykres ze wzoru SERIES

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

przed obrazem kilku wykresów

Po

siatka wykresów



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow