如何在VB.Net中开发自己的Excel加载项

时间:2016-07-24 14:08:22

标签: vb.net excel-vba excel-addins vba excel

我正在尝试使用Vb.Net创建Excel加载项。我在VS2010中启动了Excel 2007加载项目。可悲的是,我对vb.net并不擅长;在这方面我更像是VB6开发人员,我的ThisAddin.vb代码是:

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)中添加了一个Ribbon项(通过Add New Item ...菜单选项) - 然后添加一个按钮。然后我转到代码并尝试调用该函数,并在使用时出现此错误:

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 个答案:

答案 0 :(得分:2)

该问题与Microsoft.Office.Tools.ExcelMicrosoft.Office.Interop.Excel中的定义有关。要编写“Interop”版本,您可以使用它:

   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

要扩展Native对象的功能并使用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)