【问题标题】:How to update the values or range for a graph with multiple series?如何更新具有多个系列的图形的值或范围?
【发布时间】:2017-04-20 17:39:23
【问题描述】:

我有一个包含多个图表的电子表格。我将图表的数据存放在另外 3 张纸上。到目前为止,我正在尝试更新图表以涵盖我添加的其他数据。

根据我在网上看到的情况,我尝试了几件事。我试过设置一个范围,比如

Set SourceRange1 = Split(Join((GetArray(Sheets(1).Range("P6:" & GetLetterFromNumber(Sheets(1).Cells(6, Sheets(1).Columns.Count).End(xlToLeft).Column) & "6"))), "|"), "|")
Set SourceRange2 = GetArray(Sheets(2).Range("P6:" & GetLetterFromNumber(Sheets(2).Cells(6, Sheets(2).Columns.Count).End(xlToLeft).Column) & "6")))
Set SourceRange3 = Application.Union(Worksheets(3).Range("P5", Sheets(3).Cells(5, Sheets(1).Columns.Count).End(xlToLeft)), Sheets(3).Range("P6", Sheets(3).Cells(6, Sheets(3).Columns.Count).End(xlToLeft))).Value

然后像这样将其分配给图表:

ActiveChart.SeriesCollection(1).Values = SourceRange1
ActiveChart.SeriesCollection(2).Values = SourceRange2
ActiveChart.SeriesCollection(3).Values = SourceRange3

这给了我当前P5:x5 的范围,但它没有设置图表系列。

仅供参考,GetArray 是我创建的一个函数:

Function GetArray(Range1 As Range)
    Dim Test() As String, cell As Range, i As Integer
    i = 0
    ReDim Test(0)
    For Each cell In Range1
        ReDim Preserve Test(i)
        Test(i) = cell.Value
        i = i + 1
    Next cell
    GetArray = Test
End Function

GetLetterFromNumber 也是如此:

Function GetLetterFromNumber(Number)
    GetLetterFromNumber = Split(Cells(1, Number).Address(True, False), "$")(0)
End Function

使用像Set SourceRange1 这样的当前设置,我得到一个

编译错误:无法赋值给数组

我也遇到了与其他两个相同的错误。我有SourceRange1-3 设置,如Dim SourceRange1()

如果我像Dim SourceRange1 那样设置它们,那么我会得到:

运行时错误“13”:

类型不匹配 三个都有。

如果我直接分配SeriesCollection 喜欢:

ActiveChart.SeriesCollection(1).Values = GetArray(Sheets(1).Range("P6:" & GetLetterFromNumber(Sheets(1).Cells(6, Sheets(1).Columns.Count).End(xlToLeft).Column) & "6"))
ActiveChart.SeriesCollection(2).Values = GetArray(Sheets(2).Range("P6:" & GetLetterFromNumber(Sheets(2).Cells(6, Sheets(2).Columns.Count).End(xlToLeft).Column) & "6"))
ActiveChart.SeriesCollection(3).Values = GetArray(Sheets(3).Range("P6:" & GetLetterFromNumber(Sheets(3).Cells(6, Sheets(3).Columns.Count).End(xlToLeft).Column) & "6"))

SeriesCollection(1) 应该为时,​​它会将 0 分配给所有值:

(20,30,40,50,60,10,20,30,40)

我确定我错过了一些简单的东西,我只是不知道是什么。如果我错过了在我的描述中添加的内容,请告诉我,我可以添加它。

否则,我将不胜感激。

【问题讨论】:

  • 如果你尝试ActiveChart.SeriesCollection(1).Values = "=" & SourceRange1.Address(True, True, xlA1, xlExternal),它有效吗?
  • 我无法获得分配给变量 SourceRange1 的范围,但我尝试了这个 ActiveChart.SeriesCollection(1).Values = "=" & Sheets(2).Range("P6:" & GetLetterFromNumber(Sheets(2).Cells(6, Sheets(2).Columns.Count).End(xlToLeft).Column) & "6").Address(True, True, xlAl, xlExternal) 并分配了值。我仍在测试,看看这是否能回答我的问题。
  • 好的,告诉我
  • 完美运行!把这个作为答案,我会检查它!

标签: excel charts vba


【解决方案1】:

为了使Chart.SeriesCollection(1).ValuesRange 动态连接,请使用类似于以下行的内容(假设您的SourceRange1 范围已正确定义):

ActiveChart.SeriesCollection(1).Values = "=" & SourceRange1.Address(True, True, xlA1, xlExternal)

使用图表时,您还可以考虑使用:

Dim Cht as Chart
Dim Ser as Series
Set Cht = ActiveChart 
Set Ser = Cht.SeriesCollection(1)

With Ser
    .Values = "=" & SourceRange1.Address(True, True, xlA1, xlExternal)
End With

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多