1.メニューにコマンドを登録する
CommandBars(“Cell”).Contols.Add
object.Caption
Exel2007からメニューバーとツールバーが廃止されました。しかし、右クリックした際に表示されるコンテキストメニューは従来通りの機能が残されています。独自のマクロなどをコンテキストメニューに登録すれば、従来のバージョンと同じ操作性を実現します。メニューはCommandBarオブジェクトで操作します。セルのコンテキストメニューの名前はCellです。メニュー項目を表すControlsコレクションに新しいコマンドをAddメソッドで追加します。メニューに表示される文字列は、Captionプロパティに指定します。
1 2 3 4 5 |
Sub sample1() With CommandBars("Cell").Controls.Add .Caption = "Macro1" End With End Sub |
2.コマンドを削除する
CommandBars(“Cell”).Contols(string).Delete
登録したコマンドを削除するときは、Deleteメソッドを実行します。存在しないコマンドを削除しようとするとエラーになります。
1 2 3 |
Sub sample2() CommandBars("Cell").Controls("Macro1").Delete End Sub |
3.メニューを初期化する
CommandBars(“Cell”).Reset
メニューを初期状態に戻すには、CommandBarオブジェクトのResetメソッドを実行します。ただし、安易にResetメソッドを実行しないように注意してください。初期化すると、他のアドインなどが登録したコマンドなども全て消えてしまいます。自分で登録したコマンドを消すのであれば、初期状態にするのではなく、自分で登録したコマンドだけを削除してください。メニューは共有スペースです。
1 2 3 |
Sub sample3() CommandBars("Cell").Reset End Sub |
4.登録する位置を指定する
CommandBars(“Cell”).Controls.Add(Before)
コマンドを登録するAddメソッドでは、登録する位置を指定できます。引数Beforeに数値を指定すると、指定された数の位置にあるコマンドの上に、新しいコマンドが登録されます。
1 2 3 4 5 |
Sub sample4() With CommandBars("Cell").Controls.Add(before:=1) .Caption = "Macro1" End With End Sub |
5.コマンドにマクロを登録する
CommandBars(“Cell”).Controls.add
object.OnAction
登録したコマンドにマクロを設定するには、OnActionプロパティにしたいプロシージャの名前を登録します。
1 2 3 4 5 6 7 8 9 10 11 |
Sub sample5() With CommandBars("Cell").Controls.Add(Before:=1) .Caption = "Macro1" .OnAction = "myMacro1" End With End Sub Sub myMacro1() MsgBox "Hello World" End Sub |
6.コマンドに区切り線をつける
CommandBars(“Cell”).Controls.BeginGroup
CommandBars(“Cell”).Controls.Add(Before)
コマンド間の区切り線は、コマンドとコマンドの間に線を引いているのではなく、区切り線の下になるコマンドに「ここからグループの始まり」という設定をします。サンプルではAddメソッドによって、新しいコマンドを1案目にあるコマンドの手前に登録いています。そこで、それまで1番上にあったコマンドにあらかじめグループの始まりであると設定しておきます。それが、BeginGroup = Trueです。区切り線を消すには、BeginGroup = Falseとします。
1 2 3 4 5 6 7 |
Sub sample6() CommandBars("Cell").Controls(1).BeginGroup = True With CommandBars("Cell").Controls.Add(Before:=1) .Caption = "Macro1" .OnAction = "myMacro1" End With End Sub |
7.コマンドにアイコンを表示する
CommandBars(“Cell”).Controls.Add
object.FaceId
コマンドにアイコンを表示するには、FaceIdプロパティにアイコンを表す数値を指定します。
1 2 3 4 5 6 7 8 |
Sub sample7() CommandBars("Cell").Controls(1).BeginGroup = True With CommandBars("Cell").Controls.Add(before:=1) .Caption = "Macro1" .OnAction = "myMacro1" .FaceId = 59 End With End Sub |
どの数値がどんなアイコンなのかは、ヘルプ等では公開されていません。
8.既存の機能を割り当てる
メニューに登録するコマンドには、自作のマクロだけでなく、Excelが標準で有している機能を登録することも可能です。標準機能を割り当てるには、Addメソッドの引数IDに機能を表すID番号を指定します。サンプルは、ファイルを開くの機能を登録してコマンド名をMacro1としました。
1 2 3 4 5 6 |
Sub sample7() CommandBars("Cell").Controls(1).BeginGroup = True With CommandBars("Cell").Controls.Add(Before:=1, ID:=23) .Caption = "Macro1" End With End Sub |
どの機能のIDが何番かは、ヘルプなどでは公開されていません。
9.コマンドが押された状態にする
CommandBars(“Cell”).Controls.Add
object.State
コマンドのアイコンが押された状態にするためには、StateプロパティにTrueを設定します。FaceIdが設定されていると、そのアイコンが押されたように表示され、FaceIdが設定されていないと下の画面のようにチェックマークが表示されます。
1 2 3 4 5 6 7 8 |
Sub sample9() With CommandBars("Cell").Controls.Add(before:=1) .Caption = "Macro1" .OnAction = "myMacro1" '.FaceId = 59 .State = True End With End Sub |
10.サブメニューを追加する
CommandBars(“Cell”).Controls.Add(Before, msoControlPopup)
メニューにサブメニューを登録するには、Addメソッドの引数Typeに定数msoControlPopupを指定します。こうして登録したコントロールはサブメニューになるので、そのサブメニューにあらたなコマンドを登録します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub sample10() Call sample3 With CommandBars("Cell").Controls.Add(before:=1, Type:=msoControlPopup) .Caption = "Macro1" With .Controls.Add .Caption = "Command1" .OnAction = "myMacro1" End With With .Controls.Add .Caption = "Command2" .OnAction = "myMacro2" End With End With End Sub |
11.実行されたコマンドを判定する
CommandBars(“Cell”).Controls.Add
CommandBars.ActionControl.Caption
プロシージャ側で、実行されたコマンドを取得するには、CommandBarsコレクションのActionControlプロパティを使います。ActionControlプロパティには、実行されたコマンドが格納されるので、Captionプロパティを調べればコマンドの文字列が分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub sample11() With CommandBars("Cell").Controls.Add(before:=1, Type:=msoControlPopup) .Caption = "Macro1" With .Controls.Add .Caption = "Command1" .OnAction = "myMacro" End With With .Controls.Add .Caption = "Command2" .OnAction = "myMacro" End With End With End Sub Sub myMacro() MsgBox CommandBars.ActionControl.Caption End Sub |
12.コマンドを表示・非表示にする
CommandBars(“Cell”).Controls.Visible
コマンドの表示・非表示を切り替えるには、VisibleプロパティにTrueまたはFalseを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Sub sample12() Call sample3 With CommandBars("Cell").Controls.Add(before:=1, Type:=msoControlPopup) .Caption = "Macro1" With .Controls.Add .Caption = "Command1" .OnAction = "myMacro2" End With With .Controls.Add .Caption = "Command2" .OnAction = "myMacro2" End With End With End Sub Sub myMacro2() With CommandBars("Cell").Controls("Macro1") Select Case CommandBars.ActionControl.Caption Case "Command1" .Controls("Command1").Visible = False .Controls("Command2").Visible = True Case "Command2" .Controls("Command1").Visible = True .Controls("Command2").Visible = False End Select End With End Sub |
13.状況に応じて変化するメニューを設定する
CommandBars(“Cell”).Controls.Add
object.OnAction
サブメニューはクリックしたりマウスポインタを合わせた時、下位のメニューが表示されます。このとき、サブメニューのOnActionプロパティに設定したプロシージャが実行されます。それを応用すれば、状況に合わせて自動的にメニューの内容を変更できます。サンプルではサブメニューのCommand1とCommand2にアクティブセルのアドレスや行番号を表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub sample13() Call sample3 With CommandBars("Cell").Controls.Add(before:=1, Type:=msoControlPopup) .Caption = "Macro1" .OnAction = "ChangeMenu" With .Controls.Add .Caption = "Command1" .OnAction = "myMacro" End With With .Controls.Add .Caption = "Command2" .OnAction = "myMacro" End With End With End Sub Sub ChangeMenu() With CommandBars("Cell").Controls("Macro1") .Controls(1).Caption = ActiveCell.Address(False, False) & "を削除する" .Controls(2).Caption = ActiveCell.Row & "行目を削除する" End With End Sub |
14.安全にコマンドを削除する
CommandBars(“Cell”).Controls.Add
object.Tag object.Delete
メニューは共有スペースです。自分で登録したコマンドを削除するときは、自分で登録したコマンドだけを確実に削除するようにしてください。くれぐれも安易にリセットしてはいけません。コマンド名だけでは、それが本当に自分でマクロを登録したか判断できないときは、登録するときにあらかじめTagプロパティに印をつけておきます。削除するときは、そのTagプロパティを確認してから削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub sample14() Call sample3 With CommandBars("Cell").Controls.Add(Before:=1) .Caption = "Macro1" .Tag = ThisWorkbook.Name End With End Sub Sub sample14_2() Dim c As CommandBarControl For Each c In CommandBars("Cell").Controls If c.Tag = ThisWorkbook.Name Then c.Delete End If Next c End Sub |
コメントを残す