excel-vba
Diagram och kartläggning
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.
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
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
.
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
Efter