【问题标题】:Change Chart range using dynamic offset function使用动态偏移功能更改图表范围
【发布时间】:2019-02-28 10:43:49
【问题描述】:

我试图在 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 周。

任何帮助将不胜感激!

【问题讨论】:

  • OffsetRange 对象的属性。因此,您需要使用范围变量定义源数据,然后对其进行偏移。
  • 您正在使用的范围可能是您范围中最后使用的行吗?如果是这样,您可以让您的图表根据该条件不断更新。虽然如果是这种情况,我想指出您不需要 VBA 来执行此操作。您可以使用OFFSET excel sheet equation 来获得相同的相似结果
  • 所以我试着充实一点,下面是我放在一起定义数据源然后使用 Range.Offset 函数:Worksheets("Trend Charts").Activate ActiveSheet。 ChartObjects("Chart 1").Activate Range.Offset(1, 0).Activate 它产生了错误“Argument not optional”。这些将是我要更新的每个表的最后一行,但 Offset 函数看起来不能处理我正在设置的字段值。
  • 奇怪的是,被调试的似乎引用了黄色宏的最顶行: Sub Macro2() 不确定这意味着什么,但是我认为下面的代码应该可以工作:ActiveChart.SetSourceData Source :=Range.Offset(1, 0).Select

标签: excel vba


【解决方案1】:

假设 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

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2022-07-05
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多