2010-08-05 262 views
1

基本上我已經在VB.NET 2010中編寫了一個Excel 2007項目,它允許您創建具有相當數量交互性的圖表。我希望用戶能夠保存並重新打開此工作簿,並且在任何已創建的圖表中仍然具有該交互功能,因此他們不必重新創建它們。我可以將Microsoft.Office.Interop.Excel.Chart對象轉換爲Microsoft.Office.Tools.Excel.Chart對象嗎?

當我創建圖表時,我使用Sheet1.Controls.AddChart(...),它返回一個Microsoft.Office.Tools.Excel.Chart,我可以使用它處理事件等。但是,當我重新打開該文件並查看Sheet1.Controls集合時,沒有Chart對象。當我需要工具圖表時,通過Sheet1.ChartObjects.Chart訪問圖表會給我Interop圖表。

有沒有更好的方法來做到這一點?我應該從一開始就使用Interop圖表嗎?

回答

1

根據MSDN article,您可以使用HasVstoObject和GetVstoObject方法來轉換native object into a host control.雖然文檔沒有具體提及圖表對象。

+0

根據http://msdn.microsoft.com/en-us/library/cc442765.aspx: 要重新創建Microsoft.Office.Tools.Excel .Chart主機控件,您必須先刪除本機Microsoft.Office.Interop.Excel.Chart,然後使用AddChart(範圍,字符串)或AddChart(雙精度)重新創建Microsoft.Office.Tools.Excel.Chart。 Double,Double,Double,String)方法。沒有添加方法,使您可以基於現有的Microsoft.Office.Interop.Excel.Chart創建新的Microsoft.Office.Tools.Excel.Chart。 所以看起來他們必須在_Startup上完全重新創建。 – Paul 2010-08-05 23:15:34

1

保羅,如果我沒有解決您的問題,我會提前道歉。直到現在,我還沒有意識到有兩種類型的圖表,我有興趣瞭解與他們的問題。無論如何,經過一番混戰之後,我能夠創建一個圖表,命名它,讓它持續下去,並對事件做出反應。它不依賴於互操作的圖表,但:

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 
+0

Hi Doug, 你能在你的代碼中處理這些圖表的事件嗎?根據我的經驗,我必須使用Microsoft.Office.Tools.Excel.Chart並將其聲明爲WithEvents,以使其事件正確觸發並由我的代碼處理。請讓我知道(並演示)您是否能夠僅通過Interop品種完成此操作。謝謝! – Paul 2010-08-06 13:33:35

+0

Paul,我是一個帶有一點.Net的VBA程序員,所以這幾乎是我在VBA中做的事情: 我做了一個名爲cChart的類(現在顯示在我的代碼末尾)。它包含一個WithEvents圖表,如您所述。我包含一個Resize事件來演示。 然後在我的ThisWorkbook代碼我聲明clsChart如cChart在頂部和分配新的或先前創建的圖表到WITHEVENTS圖表中的2行附近的端: clsChart =新cChart clsChart.chtChart = chtMyChart 最好方式來測試這是發佈它,打開工作簿,進行更改,保存,重新打開等。 – 2010-08-06 15:43:46

+0

嗨道格,這聽起來很合理。我首先使用Tools圖表的原因之一是由Sheet1.Controls.AddChart(...)返回的對象類型。我喜歡使用該函數,因爲它允許我在參數中設置圖表的名稱。我會看看我能否找到在Interop版本中工作的方法。我覺得我遇到了一些問題,需要Interop版本才能正確解決問題,但是我剛纔嘗試這個時候,所以當我有機會的時候我會再試一次。謝謝! – Paul 2010-08-07 03:07:06

相關問題