【问题标题】:Excel VBA - Get chart data rangeExcel VBA - 获取图表数据范围
【发布时间】:2015-02-05 22:20:44
【问题描述】:

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

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 个数据点。导出时,软件吐出4张Excel工作簿;每个频段一个。每张表都有加速度计名称和样本编号。

【问题讨论】:

  • ValuesXValues(虽然您可以将它们设置为一个范围,返回一个变体数组)尝试在这里寻求帮助j-walk.com/ss/excel/tips/tip83.htm
  • 您可以尝试声明一个系列类型的变量,然后从 .ForumlaR1C1 等属性中解析出范围地址。例如: Dim s As Series: Set s = ActiveChart.SeriesCollection(1): Debug.Print s.FormulaR1C1

标签: excel vba object charts excel-charts


【解决方案1】:

我已经成功使用了这个语法:

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

更新

在这种情况下,您会得到一个数组,因为您给定的语句 (ActiveChart.SeriesCollection(intSeries).XValues) 是一个数组,而不是一个范围。如果您深入了解 ActiveChart.SeriesCollection(intSeries) 的 Series 对象,这就是您在 Locals 窗口中看到的内容:

(在我的虚拟数据中,我有名为 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)。这样您的代码将更具可读性,因为您只需跳过这一长行!那不是很棒吗???

【讨论】:

  • 抱歉耽搁了;我不得不放下这个项目并处理更高优先级的任务。这个解决方案的问题是它返回一个值数组而不是值存在的范围。请参阅问题更新,了解为什么这很重要。
  • 谢谢!我非常感谢这些建议,尤其是在哪里用 for 循环替换 do 循环(我更喜欢)。我希望尽快有机会在这个项目上工作。我会告诉你进展如何。
【解决方案2】:

这对我来说很好用:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多