VBA:更新图表以显示最后三个周期的数据

标签 vba excel 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 中的每个系列,解析出不同的逗号分隔值,并更新范围。像这样的事情:

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

最佳答案

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

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

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,它将会更新为您的工作簿名称,因为它是一个名为范围的工作簿级别。)

解释:OFFSET 公式引用单元格 A1,然后向下查找 B 列,直到找到最新日期,并向下移动最新日期的行号,备份必要的行数,移动到右边两列,最后选择一个1x3的范围。

Enter Series Values

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

提示:

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

关于VBA:更新图表以显示最后三个周期的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38707977/

相关文章:

vba - Excel vba : Class sub: Wrong number of arguments or invalid property assignment on vba

vba - 当单元格为空时隐藏行Excel(更快的方法)

java - 如何在使用 POI 生成的 Excel 工作表中创建依赖下拉列表?

javascript - 使用 d3js 中的用户输入在下拉菜单上创建多个图表

gwt - GWT中的独立图表

jquery - float 条形图数据标签左偏移

sql - VBA 运行时错误 3134

vba - 是否可以在自定义用户窗体中创建和处理自定义事件?

excel - 如何阻止 Excel 在 Workbook_BeforeSave 之前触发 Worksheet_Change?

VBA - 如何获取工作表代号索引