2

セルの値に基づいて右クリックメニューボタンを実行するマクロをいくつか作成しました。通常、値が「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

MyIdCallShowHideおよびcallGenericQuerysubsを含むメイン モジュールでパブリック文字列として定義されます。

4

1 に答える 1

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
于 2012-11-19T14:02:28.980 に答える