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
图表首先看起来像这样:
之后想这样:(无视色差)
任何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)