3

我正在使用 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

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

4

3 回答 3

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="..." 字符串的代码也可以工作。

于 2012-04-14T12:20:59.267 回答
0
Public Class CC

Private WithEvents A1 As Office.CommandBarButton
Private WithEvents A2 As Office.CommandBarButton
Private WithEvents A3 As Office.CommandBarButton

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

    A1 = NewControl.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton)

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

    A2 = NewControl.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton)

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

    A3 = NewControl.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton)

    With NewControl.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton)
        .Caption = "A3"
        .FaceId = 1155
    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

Private Sub A1_Click(ByVal Ctrl As Office.CommandBarButton, ByRef CancelDefault As Boolean) Handles A1.Click
    A1()
End Sub

Private Sub A2_Click(ByVal Ctrl As Office.CommandBarButton, ByRef CancelDefault As Boolean) Handles A2.Click
    A2()
End Sub

Private Sub A3_Click(ByVal Ctrl As Office.CommandBarButton, ByRef CancelDefault As Boolean) Handles A3.Click
    A3()
End Sub
End Class

这是我为上述问题找到的解决方案

于 2012-04-17T14:08:49.563 回答
0

这是一个问题。在 vb.net 中创建 excel 弹出窗口的任何信息都很少。这是我创建半动态菜单的版本。在这种情况下,菜单项来自字典,但可能来自任何地方。创建了此类并将其加载到工作簿启动事件中。

公共类 Popups Private mCmdBarPopFH As Microsoft.Office.Core.CommandBarPopup Private mCmdBarPopPH As Microsoft.Office.Core.CommandBarPopup Private mCmdBarPopRH As Microsoft.Office.Core.CommandBarPopup Private WithEvents tagFH1 As Microsoft.Office.Core.CommandBarButton Private WithEvents tagFH2 As Microsoft。 Office.Core.CommandBarButton Private WithEvents tagFH3 As Microsoft.Office.Core.CommandBarButton Private WithEvents tagPH1 As Microsoft.Office.Core.CommandBarButton Private WithEvents tagPH2 As Microsoft.Office.Core.CommandBarButton Private WithEvents tagPH3 As Microsoft.Office.Core.CommandBarButton Private WithEvents tagRH1 作为 Microsoft.Office.Core.CommandBarButton 私有 WithEvents tagRH2 作为 Microsoft.Office.Core.CommandBarButton 私有 WithEvents tagRH3 作为 Microsoft.Office.Core。CommandBarButton Private WithEvents tag1st As Microsoft.Office.Core.CommandBarButton Private WithEvents tag2nd As Microsoft.Office.Core.CommandBarButton Private WithEvents tagClr As Microsoft.Office.Core.CommandBarButton Private mFHDefDict As New Dictionary(Of String, HeaderDef) Private mPHDefDict As New Dictionary (字符串,HeaderDef)私有 mRHDefDict 作为新字典(字符串,HeaderDef)

Private mPHSheet As Excel.Worksheet  'temp until sheet management
Private mRHSheet As Excel.Worksheet
Private mFHSheet As Excel.Worksheet

'************************************************************************************
'Add popup menu for marking sample file.
'************************************************************************************
Public Sub TagsMenuAdd()
    Dim oHeaderDefs As New HeaderDefs
    Dim oCmdBar As Microsoft.Office.Core.CommandBar

    mFHSheet = CType(Globals.ThisWorkbook.Application.Sheets("File Headers"), Excel.Worksheet)
    mPHSheet = CType(Globals.ThisWorkbook.Application.Sheets("Plate Headers"), Excel.Worksheet)
    mRHSheet = CType(Globals.ThisWorkbook.Application.Sheets("Read Headers"), Excel.Worksheet)
    mFHDefDict = oHeaderDefs.DefDictLoad(mFHSheet)  'temp until sheet management
    mPHDefDict = oHeaderDefs.DefDictLoad(mPHSheet)
    mRHDefDict = oHeaderDefs.DefDictLoad(mRHSheet)

    oCmdBar = Globals.ThisWorkbook.Application.CommandBars.Add(Name:="Fil_CellMarking", Position:=Microsoft.Office.Core.MsoBarPosition.msoBarPopup, Temporary:=True)
    With oCmdBar
        tag1st = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
        tag1st.Caption = "Mark 1st Well of 1st data set"
        tag1st.Tag = "1st"
        tag2nd = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
        tag2nd.Caption = "Mark 1st Well of 2nd data set"
        tag2nd.Tag = "2nd"
        mCmdBarPopFH = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlPopup), Microsoft.Office.Core.CommandBarPopup)
        With mCmdBarPopFH
            .Caption = "Mark File Headers"
            .Enabled = True
        End With
        mCmdBarPopPH = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlPopup), Microsoft.Office.Core.CommandBarPopup)
        With mCmdBarPopPH
            .Caption = "Mark Plate Headers"
            .Enabled = True
        End With
        mCmdBarPopRH = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlPopup), Microsoft.Office.Core.CommandBarPopup)
        With mCmdBarPopRH
            .Caption = "Mark Read Headers"
            .Enabled = True
        End With
        tagClr = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
        tagClr.Caption = "Clear All Markings"
        tagClr.Tag = "clr"
    End With

    TagsMenuItemsFH(mFHDefDict)
    TagsMenuItemsPH(mPHDefDict)
    TagsMenuItemsRH(mRHDefDict)
End Sub
'************************************************************************************
'Add popup menu items for marking sample file.
'************************************************************************************
Public Sub TagsMenuItemsFH(DefDict As Dictionary(Of String, HeaderDef))
    Dim iButtons As Integer
    iButtons = 1
    For Each sKey As String In DefDict.Keys
        Select Case iButtons
            Case 1
                With mCmdBarPopFH
                    tagFH1 = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
                    tagFH1.Caption = DefDict(sKey).HeaderName
                    tagFH1.Tag = "FH1"
                End With
            Case 2
                With mCmdBarPopFH
                    tagFH2 = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
                    tagFH2.Caption = DefDict(sKey).HeaderName
                    tagFH2.Tag = "FH2"
                End With
            Case 3
                With mCmdBarPopFH
                    tagFH3 = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
                    tagFH3.Caption = DefDict(sKey).HeaderName
                    tagFH3.Tag = "FH3"
                End With
        End Select
        iButtons = iButtons + 1
    Next
End Sub
Public Sub TagsMenuItemsPH(DefDict As Dictionary(Of String, HeaderDef))
    Dim iButtons As Integer
    iButtons = 1
    For Each sKey As String In DefDict.Keys
        With mCmdBarPopPH
        Select iButtons
                Case 1
                    tagPH1 = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
                    tagPH1.Caption = DefDict(sKey).HeaderName
                    tagPH1.Tag = "PH1"
                Case 2
                    tagPH2 = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
                    tagPH2.Caption = DefDict(sKey).HeaderName
                    tagPH2.Tag = "PH2"
                Case 3
                    tagPH3 = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
                    tagPH3.Caption = DefDict(sKey).HeaderName
                    tagPH3.Tag = "PH3"
            End Select
        End With
        iButtons = iButtons + 1
    Next
End Sub
Public Sub TagsMenuItemsRH(DefDict As Dictionary(Of String, HeaderDef))
    Dim iButtons As Integer
    iButtons = 1
    For Each sKey As String In DefDict.Keys
        With mCmdBarPopRH
            Select Case iButtons
                Case 1
                    tagRH1 = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
                    tagRH1.Caption = DefDict(sKey).HeaderName
                    tagRH1.Tag = "RH1"
                Case 2
                    tagRH2 = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
                    tagRH2.Caption = DefDict(sKey).HeaderName
                    tagRH2.Tag = "RH2"
                Case 3
                    tagRH3 = CType(.Controls.Add(Type:=Microsoft.Office.Core.MsoControlType.msoControlButton), Microsoft.Office.Core.CommandBarButton)
                    tagRH3.Caption = DefDict(sKey).HeaderName
                    tagRH3.Tag = "RH3"
            End Select
        End With
        iButtons = iButtons + 1
    Next
End Sub
Private Sub Button_Click(ByVal Ctrl As Microsoft.Office.Core.CommandBarButton, ByRef CancelDefault As Boolean) Handles tag1st.Click, tag2nd.Click, tagClr.Click
    Select Case Ctrl.Tag
        Case "1st"
            MsgBox("1st")
        Case "2nd"
            MsgBox("2nd")
        Case "clr"
            MsgBox("clr")
    End Select
End Sub
Private Sub Header_Click(ByVal Ctrl As Microsoft.Office.Core.CommandBarButton, ByRef CancelDefault As Boolean) Handles tagFH1.Click, tagFH2.Click, tagFH3.Click, tagPH1.Click, tagPH2.Click, tagPH3.Click, tagRH1.Click, tagRH2.Click, tagRH3.Click
    Select Case Ctrl.Tag
        Case "FH1"
            MsgBox("FH1")
        Case "FH2"
            MsgBox("FH2")
        Case "FH3"
            MsgBox("FH3")
        Case "PH1"
            MsgBox("PH1")
        Case "PH2"
            MsgBox("PH2")
        Case "PH3"
            MsgBox("PH3")
        Case "RH1"
            MsgBox("RH1")
        Case "RH2"
            MsgBox("RH2")
        Case "RH3"
            MsgBox("RH3")
    End Select
End Sub

结束类

于 2013-01-30T23:26:47.197 回答