Excel VBA - 获取图表数据范围

时间:2015-02-05 22:20:44

标签: excel vba excel-vba

我想将数据添加到一堆现有图表中。假设每个图表具有不同数量的数据系列,并且原始数据的位置在同一工作簿中的某个位置。以下是我开始的内容:

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有效,但我得到了一个&#34; Object Required&#34; Set rXVal = ActiveChart....XValues行上的错误。我假设因为一个范围进入以定义数据系列,我可以再次取出该范围然后添加到它。

更新
为了澄清一点,我在8个位置安装了加速度计,并使用FFT软件设置来记录4个独立频段的峰值振动响应。这样每个样本产生32个数据点。导出时,软件会发出4张Excel工作簿;每个频段一个。每张表都有加速度计名称,样本数字会下降。

2 个答案:

答案 0 :(得分:7)

我成功使用了这种语法:

Dim rXVal() As Variant
rXVal = ActiveChart.SeriesCollection(intSeries).XValues

<强>更新

在这种情况下,您会得到一个数组,因为您的给定语句(ActiveChart.SeriesCollection(intSeries).XValues是一个数组,而不是一个范围。如果您深入了解ActiveChart.SeriesCollection(intSeries)

的Series对象,则会在“局部”窗口中看到这一点

enter image description here

(在我的虚拟数据中,我有名为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 WithActiveChart.SeriesCollection(intSeries)。那么你的代码将更具可读性,因为你会跳过这条长行!那不是很棒???

答案 1 :(得分:0)

这对我来说很好:

Dim rXVal() As Variant
Dim rXValMin, rXValMax As Double

rXVal = ActiveChart.SeriesCollection(intSeries).XValues
rXValMin = WorksheetFunction.Min(rXVal)
rXValMax = WorksheetFunction.Max(rXVal)