【问题标题】:Right-click withevents works on source .xlsm but not on .xlam addin右键单击 withevents 适用于源 .xlsm 但不适用于 .xlam 插件
【发布时间】:2012-11-19 12:46:24
【问题描述】:

我已经根据单元格值制作了几个通过右键单击菜单按钮运行的宏。通常,如果我右键单击值为“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 文件中,代码运行良好:每次我右键单击符合特定条件的单元格时,都会得到“为 XYZ 运行宏”,一切都很好。

将文件另存为 .xlam 并将其加载为插件后,代码将无法正常工作。

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

编辑:

在按照 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

我在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 subs 的主模块中的公共字符串

【问题讨论】:

  • 能否请您详细说明它到底是如何不起作用的?
  • 跟进这个问题,问题是一旦我从右键菜单运行我的宏一次,我失去了 m_ObjMe,所以我需要回到 VBA 编辑器并手动重新运行 @987654330 @任何想法请 - 有点卡在这里:(

标签: excel vba add-in right-click


【解决方案1】:

这个问题听起来像您的WithEvents 仍在您的ThisWorkbook 班级中?您需要做的是创建一个新类,然后在加载项的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

【讨论】:

  • 谢谢 creamyegg 我已经尝试过你的解决方案,当我运行 workbook_open 子程序时它工作正常(然后 mxlApp 定义良好),宏运行正常但是,如果我想重新运行宏,右键菜单通常不会更新,第一次我得到“为 XYZ 运行宏”(通过右键单击包含值“XYZ”的单元格)然后宏运行正常但是如果在包含“ABC”的单元格上右键单击,我仍然有与以前相同的“为 XYZ 运行宏”有什么想法吗?谢谢
  • @user1737597 不幸的是,没有看到更多的代码,特别是关于如何构建上下文菜单等,没有太多可以继续尝试和帮助的。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多