web-dev-qa-db-fra.com

VBA: modifier la plage de données du graphique

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?

6
Stuart

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
4
Netloh

La plage dynamique Offset function Le permet.

Exemple de données

enter image description here

étapes

  • Définissez une plage nommée dynamique =OFFSET(Sheet1!$A$2,,,1,COUNTA(Sheet1!$A$2:$Z$2)) et donnez-lui un nom mobileRange
  • Clic droit sur le graphique
  • Cliquez sur Sélectionner les données

Cet écran viendra

enter image description here

Cliquez sur Edit sous Entrées de légende. (Les mobiles sont sélectionnés)

enter image description here

  • modifiez la valeur Series pour pointer sur mobileRange plage nommée.
  • Maintenant, si les données des mois à venir sont ajoutées aux ventes sur mobile, elles seront automatiquement reflétées dans le graphique.
6
Santosh

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

InitialData

Après la première manche:

FirstRun

Deuxième manche:

SecondRun

Troisième manche:

ThirdRun

3
PatricK