如何更新具有多个系列的图形的值或范围?

时间:2017-04-20 17:39:24

标签: excel excel-vba charts vba

我有一张包含多个图表的电子表格。我把图表的数据放在另外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)

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

否则,我将获得所有帮助。

1 个答案:

答案 0 :(得分:1)

要使Chart.SeriesCollection(1).ValuesRange动态关联,请使用下面的行(假设您的SourceRange1范围已定义为correclty):

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