将ChChart控件链接到Spreadsheet控件数据

我希望能够在VBA表单中embedded图表控件,允许用户点击控件的某些部分,这样就可以在隐藏的电子表格中点击包含X&Y值的数据。

我使用附加控制机制添加了“Microsoft Office Chat 11.0”和“Microsoft Office Spreadsheet 11.0”控件,并在表单上放置了其中的一个。 但是,对于我来说,我似乎无法将图表绑定到电子表格中包含的数据。 我考虑的一个select是

Dim SpdShtCtr As Spreadsheet Dim ChartControl As ChChart Dim XValues() As Variant, YValues() As Variant XValues = WorksheetFunction.Transpose(SpdShtCtrl.Range("XValues")) YValues = WorksheetFunction.Transpose(SpdShtCtrl.Range("YValues")) Dim c Set c = ChartControl.Constants With ChartControl .Clear .Charts.Add With .Charts(0).SeriesCollection.Add .Caption = "Data" .SetData c.vbDimCategories, c.chDataLiteral, XValues .SetData c.vbDimValues, c.chDataLiteral, YValues End With End With 

问题在于它不是dynamic的 – 如果电子表格中的数据发生变化,图表将不会自动更新。 另外,这不起作用。 我得到错误“对象不支持此属性或方法” .SetData ...

另一种select是这样的

 Dim SpdShtCtr As Spreadsheet Dim ChartControl As ChChart Dim XValues As Range, YValues As Range Set XValues = SpdShtCtrl.Range("XValues") Set YValues = SpdShtCtrl.Range("YValues") Dim c Set c = ChartControl.Constants With ChartControl .DataSource = SpdShtCtrl .Clear .Charts.Add With .Charts(0).SeriesCollection.Add .Caption = "Data" .SetData c.vbDimCategories, c.chWORKSHEETRANGECONSTANT, XValues .SetData c.vbDimValues, c.chWORKSHEETRANGECONSTANT, YValues End With End With 

但我不知道这是否是将这些控件绑定在一起的正确方法,即使是这样,常量定义应该取代WORKSHEETRANGECONSTANT来定义链接到工作表范围。

任何人都可以指向正确的方向吗?

我添加了一个ChartSpace(= ChartSpace1)和一个电子表格(= Spreadsheet1)到一个用户窗体,并做了这样的:

 Private Sub UserForm_Initialize() Dim chc As ChChart With Spreadsheet1 For i = 1 To 3 ' just filling sample Data to Spreadsheet .Cells(i, 1) = i .Cells(i, 2) = i + 2 Next End With Set chc = ChartSpace1.Charts.Add chc.Type = chChartTypeScatterSmoothLineMarkers ChartSpace1.DataSource = Spreadsheet1 ' linking the Spreadsheet and the Chart chc.SeriesCollection.Add With chc.SeriesCollection(0) .SetData chDimSeriesNames, 0 .SetData chDimCategories, 0 .SetData chDimXValues, 0, "A1:A3" ' setting the x coordinate range .SetData chDimYValues, 0, "B1:B3" ' setting the y coordinate range End With chc.HasLegend = True End Sub 

为我工作,但我不知道这是否做你需要的一切。