2016-07-24 49 views
1

我想用Vb.Net創建一個Excel加載項。我已經在VS2010中開始了一個Excel 2007外接程序項目。可悲的是,我對vb.net並不擅長;我在這方面多一個VB6開發人員,我ThisAddin.vb代碼:如何在VB.Net中開發我自己的Excel加載項

Public Class ThisAddin 

    Private Sub ThisAddIn_Startup() Handles Me.Startup 

    End Sub 

    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown 

    End Sub 

    ' test function; simple 
    Public Function getRowCount() As Long 
     Dim thisWB As Workbook = Me.Application.ThisWorkbook 
     Dim activWS As Worksheet 
     activWS = thisWB.ActiveSheet 
     Return activWS.UsedRange.Rows.Count 
    End Function 
End Class 

我還添加了一個功能區項目(通過添加新項...菜單選項)在設計模式(不是XML ) - 然後添加一個按鈕。然後我去編寫,並試圖調用函數,我得到這個錯誤使用時:

MsgBox(Globals.ThisAddIn.getRowCount()) 

這是我從這個鏈接了:Calling a procedure within another class

enter image description here

說實話,我已經一直在嘗試無數的事情,並且我得到了很多錯誤。我一直在網上尋找關於從頭創建我自己的Excel Addin的教程,但沒有真正的運氣。我不想使用Add-In-Express,因爲這是第三方應用程序,我必須從頭開始爲我的公司創建一個Excel加載項。

有沒有人有關於如何創建一個vb.net編碼的Excel Addin(2007),我可以用作模板或指南的想法?我已經嘗試了幾次,還有很多依賴於Add-In-Express,我真的不能這麼做。我有很多VBA代碼(自然VBA,因此它位於我的Excel文件的VBA /開發人員部分的模塊中),我想我可以將那些從VBA/VB6轉換爲VB.Net格式,這不是我關心的問題。這真的是要在VB.Net中編寫我自己的Excel Addin。任何幫助真的會很棒。謝謝。

*注意:我也不想問同事(或者自己)只需在快速訪問工具欄中添加我創建的函數和子集,因爲這實際上不是一個解決方案,考慮到這些按鈕將在他們創建或打開另一個工作簿時在那裏。從本質上講,我必須在vb.net中創建我自己的Excel插件。再一次感謝你。

+1

可能通過錯誤的工作是學習的情況。例如,[從HRESULT異常:0x800A03EC錯誤](http://stackoverflow.com/a/12893711/1115360)可能會幫助那一個。此外,請務必使用Option Strict On。 –

+0

你已經完成了哪些教程或步驟,展示如何構建Excel加載項? – ChicagoMike

+0

你可以嘗試像'Dim thisWB = Globals.ThisAddIn.Application.ActiveWorkbook' – Slai

回答

2

該問題與Microsoft.Office.Tools.ExcelMicrosoft.Office.Interop.Excel中的定義有關。要編寫一個「互操作」的版本,你可以這樣做:

Public Function getRowCount() As Long 

     Dim thisWB As Excel.Workbook = Application.ActiveWorkbook 
     Dim activWS As Excel.Worksheet = CType(thisWB.ActiveSheet, Excel.Worksheet) 

     Return activWS.UsedRange.Rows.Count 

    End Function 

擴展一個本地對象的功能和使用VSTO,你可以做這樣的:

Public Function getRowCount() As Long 

     Dim NativeWorkbook As Excel.Workbook = Application.ActiveWorkbook 
     Dim NativeWorksheet As Excel.Worksheet = CType(NativeWorkbook.ActiveSheet, Excel.Worksheet) 

     Dim thisWB As Workbook = Nothing 
     Dim activWS As Worksheet = Nothing 

     If NativeWorkbook IsNot Nothing Then 
      thisWB = Globals.Factory.GetVstoObject(NativeWorkbook) 
     End If 

     If NativeWorksheet IsNot Nothing Then 
      activWS = Globals.Factory.GetVstoObject(NativeWorksheet) 
     End If 

     Return activWS.UsedRange.Rows.Count 

End Function 

這是一個功能你可以放入ThisAddin.vb這將創建一個新的工作表。請注意,此函數命名工作表並將其添加到最後。

Public Function AddWorkSheet(sheetName As String) As Worksheet 

    Dim wk = Application.ActiveWorkbook 
    Dim ws As Worksheet = Nothing 

    Try 
     ws = CType(wk.Sheets.Add(, wk.Sheets(wk.Sheets.Count)), Worksheet) 
     ws.Name = sheetName 
    Catch ex As Exception 
     Throw 
    Finally 
     AddWorkSheet = ws 
    End Try 

End Function 

要使用此的ThisAddin.vb外,你可以做這樣的事情:

Dim ws As Excel.Worksheet 
Dim newSheetName As String 
    . 
    ' 
ws = Globals.ThisAddIn.AddWorkSheet(newSheetName) 
+0

謝謝,吉姆..我會嘗試這一點,當我再次拿起我的電腦..我可以問你,以及如果你有任何地方或鏈接或預訂購買,這將向我展示更多如何編寫Excel插件?我從來不知道有一個'NativeWorksheet'對象,並且一定會研究它...我真希望能夠嘗試這個! – RDJ

+1

@RDC我會開始[這裏](https://msdn.microsoft.com/en-us/library/cc668205.aspx)。不確定有很多書可用。我花了很多時間,只是使用MSDN文檔, –

+0

我實際上通過該鏈接發佈之前這裏..我沒有保存任何鏈接,所以我沒有發佈任何..只是因爲他們並沒有真正幫助我。我基本上試圖在我的帖子上面將VBA轉錄到VB.Net。話雖如此....我嘗試了代碼,它的工作原理!但是,當我想添加一個新工作表並將其分配給一個我可以使用的對象變量時,我無法使其工作。您能否幫助我多一點?請? – RDJ

相關問題