Excel 右键单击withevents可在source.xlsm上工作,但不能在.xlam加载项上工作

Excel 右键单击withevents可在source.xlsm上工作,但不能在.xlam加载项上工作,excel,vba,add-in,right-click,Excel,Vba,Add In,Right Click,我制作了两个宏,它们根据单元格值通过右键单击菜单按钮运行。通常,如果我右键单击值为“XYZ”的单元格,菜单按钮将显示为“为XYZ运行宏”,然后执行一系列操作:显示两个用户表单、运行SQL查询、显示和格式化结果数据 在原始.xlsm文件的“Thisworkbook”上,我有以下代码: Public WithEvents mxlApp As Application Public WithEvents mxlSh As Worksheet Private Sub mxlApp_SheetBef

我制作了两个宏,它们根据单元格值通过右键单击菜单按钮运行。通常,如果我右键单击值为“XYZ”的单元格,菜单按钮将显示为“为XYZ运行宏”,然后执行一系列操作:显示两个用户表单、运行SQL查询、显示和格式化结果数据

在原始.xlsm文件的“Thisworkbook”上,我有以下代码:

Public WithEvents mxlApp  As Application

Public WithEvents mxlSh  As Worksheet

Private Sub mxlApp_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As 
Boolean)

... (do stuff here) ...

End Sub

...

Private Sub Workbook_Open()

    Call AutoExec

End Sub

...
在一个单独的模块上,我使用以下函数来设置我的事件处理程序

Public Sub AutoExec()

        Set mxlApp = Application

        Set ColectionOfMxlEventHandlers = New Collection

        ColectionOfMxlEventHandlers.Add mxlApp

        Debug.Print ThisWorkbook.Name & " Initialized"

End Sub
问题:在原始的.xlsm文件中,代码运行良好:每次我右键单击满足特定条件的单元格时,都会得到“Run macro for XYZ”,一切正常

一旦我将文件保存为.xlam并将其加载为addin,代码将无法工作

我一直在网上和这里到处寻找,不知道如何解决这个问题

编辑:

按照creamyegg善意的建议修改代码后,我得到的是:

类内模块
clsAppEvents

Private WithEvents mxlApp As Excel.Application

Private Sub Class_Initialize()

    Set mxlApp = Excel.Application

End Sub

Private Sub mxlApp_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

Dim cBut As CommandBarButton

    On Error Resume Next

        Call CleanMenu

        If Len(Target.Value) = 8 Then

            MyId = Target.Value

            With Application

                Set cBut = .CommandBars("Cell").Controls.Add(Temporary:=True)

            End With

            With cBut

               .Caption = "Run SQL Query for " & MyId

               .Style = msoButtonCaption

               .FaceId = 2554

               .OnAction = "CallGenericQuery"

            End With

        End If

        With Application

                Set cBut = .CommandBars("Cell").Controls.Add(Temporary:=True)

        End With

        With cBut

           .Caption = "Columns_Select"

           .Style = msoButtonCaption

           .FaceId = 255

           .OnAction = "CallShowHide"

        End With

    On Error GoTo 0

End Sub
Private WithEvents mxlApp As Excel.Application

Private Sub Class_Initialize()
    Set mxlApp = Excel.Application
End Sub

Private Sub mxlApp_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
...
End Sub
这本工作簿中
我上过课

Public m_objMe As clsAppEvents

Private Sub Workbook_Open()

    Set m_objMe = New clsAppEvents

    Debug.Print ThisWorkbook.Name & " Initialized"

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    On Error Resume Next

           Call CleanMenu

    On Error GoTo 0

    Set m_objMe = Nothing

End Sub

Private Sub Workbook_Deactivate()

    Call CleanMenu

End Sub

MyId
在包含
CallShowHide
callGenericQuery
subs的主模块中被定义为公共字符串
WithEvents
问题听起来像您的
WithEvents
仍然在
ThisWorkbook
类中?您需要做的是创建一个新类,然后在外接程序的
Workbook\u Open()。例如:

新类(
clsAppEvents
):

外接程序
此工作簿
类:

Private m_objMe As clsAppEvents

Private Sub Workbook_Open()
    Set m_objMe = New clsAppEvents
End Sub

Private Sub WorkbookBeforeClose(Cancel As Boolean)
    Set m_objMe = Nothing
End Sub

你能详细说明一下它到底是如何工作的吗?在这个问题之后,问题是一旦我从右键菜单运行了一次宏,我就失去了m_ObjMe,所以我需要返回VBA编辑器并手动重新运行
set m_ObjMe=New ClsAppEvents
任何想法plse-这里有点卡住了:(感谢您creamyegg我尝试了您的解决方案,当我运行工作簿_open sub(mxlApp定义良好)时,它工作正常,宏运行正常。但是,如果我想重新运行宏,右键单击菜单通常不会更新,当我第一次获得“为XYZ运行宏”(通过右键单击包含值“XYZ”的单元格)然后宏运行良好,但如果在包含“ABC”的单元格上单击鼠标右键,我仍然拥有与之前相同的“为XYZ运行宏”任何想法plse?thanks@user1737597不幸的是,如果没有看到更多的代码,尤其是如何构建上下文菜单等,那么就没有太多的东西可以进一步尝试和帮助。