如何使用Visual Studio 2010创建的Excel加载项单击在Excel中创建的自定义上下文菜单执行操作

Kan*_*esh 2 vb.net vba excel-vba visual-studio-2010 excel-addins

我正在使用Visual Studio 2010创建Excel加载项.我的目的是向单元格添加上下文菜单,并对选定的单元格执行某些操作.这是我现在的代码

    Public Class CC

    Private Sub ThisAddIn_Startup() Handles Me.Startup
        AddMenu()
    End Sub

    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
        DeleteMenu()
    End Sub

    'AddMenu add context menu to excel
    Sub AddMenu()
        On Error Resume Next
        Dim Bar As Microsoft.Office.Core.CommandBar
        Dim NewControl As Microsoft.Office.Core.CommandBarControl
        Application.CommandBars("Cell").Controls("A").Delete()
        Bar = Application.CommandBars("Cell")
        NewControl = Bar.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlPopup, Id:=1, Temporary:=True)

        With NewControl
            .Caption = "A"
            .BeginGroup = True
            .TooltipText = "Change case of selected cells."
        End With

        With NewControl.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton)
            .Caption = "A1"
            .FaceId = 1144
            .OnAction = "A1"
        End With

        With NewControl.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton)
            .Caption = "A2"
            .FaceId = 1145
            .OnAction = "A2"
        End With

        With NewControl.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton)
            .Caption = "A3"
            .FaceId = 1155
            .OnAction = "A3"
        End With

    End Sub

    'DeleteMenu deletes the context meny added to excel
    Sub DeleteMenu()
        On Error Resume Next
        Application.CommandBars("Cell").Controls("A").Delete()
    End Sub

    Sub A1()
        MsgBox "A1"
    End Sub

    Sub A2()
        MsgBox "A2"
    End Sub

    Sub A3()
        MsgBox "A3"
    End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

当我安装此加载项时,上下文菜单出现在excel中,但是当我单击菜单按钮时,我收到一条错误消息,指出该宏在工作簿中不可用.任何人都可以告诉我如何使它工作?

Gov*_*ert 6

您的方法A1,A2和A3不会自动注册为Excel的宏.因此,将其名称设置为按钮的OnAction字符串无效 - Excel不知道名为"A1"的宏.因此,从这个意义上说,VSTO加载项的行为与VBA中的代码完全不同.

还有另一种方法:对于CommandBar按钮,您可以添加事件处理程序 - 您将使用WithEvents关键字,然后处理按钮的Click事件.可能会帮助您入门的一些示例如下:http://msdn.microsoft.com/en-us/library/aa189726(v = office.10).aspx

使用Excel-DNA(我开发的开源.NET/Excel集成库),.NET代码中的方法和用户定义函数通过C API在Excel中注册.因此,行为更接近于VBA的行为,并且使用OnAction ="..."字符串的代码也会起作用.