Ma "plage de données de graphique" est ='sheet1'!$A$1:$Z$10
. Je voudrais créer une macro VBA (ou si quelqu'un connaît une formule que je peux utiliser, mais je n'ai pas pu en trouver une) pour augmenter la colonne de fin de la plage pour chart1
de 1 chaque fois que j'exécute la macro. Donc essentiellement:
chart1.endCol = chart1.endCol + 1
Quelle est la syntaxe pour cela en utilisant ActiveChart
ou existe-t-il une meilleure façon?
En supposant que vous souhaitez étendre la plage (en ajoutant une colonne supplémentaire) pour ajouter une observation de plus pour chaque série dans votre diagramme (et non pour ajouter une nouvelle série), vous pouvez utiliser ce code:
Sub ChangeChartRange()
Dim i As Integer, r As Integer, n As Integer, p1 As Integer, p2 As Integer, p3 As Integer
Dim rng As Range
Dim ax As Range
'Cycles through each series
For n = 1 To ActiveChart.SeriesCollection.Count Step 1
r = 0
'Finds the current range of the series and the axis
For i = 1 To Len(ActiveChart.SeriesCollection(n).Formula) Step 1
If Mid(ActiveChart.SeriesCollection(n).Formula, i, 1) = "," Then
r = r + 1
If r = 1 Then p1 = i + 1
If r = 2 Then p2 = i
If r = 3 Then p3 = i
End If
Next i
'Defines new range
Set rng = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p2 + 1, p3 - p2 - 1))
Set rng = Range(rng, rng.Offset(0, 1))
'Sets new range for each series
ActiveChart.SeriesCollection(n).Values = rng
'Updates axis
Set ax = Range(Mid(ActiveChart.SeriesCollection(n).Formula, p1, p2 - p1))
Set ax = Range(ax, ax.Offset(0, 1))
ActiveChart.SeriesCollection(n).XValues = ax
Next n
End Sub
La plage dynamique Offset function
Le permet.
Exemple de données
étapes
=OFFSET(Sheet1!$A$2,,,1,COUNTA(Sheet1!$A$2:$Z$2))
et donnez-lui un nom mobileRange
Cet écran viendra
Cliquez sur Edit
sous Entrées de légende. (Les mobiles sont sélectionnés)
mobileRange
plage nommée.En supposant que vous exécutez uniquement la macro avec un graphique sélectionné, mon idée est de modifier la plage dans la formule pour chaque série. Vous pouvez provoquer un changement pour s'appliquer à tous les graphiques d'une feuille de calcul.
MISE À JOUR: ont changé de code pour accueillir plusieurs séries avec des captures d'écran
Sub ChartRangeAdd()
On Error Resume Next
Dim oCht As Chart, aFormulaOld As Variant, aFormulaNew As Variant
Dim i As Long, s As Long
Dim oRng As Range, sTmp As String, sBase As String
Set oCht = ActiveSheet.ChartObjects(1).Chart
oCht.Select
For s = 1 To oCht.SeriesCollection.count
sTmp = oCht.SeriesCollection(s).Formula
sBase = Split(sTmp, "(")(0) & "(<FORMULA>)" ' "=SERIES(" & "<FORMULA>)"
sTmp = Split(sTmp, "(")(1) ' "..., ..., ...)"
aFormulaOld = Split(Left(sTmp, Len(sTmp) - 1), ",") ' "..., ..., ..."
aFormulaNew = Array()
ReDim aFormulaNew(UBound(aFormulaOld))
' Process all series in the formula
For i = 0 To UBound(aFormulaOld)
Set oRng = Range(aFormulaOld(i))
' Attempt to put the value into Range, keep the same if it's not valid Range
If Err.Number = 0 Then
Set oRng = oRng.Worksheet.Range(oRng, oRng.Offset(0, 1))
aFormulaNew(i) = oRng.Worksheet.Name & "!" & oRng.Address
Else
aFormulaNew(i) = aFormulaOld(i)
Err.Clear
End If
Next i
sTmp = Replace(sBase, "<FORMULA>", Join(aFormulaNew, ","))
Debug.Print "Series(" & s & ") from """ & oCht.SeriesCollection(s).Formula & """ to """ & sTmp & """"
oCht.SeriesCollection(s).Formula = sTmp
sTmp = ""
Next s
Set oCht = Nothing
End Sub
Exemples de données - Initiales
Après la première manche:
Deuxième manche:
Troisième manche: