sironekotoroの日記

Perl で楽をしたい

Excel VBAスタンダード 公式テキスト 10章 メニューの操作

10-1 コンテキストメニューとは

  • セルや列見出し等を右クリックすると出てくるメニュー
  • VBAで扱うときはCommandBarオブジェクトで表される。
    • CommandBarの集合がCommandBarsコレクション
  • 「切り取り」「コピー」などのコマンドはCommandBarControlオブジェクト
    • Controlsコレクションで操作する
`セルを右クリックしたときに選択可能なコマンド数が表示される
MsgBox CommandBars("Cell").Controls.Count
'コンテキストメニューの4番目「形式を選択して貼付け」という文字列が表示される
MsgBox CommandBars("Cell").Controls(4).Caption
'コンテキストメニューの文字列からインデックス番号を取得する
MsgBox CommandBars("Cell").Controls("形式を選択して貼り付け(S)...").Index

10-2 コマンドを登録する

Controls.Add Type, Id, Parameter, Before, Temporary
  • Type 追加するコントロールの種類
    • msoControlButton すぐにマクロを実行するようなコマンド
    • msoControlPopup クリックするとサブメニューを表示するようなコマンド
  • Id と Parameter Excelの組み込みコマンドを追加するときに使用
  • Before コマンドを挿入する位置の指定
    • 3 を指定すると、上から3番目にあるコマンドの直前に新しいコマンドが追加される
    • 省略すると、コンテキストメニューの一番下に追加される
  • Temporary コンテキストメニューでは使用しない
Sub Macro1()
'
' コンテキストメニュー最下部に「処理1」を追加する
'
With CommandBars("Cell").Controls.Add(Type:=msoControlButton)
    .Caption = "処理1"
    .OnAction = "myMacro"
End With

'
End Sub

Sub myMacro()
    MsgBox "Hello"
End Sub

区切り線をつける

  • BeginGroupプロパティ

追加する位置を指定する

’上から3番目に「処理4」というメニューを追加する
With CommandBars("Cell").Controls.Add(Type:=msoControlButton, before:=3)
    .Caption = "処理4"
    .OnAction = "myMacro"
End With

コマンドにアイコンを表示する

  • FaceIdプロパティにアイコンのIDを指定する
'メニューの左端にフォルダのアイコンが追加される。
With CommandBars("Cell").Controls.Add(Type:=msoControlButton, before:=3)
    .Caption = "処理4"
    .OnAction = "myMacro"
    .FaceId = 23
End With

コマンドにチェックマークを付ける

  • StateプロパティにTrueを設定する

コマンドに説明をつける

  • Tagプロパティ

10-3 コマンドを削除する

  • ControlsコレクションのDeleteメソッドをつかう
'コンテキストメニューの上から2番目にあるコマンド(コピー)を削除する
CommandBars("Cell").Controls(2).Delete
  • コマンドの削除時には注意が必要

    • 自分が追加したコマンドに限って削除するべき
    • 不用意に削除しないように、tagプロパティの状態も合わせて削除を実施する
      • tagプロパティがある = 自分がつくったコマンド
  • Resetメソッド メニューを初期化する

    • 今までのコマンド試してきてメニューがぼろぼろで、戻らなかったらどうしようとか思ってた
    • 自分以外の人が追加したメニューまでリセットしないように、注意して使う必要がある。