VBA:将图表更新为最后三个数据周期

时间:2016-08-01 20:56:43

标签: excel vba excel-vba charts

我在工作簿中有几个图表(每个工作表一个)报告过去三周的数据。源数据是ListObject表中的非连续列。每周使用新的一周数据(附加行)更新表格时,我希望更新图表。

这与this post类似,但我正在更新系列范围而不是添加其他系列。

以下是一些示例数据:

A       B       C       D       E       F
Start   End     Green   Yellow  Red     Total
------- ------- ------- ------- ------- -------
1/1/16  1/7/16  10      10      10      30
1/8/16  1/14/16 12      12      12      36
1/15/16 1/21/16 12      20      18      50
1/22/16 1/28/16 30      10      50      45

图表首先如下所示: Chart prior to VBA modification.

之后它会像这样:(忽视色差) Chart after VBA modification

有关最简单方法的建议吗?

系列公式最终看起来像这样:

=SERIES(Project!$A$2,Project!$C$1:$E$1,Project!$C$2:$E$2,1)
=SERIES(Project!$A$3,Project!$C$1:$E$1,Project!$C$3:$E$3,2)
=SERIES(Project!$A$4,Project!$C$1:$E$1,Project!$C$4:$E$4,3)

我正在考虑在SeriesCollection中迭代每个Series,解析出不同的逗号分隔值,并更新范围。像这样:

set clnSeries = activechart.seriescollection 
dim strSeriesTemp as string 'Placeholder for previous series formula
For i = clnSeries.count to 1 step -1
  if strSeriesTemp = "" then
    strSeriesTemp = clnSeries(i).formula
    arrSeries = split(clnSeries(i).formula, ",")
    for i = lbound(arrSeries) to ubound(arrSeries)
      select case i
        'Move legend label one row down
        case 1: strFormula = arrSeries(i).offset(1,0).address
        'Leave series labels the same
        case 2: strFormula = strFormula & arrSeries(i)
        'Move series values one row down
        case 3: strFormula = strFormula & arrSeries(i).offset(1,0).address
        'Set series index
        case 4: strFormula = strFormula & i
      end select
      strFormula = "=SERIES(" & strFormula & ")"
  else
    clnSeries(i).formula = strFormula
  end if
next i

1 个答案:

答案 0 :(得分:2)

我认为解决此问题的最佳方法是使用动态命名范围。

在“公式”选项卡下的“名称管理器”中创建以下三个命名范围:

Ultimate=OFFSET(Sheet1!$A$1,MATCH(MAX(Sheet1!$B:$B),Sheet1!$B:$B,0)-1,2,1,3)
Penultimate=OFFSET(Sheet1!$A$1,MATCH(MAX(Sheet1!$B:$B),Sheet1!$B:$B,0)-2,2,1,3)
Antepenultimate=OFFSET(Sheet1!$A$1,MATCH(MAX(Sheet1!$B:$B),Sheet1!$B:$B,0)-3,2,1,3)

Define Dynamic Ranges

然后右键单击图表,选择数据,编辑系列值为:

=Sheet1!Antepenultimate
=Sheet1!Penultimate
=Sheet1!Ultimate

然后,每次向列添加新行时,假设输入按时间顺序排列,这三个范围将自动更新为最后三行。 (请注意,如果您回过头来查看它,Sheet1将更新为您的工作簿名称,因为它是一个名为range的工作簿级别。)

说明:OFFSET公式引用单元格A1,然后向下查看列B,直到它找到最新日期并向下移动最新日期的行号,备份所需的行数,轮班向右两列,最后选择1x3范围。

Enter Series Values

注意:为了使您的系列名称也能正确更新,您还需要为它们制作命名范围。

提示:

UltimateName=OFFSET(Sheet1!$A$1,MATCH(MAX(Sheet1!$B:$B),Sheet1!$B:$B,0)-1,0)