Excel 右键单击withevents可在source.xlsm上工作,但不能在.xlam加载项上工作
我制作了两个宏,它们根据单元格值通过右键单击菜单按钮运行。通常,如果我右键单击值为“XYZ”的单元格,菜单按钮将显示为“为XYZ运行宏”,然后执行一系列操作:显示两个用户表单、运行SQL查询、显示和格式化结果数据 在原始.xlsm文件的“Thisworkbook”上,我有以下代码: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
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不幸的是,如果没有看到更多的代码,尤其是如何构建上下文菜单等,那么就没有太多的东西可以进一步尝试和帮助。