Excel-VBA ショートカットメニュー追加
マウス右クリックでのショートカットメニュー「テストA、テストB、テストC」を最上段に追加(挿入)したい、
CommandBarControls.Add メソッド
構文:式.Add(Type, Id, Parameter, Before, Temporary)
これのBeforeを定義すれば良さそうに思えるのですが、成功しません!?
正しい記述事例を教えて下さい。
参考(現状):下記は最後(末尾)にメニューが追加されてしまう状態です。
Public Sub ShortCutMenuAdd()
Dim newMenu As CommandBarControls
Set newMenu = Application.CommandBars("Cell").Controls
newMenu.Add Type:=msoControlButton, Temporary:=True
newMenu(newMenu.Count).Caption = "テストA"
newMenu(newMenu.Count).OnAction = "mymsgA"
newMenu(newMenu.Count).BeginGroup = True
newMenu.Add Type:=msoControlButton, Temporary:=True
newMenu(newMenu.Count).Caption = "テストB"
newMenu(newMenu.Count).OnAction = "mymsgB"
newMenu.Add Type:=msoControlButton, Temporary:=True
newMenu(newMenu.Count).Caption = "テストC"
newMenu(newMenu.Count).OnAction = "mymsgC"
Set newMenu = Nothing
End Sub
No.1ベストアンサー
- 回答日時:
>最上段に追加(挿入)したい、
このようにすればよいと思います。
Sub RightClickMenuAdding()
'右クリックメニュー登録
With Application.CommandBars("CELL")
'二重登録を避けるために入れる
On Error Resume Next
.Controls("テストA").Delete
.Controls("テストB").Delete
.Controls("テストC").Delete
On Error GoTo 0
With .Controls.Add _
(Type:=msoControlButton, Before:=1, Temporary:=True)
.BeginGroup = False
.Caption = "テストC"
.OnAction = "mymsgC"
End With
With .Controls.Add _
(Type:=msoControlButton, Before:=1, Temporary:=True)
.BeginGroup = False
.Caption = "テストB"
.OnAction = "mymsgB"
End With
With .Controls.Add _
(Type:=msoControlButton, Before:=1, Temporary:=True)
.BeginGroup = False '←True, False どちらでも良い
.Caption = "テストA"
.OnAction = "mymsgA"
End With
End With
End Sub
早々の回答有難うございました。
非力な私なのですがやっと皆様の回答内容を理解できました。両者ともBerryGood-感謝。
参考1:指定に[After]が無いため苦肉の策として次のダミーを追記して実践運用する事としました。
With .Controls.Add(Type:=msoControlButton, Before:=1, Temporary:=True)
.BeginGroup = True '←グループの初め(横線)
.Enabled = False '←不活性化する
End With
参考2:二重登録回避策として最良かどうか半信半疑ですが、
「.Controls("テストA").Delete」ではなく、
次の「.Reset」で実践運用しています。
Application.CommandBars("Cell").Reset '←標準に戻す
以上
No.2
- 回答日時:
既出回答で良いのだと思いますが、下記でもやってみました。
加える位置はBeforeで指定するようですが、Afterがあるかどうか判りません(エラーになった)。
追加位置と、インデックス番号を使った。Add-Selectがうまく行かなかったので。
配列で繰り回せるが、類似コードを3回記述した。
Sub ShortCutMenuAdd1()
Application.CommandBars("Cell").Controls.Add Type:=msoControlButton, Temporary:=True, Before:=1
With Application.CommandBars("CELL").Controls(1)
.Caption = "テストA"
.OnAction = "mymsgA"
.BeginGroup = True
End With
Application.CommandBars("Cell").Controls.Add Type:=msoControlButton, Temporary:=True, Before:=2
With Application.CommandBars("CELL").Controls(2)
.Caption = "テストB"
.OnAction = "mymsgB"
.BeginGroup = True
End With
Application.CommandBars("Cell").Controls.Add Type:=msoControlButton, Temporary:=True, Before:=3
With Application.CommandBars("CELL").Controls(3)
.Caption = "テストC"
.OnAction = "mymsgC"
.BeginGroup = True
End With
'Set newMenu = Nothing
End Sub
ーー
参考
ついでにテスト中に余分なまたは位置を誤った追加が行われたときは、訂正には下記を使いました。
適当にコメント記号をはずして実行しました。
インデックス番号での指定(位置での指定)がわかりやすかった。
Public Sub ShortCutMenuAdd() 'Excel-VBA ショートカットメニューアイテム表示・削除
Dim newMenu As CommandBarControls
Dim ctl
' With Application.CommandBars("CELL")
For Each ctl In Application.CommandBars("CELL").Controls
MsgBox ctl.Index & " " & ctl.Caption
Next
With Application.CommandBars("CELL")
'.Controls(1).Delete
'.Controls(2).Delete
'.Controls(3).Delete
.Controls(4).Delete
'.Controls(5).Delete
'.Controls("テストA").Delete
'.Controls("テストB").Delete
'.Controls("テストC").Delete
End With
End Sub
早々の回答有難うございました。
複数の方から回答を頂いたのですが何れも実用的に申し分ない事例であると感謝しています。
両者は何れもベストアンサーなのですが、やむを得ず先に回答いただいた方をベストアンサーとした事をご理解下さい。
類似コードを3回記述するのも理解しやすくて良い方法だと思います。
次の記述はデバッグ時おおいに役にたちそう…使わせていただきます。
▽ショートカットメニューアイテム表示
For Each ctl In Application.CommandBars("CELL").Controls
MsgBox ctl.Index & " " & ctl.Caption
Next
以上
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) A列B列C列 3 2023/04/26 18:11
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- Visual Basic(VBA) Sheet2からオートフィルターで売上日を抽出した件数をカウントし、その件数をSheet1のセルB1 2 2023/01/12 12:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
texに関する初歩的な質問
-
JUnit結果出力をファイルに書き...
-
HWNDへの変換
-
VBからBeckyを使用したメール送...
-
Excel-VBA コンテンツの作成日時
-
納品 vs ご納品 どちらが正し...
-
「スポット受注」はどういう意...
-
Zと2とか紛らわしいのがあるか...
-
三菱製PLC:ファイルレジスタ(...
-
納期の前倒しを依頼する場合 ...
-
プログラマーの土日のみのアル...
-
3000行位の帳票作成プログラム...
-
formで送信したPOSTデータの削...
-
Windows server 2022 CALとSQL ...
-
営業職をやってます。先月発注...
-
テストについて
-
三菱シーケンサーA1SHCPUとA1SJ...
-
VC++ ラジオボタンの初期値に...
-
グーグルの障害者訓練プログラ...
-
IPv6へ移行するメリット
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
P2P地震速報のEEW APIの仕様書...
-
texに関する初歩的な質問
-
C#単体テストで同クラス内の呼...
-
テスト仕様書作成って初心者(...
-
EXCEL_VBAでOracleにADO接続し...
-
C#の単体テストでローカル変数...
-
ホームページ・ビルダーで「e...
-
VBからBeckyを使用したメール送...
-
HWNDへの変換
-
Visial C++におけるプログラミング
-
JUnit結果出力をファイルに書き...
-
Verilogの参考書のお勧めを教え...
-
UNIX:テキストファイルのNULL...
-
仕様書に書かれていないこと
-
VB6 コードでメニュー作成
-
テスト仕様書の著作権について
-
Excel-VBA コンテンツの作成日時
-
文字をなぞるとポップアップが...
-
単体テストについて
-
ハノイ塔の非再帰について
おすすめ情報