Excel VBA-获取图表数据范围

Excel VBA-获取图表数据范围,excel,vba,object,charts,excel-charts,Excel,Vba,Object,Charts,Excel Charts,我想将数据添加到一组现有图表中。假设每个图表具有不同数量的数据系列,并且原始数据的位置在同一工作簿中的某个位置。我从这里开始: For iChart = 1 To iCount ActiveSheet.ChartObjects("Chart " & iChart).Activate intSeries = 1 Do Until ActiveChart.SeriesCollection(intSeries).Name = ""

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

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
iChart=1到iCount的

图表对象(“图表”和iChart)。激活
intSeries=1
直到ActiveChart.SeriesCollection(intSeries).Name=“”

设置rXVal=ActiveChart.SeriesCollection(intSeries).XValues'我已成功使用以下语法:

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

在本例中,您将获得一个数组,因为您给定的语句(
ActiveChart.SeriesCollection(intSeries).XValues
是一个数组,而不是一个范围。这是当您深入查看
ActiveChart.SeriesCollection(intSeries)
的系列对象时,在“局部变量”窗口中看到的内容:

(在我的虚拟数据中,我有名为r1、r2、r3、r4的行。)

我想说的是,
XValues
没有任何表示其占用范围的属性

如果您确实需要一个范围,我建议您从
公式
属性获取该范围。我建议的方法是用以下代码替换导致错误的代码行:

Set rXVal = Range(Split(ActiveChart.SeriesCollection(intSeries).Formula, ",")(1))
接下来,我看到您正在尝试获取
值的范围。同样,请使用以下命令:

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
还有一件事。


考虑将
一起使用,并在重复大量
ActiveChart.SeriesCollection(intSeries)
时以
结束。这样,您的代码将更具可读性,因为您只需跳过这一长行!这不是很棒吗???

我成功地使用了以下语法:

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

在本例中,您将获得一个数组,因为您给定的语句(
ActiveChart.SeriesCollection(intSeries).XValues
是一个数组,而不是一个范围。这是当您深入查看
ActiveChart.SeriesCollection(intSeries)
的系列对象时,在“局部变量”窗口中看到的内容:

(在我的虚拟数据中,我有名为r1、r2、r3、r4的行。)

我想说的是,
XValues
没有任何表示其占用范围的属性

如果您确实需要一个范围,我建议您从
公式
属性获取该范围。我建议的方法是用以下代码替换导致错误的代码行:

Set rXVal = Range(Split(ActiveChart.SeriesCollection(intSeries).Formula, ",")(1))
接下来,我看到您正在尝试获取
值的范围。同样,请使用以下命令:

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
还有一件事。


考虑将
一起使用,并在重复大量
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)

这对我来说很好:

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

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

Values
XValues
(虽然可以将它们设置为范围,但返回变量数组)请尝试此处获取帮助您可以尝试声明一个系列类型的变量,然后从.ForumlaR1C1等属性解析范围外地址。例如:Dim s As Series:Set s=ActiveChart.SeriesCollection(1):调试。打印s.FormulaR1C1
XValues
(虽然可以将它们设置为范围,但返回变量数组)请尝试此处获取帮助您可以尝试声明一个系列类型的变量,然后从属性(如.ForumlaR1C1)解析超出范围的地址。例如:Dim s As Series:Set s=ActiveChart.SeriesCollection(1):Debug.Print s.formular1c1抱歉延迟;我不得不放下这个项目,处理一项更优先的任务。此解决方案的问题在于,它返回一个值数组,而不是值所在的范围。请参阅问题更新,了解为什么这很重要。谢谢!我真的很欣赏这些建议,特别是在哪里用for循环替换do循环(我更喜欢)。我希望很快有机会参与这个项目。我会告诉你事情的进展。很抱歉耽搁了;我不得不放下这个项目,处理一项更优先的任务。此解决方案的问题在于,它返回一个值数组,而不是值所在的范围。请参阅问题更新,了解为什么这很重要。谢谢!我真的很欣赏这些建议,特别是在哪里用for循环替换do循环(我更喜欢)。我希望很快有机会参与这个项目。我会告诉你事情的进展。