用鼠标右键单击源文件.xlsm,但不是.xlam插件

我已经制作了一些基于单元格值通过右键菜单button运行的macros。 通常情况下,如果我右键单击值为'XYZ'的单元格,菜单button会显示为'为XYZ运行macros',然后执行一堆操作:显示几个用户窗体,运行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文件中,代码工作正常:每当我右键单击符合某些条件的单元格时,就会得到“为XYZ运行macros”,并且一切正常。

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

我一直在网上查找无处不在,无法弄清楚如何解决这个问题。

编辑:

修改代码后,如creamyeggbuild议,这是我有:

在类模块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 

在这Thisworkbook课上我有

 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在包含CallShowHidecallGenericQuery的主模块中定义为公共string

这个问题听起来像你的WithEvents仍然在你的ThisWorkbook类? 你需要做的是创build一个新的类,然后在加载项的Workbook_Open()事件上实例化这个实例。 例如:

新类( 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) ... End Sub 

加载项ThisWorkbook类:

 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