2013-10-10 101 views
4

我的“图表数据范围”是='sheet1'!$A$1:$Z$10。我想制作一个VBA宏(或者如果有人知道我可以使用的公式,但我无法想出一个),以便在每次运行宏时将chart1的范围的结束列增加1。所以基本上:VBA:修改图表数据范围

chart1.endCol = chart1.endCol + 1

,这是什么使用ActiveChart或是否有更好的方法的语法?

回答

2

假设你要扩大范围(通过添加一个额外的列)添加一个多观察每个系列中,你图(而不是添加一个新的系列),您可以使用此代码:

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 
+2

如果你要声明的变量(你应该),你应该声明为正确类型:'暗淡我作为整数, r为Integer,n为Integer,p1为Integer,p2为Integer'。你的声明创建'i,r,n,p1'作为'Variant' :) –

+0

@DavidZemens我其实并没有意识到这一点。谢谢! –

+0

不用担心!这是一个非常常见的错误,我认为:) –

4

Offset function动态范围使之成为可能。

的样本数据

enter image description here

步骤

  • 定义一个动态命名区域 =OFFSET(Sheet1!$A$2,,,1,COUNTA(Sheet1!$A$2:$Z$2)),并给它一个名字 mobileRange
  • 日GHT点击图
  • 点击选择数据

该屏幕会在下面图例条目Edit

enter image description here

点击(手机被选中)

enter image description here

  • 将系列值更改为指向mobileRange命名的范围。
  • 现在如果将来月份的数据添加到移动销售中,它将自动反映在图表中。
+6

+1,不需要宏。 –

+0

我同意这对单个数据系列更好,但不能在多个系列的“图表数据范围”中使用此功能。由于我有大约一百个系列,我宁愿不这样做。 – Stuart

2

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

UPDATE:是否更改代码以适应屏幕截图多个串联

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

第一次运行后:

FirstRun

第二轮:

SecondRun

第三轮:

ThirdRun

+0

打印输出似乎正在工作(使用'MsgBox'),但图表没有更新。 – Stuart

+0

@Stuart代码已更新为在Activesheet中的第一个图表上工作,如果它不起作用,请立即窗口输出。 – PatricK

+0

由于某些原因,@Søren方法'Mid'功能对我无效。 @PatricK选项使用'分裂'救了我。 – ZygD