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

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

这是类似于这篇文章,但我正在更新系列范围,而不是添加另一个系列。

以下是一些示例数据:

ABCDEF 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 

图表首先看起来像这样: VBA修改之前的图表。

之后想这样:(无视色差) VBA修改后的图表

任何build议最简单的方法来做到这一点?

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

 =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,parsing出不同的逗号分隔值,并更新范围。 像这样的东西:

 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 

我认为解决这个问题的最好方法是使用dynamic命名范围。

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

 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) 

定义动态范围

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

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

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

说明: OFFSET公式引用单元格A1,然后向下查看列B,直到find最新date,并按最近date的行号向下移动,备份必要的行数,向右移两列,最后select1x3范围。

输入系列值

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

暗示:

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