VBA:修改图表数据范围

我的“图表数据范围”是='sheet1'!$A$1:$Z$10 。 我想创build一个VBAmacros(或者如果有人知道我可以使用的公式,但是我不能指出一个),以便每次运行macros时将chart1的范围的结束列增加1。 所以基本上:

chart1.endCol = chart1.endCol + 1

这个使用ActiveChart的语法是什么,还有更好的方法吗?

假设你想扩大范围(通过增加一个额外的列)为你的图中的每个系列增加一个观察值(而不是添加一个新的系列),你可以使用下面的代码:

 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 

Offset functiondynamic范围使之成为可能。

样本数据

在这里输入图像说明

脚步

  • 定义一个dynamic命名的范围=OFFSET(Sheet1!$A$2,,,1,COUNTA(Sheet1!$A$2:$Z$2))并给它一个名字mobileRange
  • 右键单击图表
  • 点击select数据

这个屏幕将会出现

在这里输入图像说明

点击图例项下的Edit (select手机)

在这里输入图像描述

  • 将Series值更改为指向mobileRange命名的范围。
  • 现在如果未来几个月的数据被添加到移动销售中,它将自动反映在图表中。

假设你只用一个Chart Selected来运行macros,我的想法是改变每个Series的公式的范围。 您可以更改为应用于工作表中的所有图表。

更新:已更改代码,以适应多个系列的截图

 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 

示例数据 – 初始

InitialData

第一次运行后:

第一次运行

第二次运行:

SecondRun

第三次运行:

ThirdRun