2015-02-05 112 views
1

我想将数据添加到一堆现有图表。假设每个图表具有不同数量的数据序列,并且原始数据的位置在同一工作簿中的某处。这里是我开始用: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的作品,但我对Set rXVal = ActiveChart....XValues线得到“对象需要”错误。我假设,自从一个范围进入定义数据系列后,我可以再次将该范围返回并添加到该范围。

UPDATE
为了澄清事情的话,我有8个地方和FFT软件安装加速度计来记录4个单独的频段峰值振动响应。这样每个样本产生32个数据点。在导出时,软件会分出4张Excel工作簿;每个频段一个。每张表都有加速度计名称,样本数量也在减少。

+3

'Values'和'XValues'(尽管您可以将它们设置为一个范围,*返回*一个变体数组)请尝试寻求帮助http://j-walk.com/ss/excel/tips/tip83.htm – 2015-02-05 23:57:45

+0

您可以尝试声明一个Series类型的变量,然后从诸如.ForumlaR1C1之类的属性中解析出范围地址。例如:Dim s As Series: Set s = ActiveChart.SeriesCollection(1): Debug.Print s.FormulaR1C1 – Mike 2015-02-06 04:56:16

回答

4

我一直在使用此语法成功:

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

UPDATE

在这种情况下,你会得到一个数组,因为您定语句(ActiveChart.SeriesCollection(intSeries).XValues是一个数组,而不是一个范围。这就是你在本地窗口中看到,如果你挖成系列物体ActiveChart.SeriesCollection(intSeries)

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 

还有另一件事。

考虑使用WithEnd With,因为您重复了很多ActiveChart.SeriesCollection(intSeries)。那么你的代码将更具可读性,因为你只需跳过这么长的一行!这不是很棒吗?

+0

对不起,延迟;我不得不把这个项目放下来,并解决一个更高优先级的任务。这个解决方案的问题是它返回一个值的数组而不是值存在的范围。查看问题更新为什么这很重要。 – 2015-03-17 13:43:46

+0

我已经更新了我的答案。希望这会有所帮助。 – ZygD 2015-03-17 21:52:37

+0

谢谢!我非常感谢这些建议,特别是在何处用for循环替换do循环(我更喜欢)。我希望能有机会更快地开展这个项目。我会让你知道它是怎么回事。 – 2015-03-18 22:50:53