Sök…


Skapa ett diagram med intervall och ett fast namn

Diagram kan skapas genom att arbeta direkt med Series objektet som definierar kartdata. För att komma till Series utan existerande diagram skapar du ett ChartObject på ett visst Worksheet och tar sedan Chart från det. Uppsidan av att arbeta med Series objektet är att du kan ställa in Values och XValues genom att hänvisa till Range objekt. Dessa dataegenskaper definierar Series korrekt med referenser till dessa intervall. Nackdelen med detta tillvägagångssätt är att samma konvertering inte hanteras när du ställer in Name . det är ett fast värde. Det kommer inte att justeras med underliggande data i det ursprungliga Range . Kontrollera SERIES formeln och det är uppenbart att namnet är fixerat. Detta måste hanteras genom att skapa SERIES formeln direkt.

Kod som används för att skapa diagram

Observera att den här koden innehåller extra variabla deklarationer för Chart och Worksheet . Dessa kan utelämnas om de inte används. De kan dock vara användbara om du modifierar stilen eller andra diagramegenskaper.

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

Originaldata / intervall och resulterande Chart efter kodkörningar

Observera att SERIES formeln innehåller en "B" för serienamnet istället för en referens till Range som skapade den.

data och resulterande diagram

Skapa ett tomt diagram

Utgångspunkten för de allra flesta kartkoder är att skapa ett tomt Chart . Observera att detta Chart är föremål för standardmallmallen som är aktiv och kanske inte är tom (om mallen har ändrats).

Nyckeln till ChartObject är att bestämma dess plats. Syntaxen för samtalet är ChartObjects.Add(Left, Top, Width, Height) . När ChartObject har skapats kan du använda dess Chart objekt för att faktiskt ändra diagrammet. ChartObject uppför sig mer som en Shape att placera diagrammet på arket.

Kod för att skapa ett tomt diagram

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

Resultatdiagram

exempel på tomt diagram

Skapa ett diagram genom att ändra SERIES-formeln

För fullständig kontroll över ett nytt Chart och Series objekt (särskilt för en dynamisk Series namn), måste du ta till modifiera SERIES formel direkt. Processen att ställa in Range objekten är enkel och huvudhindret är helt enkelt strängbyggnaden för SERIES formeln.

SERIES formeln tar följande syntax:

=SERIES(Name,XValues,Values,Order)

Detta innehåll kan tillhandahållas som referenser eller som matrisvärden för dataelementen. Order representerar seriepositionen i diagrammet. Observera att referenserna till uppgifterna inte kommer att fungera såvida de inte är fullständigt kvalificerade med arknamnet. För ett exempel på en fungerande formel, klicka på en befintlig serie och kontrollera formelfältet.

Kod för att skapa ett diagram och ställa in data med SERIES formeln

Observera att strängbyggnaden för att skapa SERIES formeln använder .Address(,,,True) . Detta säkerställer att den externa intervallreferensen används så att en fullständig kvalificerad adress med arknamnet ingår. Du får ett fel om arknamnet är uteslutet .

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

Originaluppgifter och resulterande diagram

Observera att för detta diagram är serienamnet korrekt inställt med ett område till önskad cell. Detta innebär att uppdateringar sprids till Chart .

data och diagram från SERIES-formeln

Ordna diagram i ett rutnät

Ett vanligt arbete med diagram i Excel standardiserar storleken och layouten för flera diagram på ett enda ark. Om du gör det manuellt kan du hålla ALT intryckt medan du ändrar storleken på eller flyttar diagrammet för att "hålla fast vid" cellgränser. Detta fungerar för ett par diagram, men en VBA-strategi är mycket enklare.

Kod för att skapa ett rutnät

Denna kod skapar ett rutnät med diagram som börjar vid en given (övre, vänster) position med ett definierat antal kolumner och en definierad gemensam diagramstorlek. Diagrammen kommer att placeras i den ordning de skapades och lindas runt kanten för att bilda en ny rad.

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

Resultat med flera diagram

Dessa bilder visar den ursprungliga slumpmässiga layouten för diagram och det resulterande rutnätet från att köra koden ovan.

Innan

före bild av flera diagram

Efter

rutnät



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow