セルの値に基づいて右クリックメニューボタンを実行するマクロをいくつか作成しました。通常、値が「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
CallShowHide
およびcallGenericQuery
subsを含むメイン モジュールでパブリック文字列として定義されます。