Excel图表 – 设置系列dynamic结束
我有一个电子表格,里面有大量的图表,还有一张表格,里面有大量的数据提供这些图表。
我已经绘制了每个graphics上的数据
=Sheet1!$C5:$C$3000
这基本上只是将C5中的值绘制到图上的C3000。
经常,虽然我只想看看数据的一个子集,例如我可能只想看看前1000行。 目前要做到这一点,我必须修改我的每个graphics中需要时间的公式。
你会知道一个方法来简化这个吗? 理想情况下,如果我可以在单张纸上放一个单元格,它从行号中读取并绘制从C5到C的所有graphics,“行号”将是最好的。
任何帮助将非常感激。
好的,我必须做更多的研究,下面是如何使其工作,完全在电子表格(不包括VBA):
使用A1作为所需范围的终点,并将图表与数据放在同一个工作表中:
将数据(C5)的第一个单元命名为命名范围,如TESTRANGE。
按照以下公式创build命名范围MYDATA:
= OFFSET(TESTRANGE,0,0,Sheet1!$ A $ 1,1)
现在,转到图表SOURCE DATA对话框的SERIES选项卡,并将VALUES语句更改为:
工作表Sheet1 =!MYDATA
现在,每次更改A1单元格值时,都会更改图表。
感谢罗伯特·梅恩斯(Robert Mearns)在我之前的回答中捕捉到了这些缺陷。
这可以通过两个步骤来实现:
- 创build一个dynamic的命名范围
- 添加一些VBA代码来更新图表数据源到指定的范围
创build一个名为Range的dynamic
将数据范围中的行数input数据表单元格中。
在数据表(Insert – Name – Define)上创build一个名为MyRange的命名范围,其公式如下:
=OFFSET(Sheet1!$A$1,0,0,Sheet1!$D$1,3)
更新公式以匹配您的布局
- Sheet1!$ A $ 1将其设置为数据范围的左上angular
- Sheet1!$ D $ 1将其设置为包含行数的单元格
- 3将此值设置为列数
testing指定的范围正在工作:
select下拉菜单编辑 – 转到,在参考字段中inputMyRange 。 您应该select图表的数据区域。
添加一些VBA代码
打开VBA IDE(Alt-F11)
在VBAProject窗口中selectSheet1并插入此代码
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$D$1" Then Exit Sub 'Change $D$1 to the cell where you have entered the number of rows 'When the sheet changes, code checks to see if the cell $D$1 has changed ThisWorkbook.Sheets("Sheet1").ChartObjects(1).Chart.SetSourceData _ Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange") ' ThisWorkbook.Sheets("Chart1").SetSourceData _ Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange") 'The first line of code assumes that chart is embedded into Sheet1 'The second line assumes that the chart is in its own chart sheet 'Uncomment and change as required 'Add more code here to update all the other charts End Sub
需要注意的事情
不要直接使用命名的范围作为图表的数据源。 如果input命名范围“MyRange”作为图表的“源数据 – 数据范围”,则Excel将自动将命名范围转换为实际范围。 对命名范围的将来更改将不会更新您的图表。
性能可能受上述方法的影响。
指定范围内的OFFSET函数是“volatile”,这意味着只要计算工作簿中的任何单元格,就会重新计算。 如果性能出现问题,请使用INDEX公式replace它。
=Sheet1!$A$1:INDEX(Sheet1!$1:$65536,Sheet1!$D$1,2)
每次在Sheet1上更改数据时,代码都会触发。 如果性能问题,请将代码更改为仅在请求时运行(即通过button或菜单)。
你可以看dynamic范围。 如果使用OFFSET函数,则可以指定起始单元格以及要select的行数和列数。 本网站提供了一些有关将名称分配到OFFSET范围的信息。
您可以在Excel中dynamic设置图表的范围。 你可以使用类似下面的VBA代码来做到这一点:
Private Sub Worksheet_Change(ByVal Target as Range) Select Case Target Case Cells(14, 2) Sheet1.ChartObjects(1).Chart.SetSourceData Range("$C5:$C$" & Cells(14,2)) ... End Select End Sub
在这种情况下,包含最后一行数的单元格是B14(当引用单元格对象时,请记住第一行)。 如果你想在代码中完全做到这一点,你也可以使用variables而不是单元格引用。 (这在2007年和2003年都有效。)您可以将此过程分配给一个button,并在更新包含最后一行的单元格后单击该button以刷新图表。
但是,这可能不是你想要做的…我不知道如何直接在图表中使用公式来指定源数据。
编辑:正如PConroy在注释中指出的那样,您可以将该代码放在该工作表的Change事件中,以便运行代码时不需要button或组合键。 您还可以添加代码,以便仅在编辑匹配的单元格时更新每个图表。
我已经更新了上面的例子来反映这一点。
+ 1s的名字解决scheme。
请注意,名称实际上并不真正引用范围,它们引用公式 。 这就是为什么你可以设置一个名称为“= OFFSET(…)”或“= COUNT(…)”。 您可以创build命名常量,只需使名称引用如“= 42”。
命名公式和数组公式是我发现自己一次又一次地应用于function不是很强大的工作表的两种工作表技术。
一个简单的方法是隐藏不需要包含的行/列 – 当你进入graphics时,它会自动排除隐藏的行/列