2014-09-12 99 views
1

我想用一个已知数组做一个图。下面的代码工作:如何从数组中创建图形?

Sub arraychart() 
    Dim cht As Object 
    Dim hhh As Variant 

Set cht = ActiveSheet.ChartObjects.Add(Left:=300, Width:=300, Top:=10, Height:=300) 
With cht 

.Chart.SetSourceData Source:=Sheets("Data").Range("a1:d29") 
.Chart.Type = xlLine 
.Left = 350 
.Width = 400 
.Top = 30 
.Height = 200 

End With 
End Sub 

但我想用一个阵列阵列1 =表(“数据”)范围(“A1:D29”),而不是

.Chart.SetSourceData Source:=Sheets("Data").Range("a1:d29") 

我又怎能代码这个?谢谢!

+0

埃米尔你有没有机会尝试我发布的解决方案? – 2014-09-15 17:36:11

+0

标题很混乱。它应该是来自Range的(...),而不是数组,而在VBA中有点不同。 – 2017-02-23 10:51:57

回答

4

您将不得不使用Series对象的单个组件。 SetSourceData方法需要一个范围,并且不能使用Variant数组。

下面的例子假定列A中的X值(类别标签),以及列B,C和D中的三列数据。根据需要进行修改。

Sub arraychart() 
Dim cht As Object 
Dim hhh As Variant 
Dim srs as Series 
Dim arrayValues as Variant 
Dim arrayXValues as Variant 
Dim rng as Range 
Dim c as Integer 

Set cht = ActiveSheet.ChartObjects.Add(Left:=300, Width:=300, Top:=10, Height:=300) 

'Define the range you'll use: 
Set rng = Range("A1:D29") 'modify as needed 

'Define the array of X-Values to use in the chart 
arrayXValues = rng.Columns(1).Value 

With cht 
    .Chart.Type = xlLine 
    .Left = 350 
    .Width = 400 
    .Top = 30 
    .Height = 200 
    'Create each series in the chart 
    For c = 2 to rng.Columns.Count 
     'Define the array of values for each series 
     arrayValues = rng.Columns(c).Value 
     Set srs = .Chart.SeriesCollection.NewSeries 
     With srs 
      .XValues = arrayXValues 
      .Values = arrayValues 
      .Name = "whatever you want to name it, etc." 'Modify as needed 
     End With 
    Next 

End With 
End Sub 

输出

下面是示例数据为例图表:

enter image description here

注意我做过这唯一的一次是由于一些企业的指令,我们的图形应用程序应该生成不容易(或错误地)被用户或消费者修改的图表。所以我们花了很长时间建设,开发和支持这种方法。

它使“数据”独立于工作表/计算/等。虽然这有一些用途,例如它可以防止用户无意中“破坏”图表,但它也使普通用户难以或不可能更新或修改图表故意。并且,它违背了用户对图表的所有期望,您不能使用它们轻松地可视化数据中的更改,您不能通过添加新系列或删除Worksheet上的现有系列等来轻松修改它们。 。可能还有其他理由憎恨这种方法......

总之,我不会推荐这样做,除非你的薪水取决于它。最终,他们要求我们使用SetSourceDataSeries.Formula方法回到“正常”图表。

+0

'...设置srs = .Chart.SeriesCollection.NewSeries ...'它应该没有'.Chart'只是'Set srs = .SeriesCollection.NewSeries' – 2016-05-05 20:53:11

+0

@rafaBG自从我看了两年后,我非常肯定自己当时测试过,因为我还提供了它的输出截图。 .. – 2016-05-05 21:01:36