【问题标题】:VBA Code to shift sourcedata in an excel chartVBA代码在excel图表中移动源数据
【发布时间】:2015-04-22 04:50:49
【问题描述】:

我正在尝试在图表中更新我的源数据。我不想要动态范围,因为每次单击按钮时图表都会从新范围中拉出。如果我使用动态或命名范围,我将被锁定在该范围内。

我试过了:

ActiveSheet.ChartObjects("Chart 2").Activate

ActiveChart.PlotArea.Select

ActiveChart.SetSourceData Source:=Range("A1:C3").Offset(0,3)

不过,这只适用于一次。需要明确的是,我有一个按钮来更新电子表格上的图表。单击按钮时,宏将查看活动图表中的当前数据并将源移动到 3 列。每次单击按钮时都会发生这种情况,并且数据必须保留在工作表上。我已经用尽了我所知道的一切,并且可以在 Goracle 搜索中找到。

有什么帮助吗?

提前致谢, 莉莉丝

【问题讨论】:

    标签: excel vba charts


    【解决方案1】:

    ActiveChartSeriesCollection(j) 始终具有如下所示的 Formula 属性:

    =SERIES(,,Sheet1!$A$1:$C$3,1)
    

    因此,您可以在项目中添加一个自定义函数,通过$ 解析字符串Split 并返回相应的3 列范围移位:

    Function ShiftBy3(ByVal formulaString As String) As String
        cRange = Split(formulaString, "$")(1) + Split(formulaString, "$")(2) + Split(formulaString, "$")(3) + Split(Split(formulaString, "$")(4), ",")(0)
        newAddress = Range(cRange).Offset(0,3).Address
        ShiftBy3 = Split(formulaString, "$")(0) + newAddress + "," + Split(Split(formulaString, "$")(4), ",")(1) 
    End Function
    

    然后每次只需重置公式即可移动:

    ActiveChart.SeriesCollection(1).Formula = ShiftBy3(ActiveChart.SeriesCollection(1).Formula)
    

    【讨论】:

      【解决方案2】:

      一种方法是更新图表上每个系列的Formula 属性:

      Sub Tester()
      Const SER As String = "=SERIES("
      Dim s As Series, f As String, arr, rng1, rng2, sn
      Dim cht As Chart
      
          Set cht = ActiveSheet.ChartObjects("Chart 2").Chart
          sn = ActiveSheet.Name
          For Each s In cht.SeriesCollection
              f = s.Formula
              Debug.Print f '<<<added
              f = Replace(f, SER, "")
              f = Left(f, Len(f) - 1)
              arr = Split(f, ",")
              Set rng1 = Range(arr(1))
              Set rng2 = Range(arr(2))
      
              s.Formula = SER & Join(Array(arr(0), _
                      rng1.Parent.Name & "!" & rng1.Offset(0, 3).Address(), _
                      rng2.Parent.Name & "!" & rng2.Offset(0, 3).Address(), _
                      arr(3)), ",") & ")"
      
          Next s
      
      End Sub
      

      【讨论】:

      • 你们俩都很棒。我尝试了 Tim 的代码,但它在 Set rng1=Range(arr(1)) 行中失败了(“对象 '_Global' 的方法 'Range' 失败”)。我已经尝试过 Matteo 的代码,因为我不知道把它放在哪里。我也可能做错了。
      • 如果您添加Debug.Print f,如上所示,您会得到什么输出? (它将显示在即时窗口中 - 在编辑器中按 Ctrl+G 以打开它)另外 - 确保代码模块顶部没有 Option Base 1
      • 添加调试代码没有任何反应,只是弹出调试仍然在同一行给出相同的1004错误,Set rng1=Range(arr(1))
      • 也使用 Ootion Explicit,而不是 Option Base 1
      • 那应该是选项。我的老板想出了一些有效的方法,主要是。查看答案
      【解决方案3】:

      这是我老板想出的工作代码。

      Dim var
      
      var = Cells(4, 4)
      
      ActiveSheet.ChartObjects("Chart 2").Activate
      ActiveChart.PlotArea.Select
      ActiveChart.SetSourceData Source:=Range(Cells(1, 1 + var), Cells(3, 3 + var))
      Cells(4, 4).Value = Cells(4, 4).Value + 3
      

      感谢 Tim 和 Matteo 提供的所有时间和帮助。我真的很感激!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        相关资源
        最近更新 更多