这可以通过两个步骤来实现:
- 创建动态命名范围
- 添加一些 VBA 代码以将图表数据源更新为命名范围
创建一个名为 Range 的动态
在数据表的单元格中输入数据范围内的行数。
在您的数据表(插入 - 名称 - 定义)上创建一个名为MyRange的命名范围,其公式类似于:
=OFFSET(Sheet1!$A$1,0,0,Sheet1!$D$1,3)
更新公式以匹配您的布局
- Sheet1!$A$1将此设置为数据范围的左上角
- Sheet1!$D$1将此设置为包含行数的单元格
- 3将此值设置为列数
测试命名范围是否正常工作:
选择下拉菜单 Edit - Go To,在参考字段中键入MyRange 。应选择图表的数据区域。
添加一些VBA代码
打开 VBA IDE (Alt-F11)
在 VBAProject 窗口中选择 Sheet1 并插入此代码
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
需要注意的事项
不要直接使用命名范围作为图表的数据源。如果您输入命名范围“MyRange”作为图表的源数据 - 数据范围,Excel 会自动将命名范围转换为实际范围。因此,您命名范围的任何未来更改都不会更新您的图表。
性能可能会受到上面列出的方法的影响。
命名范围中的OFFSET函数是“易失性的”,这意味着它会在工作簿中的任何单元格计算时重新计算。如果性能是一个问题,请将其替换为INDEX公式。
=Sheet1!$A$1:INDEX(Sheet1!$1:$65536,Sheet1!$D$1,2)
每次在 Sheet1 上更改数据时都会触发代码。如果性能是一个问题,请将代码更改为仅在请求时运行(即通过按钮或菜单)。