Excel VBA - 获取图表数据范围
Excel VBA - Get chart data range
我想将数据添加到一堆现有图表中。假设每个图表都有不同数量的数据系列,并且原始数据的位置在同一工作簿中的某个位置。这是我的开头:
For iChart = 1 To iCount
ActiveSheet.ChartObjects("Chart " & iChart).Activate
intSeries = 1
Do Until ActiveChart.SeriesCollection(intSeries).Name = ""
Set rXVal = ActiveChart.SeriesCollection(intSeries).XValues '<- Object Required error
Set rXVal = Range(rXVal, rXVal.End(xlDown))
Set rYVal = ActiveChart.SeriesCollection(intSeries).Values
Set rYVal = Range(rYVal, rYVal.End(xlDown))
ActiveChart.SeriesCollection(intSeries).XValues = rXVal
ActiveChart.SeriesCollection(intSeries).Values = rYVal
intSeries = intSeries + 1
Loop
Next iChart
我知道 ActiveChart...XValues = rXVal
有效,但我在 Set rXVal = ActiveChart....XValues
行收到“需要对象”错误。我假设由于范围用于定义数据系列,我可以再次取出该范围然后添加到它。
更新
为了稍微澄清一下,我在 8 个位置安装了加速度计,并通过 FFT 软件设置来记录 4 个独立频带中的峰值振动响应。每个样本产生 32 个数据点。导出时,软件吐出一个Excel工作簿,4sheet秒;每个频段一个。每个 sheet 都有加速度计名称和样本编号。
我使用这个语法成功了:
Dim rXVal() As Variant
rXVal = ActiveChart.SeriesCollection(intSeries).XValues
更新
在这种情况下,您得到一个数组,因为您给定的语句 (ActiveChart.SeriesCollection(intSeries).XValues
) 是一个数组 而不是一个范围。如果您深入研究 ActiveChart.SeriesCollection(intSeries)
:
的 Series 对象,这就是您在 Locals window 中看到的内容
(在我的虚拟数据中,我有名为 r1、r2、r3、r4 的行。)
我想说的是,XValues
没有任何属性可以表明它的占据范围。
如果您确实需要一个范围,我建议您从formula
属性 获取它。我建议的方法是用这个替换导致错误的行:
Set rXVal = Range(Split(ActiveChart.SeriesCollection(intSeries).Formula, ",")(1))
接下来,我看到您正在尝试获取 Values
的范围。同样,使用这个:
Set rYVal = Range(Split(ActiveChart.SeriesCollection(intSeries).Formula, ",")(2))
另一件事。
以下几行最终会导致您出错:
intSeries = 1
Do Until ActiveChart.SeriesCollection(intSeries).Name = ""
...some code...
intSeries = intSeries + 1
Loop
请将它们更改为:
For intSeries = 1 To ActiveChart.SeriesCollection.Count
...some code...
Next
还有一件事。
考虑使用 With
和 End With
,因为你重复了很多 ActiveChart.SeriesCollection(intSeries)
。那么您的代码将更具可读性,因为您可以跳过这一长行!那不是很棒吗???
这对我来说很好用:
Dim rXVal() As Variant
Dim rXValMin, rXValMax As Double
rXVal = ActiveChart.SeriesCollection(intSeries).XValues
rXValMin = WorksheetFunction.Min(rXVal)
rXValMax = WorksheetFunction.Max(rXVal)
我想将数据添加到一堆现有图表中。假设每个图表都有不同数量的数据系列,并且原始数据的位置在同一工作簿中的某个位置。这是我的开头:
For iChart = 1 To iCount
ActiveSheet.ChartObjects("Chart " & iChart).Activate
intSeries = 1
Do Until ActiveChart.SeriesCollection(intSeries).Name = ""
Set rXVal = ActiveChart.SeriesCollection(intSeries).XValues '<- Object Required error
Set rXVal = Range(rXVal, rXVal.End(xlDown))
Set rYVal = ActiveChart.SeriesCollection(intSeries).Values
Set rYVal = Range(rYVal, rYVal.End(xlDown))
ActiveChart.SeriesCollection(intSeries).XValues = rXVal
ActiveChart.SeriesCollection(intSeries).Values = rYVal
intSeries = intSeries + 1
Loop
Next iChart
我知道 ActiveChart...XValues = rXVal
有效,但我在 Set rXVal = ActiveChart....XValues
行收到“需要对象”错误。我假设由于范围用于定义数据系列,我可以再次取出该范围然后添加到它。
更新
为了稍微澄清一下,我在 8 个位置安装了加速度计,并通过 FFT 软件设置来记录 4 个独立频带中的峰值振动响应。每个样本产生 32 个数据点。导出时,软件吐出一个Excel工作簿,4sheet秒;每个频段一个。每个 sheet 都有加速度计名称和样本编号。
我使用这个语法成功了:
Dim rXVal() As Variant
rXVal = ActiveChart.SeriesCollection(intSeries).XValues
更新
在这种情况下,您得到一个数组,因为您给定的语句 (ActiveChart.SeriesCollection(intSeries).XValues
) 是一个数组 而不是一个范围。如果您深入研究 ActiveChart.SeriesCollection(intSeries)
:
(在我的虚拟数据中,我有名为 r1、r2、r3、r4 的行。)
我想说的是,XValues
没有任何属性可以表明它的占据范围。
如果您确实需要一个范围,我建议您从formula
属性 获取它。我建议的方法是用这个替换导致错误的行:
Set rXVal = Range(Split(ActiveChart.SeriesCollection(intSeries).Formula, ",")(1))
接下来,我看到您正在尝试获取 Values
的范围。同样,使用这个:
Set rYVal = Range(Split(ActiveChart.SeriesCollection(intSeries).Formula, ",")(2))
另一件事。
以下几行最终会导致您出错:
intSeries = 1
Do Until ActiveChart.SeriesCollection(intSeries).Name = ""
...some code...
intSeries = intSeries + 1
Loop
请将它们更改为:
For intSeries = 1 To ActiveChart.SeriesCollection.Count
...some code...
Next
还有一件事。
考虑使用 With
和 End With
,因为你重复了很多 ActiveChart.SeriesCollection(intSeries)
。那么您的代码将更具可读性,因为您可以跳过这一长行!那不是很棒吗???
这对我来说很好用:
Dim rXVal() As Variant
Dim rXValMin, rXValMax As Double
rXVal = ActiveChart.SeriesCollection(intSeries).XValues
rXValMin = WorksheetFunction.Min(rXVal)
rXValMax = WorksheetFunction.Max(rXVal)