Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : 指定なし)
右クリックメニューにマクロを追加⇒2回実行される
投稿日時: 19/11/14 16:13:24
投稿者: つぼしちー

OfficeのバージョンはHome and Business2019です。
 
以下のサイトを参考に、右クリックメニューにマクロの実行メニューを追加し、マクロを実行することはできました。
 
Excelの右クリックメニューをカスタマイズ(Excel VBA)
 http://gingozi.cocolog-nifty.com/blog/2014/05/excelexcel-vba-.html
 
Excelの右クリック/コンテキストメニューにカスタムボタンを追加する方法は?
 https://www.extendoffice.com/ja/documents/excel/4375-excel-add-button-macro-to-right-click-menu.html
 
ただし、2回実行されてしまいます。原因と対策を教えていただけますでしょうか。
 
ソースコードは以下(質問用に簡素化しています)
 
★ThisWorkbookに以下を記述
 
Option Explicit
 
Private Sub Workbook_Open()
 
Call Application.CommandBars("Cell").Reset
 
With Application.CommandBars("Cell")
With .Controls.Add(Before:=1, Temporary:=True)
    .Caption = "【マクロ実行】"
    .OnAction = "マクロ実行()"
.BeginGroup = False
End With
End With
 
End Sub
 
★Module1に以下を記述
 
Sub マクロ実行()
     
    MsgBox "マクロが呼ばれました"
     
End Sub
 
Excelの右クリックメニューから【マクロ実行】を実行すると、
"マクロが呼ばれました"のメニューが2回実行されてしまいます。
 
 

投稿日時: 19/11/14 16:31:34
投稿者: つぼしちー

>"マクロが呼ばれました"のメニューが2回実行されてしまいます。
 
"マクロが呼ばれました"のメッセージが2回表示されてしまいます。
 
の間違いです。
 

回答
投稿日時: 19/11/14 17:20:12
投稿者: 半平太

> .OnAction = "マクロ実行()"
 
括弧が余分じゃないですか?
 
どうしてそう言う挙動になるのかは分からないですが・・

回答
投稿日時: 19/11/14 20:58:52
投稿者: WinArrow
投稿者のウェブサイトに移動

面白そうなテーマだったので、
以下、テストしてみました。
 
標準モジュールに
1回目
Sub test()
    Run "マクロ()"
End Sub
 
Private Sub マクロ(Optional DATA As String = "まだまだ")
    Stop
    Debug.Print DATA
End Sub
結果
イミディトウィンドウに
"まだまだ"が2回表示される
Stopでは止まらない
 
2回目
Sub test()
    Run "マクロ()","メモメモ"
End Sub
 
Private Sub マクロ(Optional DATA As String = "まだまだ")
    Stop
    Debug.Print DATA
End Sub
結果
イミディトウィンドウに
"まだまだ"が2回表示される
第1引数がわたらない
Stopではとまらない
 
 

回答
投稿日時: 19/11/14 22:52:14
投稿者: WinArrow
投稿者のウェブサイトに移動

通常、プロシジャを作成するとき
SUB プロシジャ名()
 
のように「()」をつけます。
この「()」は、プロシジャの引数を記述ためのカッコです。
「()」は引数がないということになります。
従って「()」は、プロシジャ名ではありません。
 
OnActionにはプロシジャ名を指定します。・・・つまり「()」は不要なんです。
 
また、RUN メソッドでも、第一引数には、プロシジャ名を指定することになります。
ここでも「()」は不要です。
 
プロシジャを呼び出す、もう一つの方法、CALL では、プロシジャ名を指定しますが、
「()」をつけると、消えてしまいます。
 
前レスでも書きましたが、
「()」をつけたプロシジャ名で飛んだ場合、
Stopがされないばかりか、ブレークポイントが効かない
しかし、2回実行される
 
仕様なのか?バグなのか?
はっきりしたことはわかりません。

回答
投稿日時: 19/11/14 23:07:36
投稿者: MMYS

当方でも試してみた所、WinArrowさんと同結果でした。
で、さらに下記で試した所
 
Sub test()
    Run "マクロ(""メモメモ"")"
End Sub
結果
イミディトウィンドウに
"メモメモ"が2回表示される
Stopではとまらない
 
 
 
Sub test2()
    Run "マクロ", "メモメモ"
End Sub
正常に動作します。
正しい記述なので当たり前ですが。
 

回答
投稿日時: 19/11/15 07:54:17
投稿者: あすなろ

お邪魔します。
 
いつもAddメソッドの引数に、Type:=msoControlButton とタイプを指定していたので
気が付きませんでした。
 
 

投稿日時: 19/11/15 09:14:56
投稿者: つぼしちー

皆様、ありがとうございました。
 
()をとることで想定通りの挙動となりました。