使用动态偏移功能更改图表范围

时间:2019-02-18 18:15:52

标签: excel vba

我正在尝试在Excel中使用VBA通过将其数据范围向下移动一行来抵消一系列图表(即,第1周将是A:74和C:74,第2周将是A:75和C:75等)

我是VBA的新手,他认为简单的Offset命令可以满足我的需求,但是我放在一起的所有代码都不会出现错误。

以下是我尝试的一些代码示例:

ActiveSheet.ChartObjects("Chart 2").Activate
ActiveChart.SetSourceData Source:=Offset(1, 0)

ActiveSheet.ChartObjects("Chart 2").Activate
ActiveChart.Offset(1, 0).Select

我希望活动图表或单元格的范围将被偏移1行0列。

但是,第一次尝试给出了错误:

  

编译错误:
  子或功能未定义

第二次尝试给出了错误:

  

编译错误:
  找不到方法或数据成员

不确定错误的出处,因为我浏览的其他大多数页面都涉及为偏移函数设置特定的单元格范围,因此我需要它忽略硬编码范围,并动态查看当前图表已选择的范围和只需将其全部向下移动一个,基本上是从第2-8周到第3-9周。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

假设X数据在A74中,Y数据在C74中,那么您的序列公式将如下所示:

=SERIES(Sheet1!$C$73,Sheet1!$A$74,Sheet1!$C$74,1)

您需要分析此公式,找到X和Y范围(第二个和第三个参数),将它们偏移,然后将它们放回序列中。这个程序对我有用。

Sub MoveChartDataDownOneRow()
  With ActiveChart
    Dim srs As Series
    For Each srs In .SeriesCollection
      Dim sFmla As String
      sFmla = srs.Formula
      ' =SERIES(Sheet1!$C$73,Sheet1!$A$74,Sheet1!$C$74,1)
      Dim sArgs As String
      sArgs = Mid$(sFmla, Len("=series(") + 1)
      sArgs = Left$(sArgs, Len(sArgs) - 1)
      ' Sheet1!$C$73,Sheet1!$A$74,Sheet1!$C$74,1
      Dim vArgs As Variant
      vArgs = Split(sArgs, ",")
      ' Array("Sheet1!$C$73","Sheet1!$A$74","Sheet1!$C$74","1")
      Dim XRange As Range, YRange As Range
      Set XRange = Range(vArgs(LBound(vArgs) + 1))
      Set YRange = Range(vArgs(LBound(vArgs) + 2))
      ' offset ranges
      Set XRange = XRange.Offset(1)
      Set YRange = YRange.Offset(1)
      ' reassign to series
      srs.XValues = XRange
      srs.Values = YRange
    Next
  End With
End Sub