Vb.net 是否可以将Microsoft.Office.Interop.Excel.Chart对象转换为Microsoft.Office.Tools.Excel.Chart对象?

Vb.net 是否可以将Microsoft.Office.Interop.Excel.Chart对象转换为Microsoft.Office.Tools.Excel.Chart对象?,vb.net,excel,interop,vsto,charts,Vb.net,Excel,Interop,Vsto,Charts,基本上,我已经在VB.NET2010中编写了一个Excel2007项目,它允许您创建具有相当多交互性的图表。我希望用户能够保存并重新打开此工作簿,并且在任何已创建的图表中仍具有交互性,因此他们不必重新创建它们 创建图表时,我使用Sheet1.Controls.AddChart(…),它返回一个Microsoft.Office.Tools.Excel.Chart,我可以用它处理事件等。但是,当我重新打开文件并查看Sheet1.Controls集合时,没有图表对象。当我需要图表工具时,通过Sheet

基本上,我已经在VB.NET2010中编写了一个Excel2007项目,它允许您创建具有相当多交互性的图表。我希望用户能够保存并重新打开此工作簿,并且在任何已创建的图表中仍具有交互性,因此他们不必重新创建它们

创建图表时,我使用Sheet1.Controls.AddChart(…),它返回一个Microsoft.Office.Tools.Excel.Chart,我可以用它处理事件等。但是,当我重新打开文件并查看Sheet1.Controls集合时,没有图表对象。当我需要图表工具时,通过Sheet1.ChartObjects.Chart访问图表可以为我提供互操作图表


有更好的方法吗?我是否应该从一开始就使用互操作图表?

根据,您可以使用HasVstoObject和GetVstoObject方法来转换一个文档,但是文档没有特别提到图表对象。

Paul,如果我没有解决您的问题,我提前道歉。直到现在我才意识到有两种类型的图表,我很想了解它们的问题。不管怎么说,经过一些胡闹之后,我能够创建一个图表,命名它,让它保持并让它对事件做出响应。但它确实依赖于互操作图表:

Public Class ThisWorkbook
    Dim clsChart As cChart

    Private Sub ThisWorkbook_Startup() Handles Me.Startup
        Dim coChartObj As Microsoft.Office.Interop.Excel.ChartObject
        Dim chtMyChart As Microsoft.Office.Interop.Excel.Chart
        Dim i As Int32

        With Globals.Sheet1
            For i = 1 To .ChartObjects.count
                If .ChartObjects(i).Name = "MyChart" Then
                    chtMyChart = .ChartObjects(i).chart
                    Exit For
                End If
            Next i
            If chtMyChart Is Nothing Then
                chtMyChart = .Shapes.AddChart.Chart
                chtMyChart.SetSourceData(.Range("A1:B2"))
                coChartObj = chtMyChart.Parent
                coChartObj.Name = "MyChart"
            End If
            clsChart = New cChart
            clsChart.chtChart = chtMyChart
        End With
    End Sub
End Class

Public Class cChart
    Public WithEvents chtChart As Microsoft.Office.Interop.Excel.Chart

    Private Sub chtChart_Resize() Handles chtChart.Resize
        MessageBox.Show("resize")
    End Sub
End Class

根据:要重新创建Microsoft.Office.Tools.Excel.Chart主机控件,必须首先删除本机的Microsoft.Office.Interop.Excel.Chart,然后使用AddChart(范围,字符串)或AddChart(双精度,双精度,双精度,字符串)方法重新创建Microsoft.Office.Tools.Excel.Chart。没有“添加”方法使您能够基于现有的Microsoft.Office.Interop.Excel.Chart创建新的Microsoft.Office.Tools.Excel.Chart。看起来它们必须在启动时完全重新创建。嗨,道格,你能在代码中处理这些图表的事件吗?根据我的经验,我必须使用Microsoft.Office.Tools.Excel.Chart并用事件声明它,以便代码正确触发和处理它的事件。请让我知道(并演示)您是否能够仅使用互操作品种来实现这一点。谢谢Paul,我是一个有点.Net的VBA程序员,所以我在VBA中就是这么做的:我创建了一个名为cChart的类(现在显示在代码末尾)。如您所述,它包含WithEvents图表。我包括了一个调整大小的事件进行演示。然后,在我的ThisWorkbook代码中,我将clsChart声明为顶部的cChart,并将新创建的或以前创建的图表分配给靠近末尾的两行中的WithEvents图表:clsChart=New cChart clsChart.chtchchart=chtMyChart测试这一点的最佳方法是发布它,打开工作簿,进行更改,保存,重新打开等等,这听起来很合理。我首先使用Tools图表的原因之一是Sheet1.Controls.AddChart(…)返回的对象类型。我喜欢使用该函数,因为它允许我在参数中设置图表的名称。我将看看是否能找到一种在互操作版本中工作的方法。我觉得我在使用Interop版本正确启动事件时遇到了问题,但我尝试这一点是很久以前的事了,所以有机会的话,我会再尝试一次。谢谢