Access2000VBA・Excel2000VBA独学~右クリックメニュー(="Cell" =セルを右クリックした場合の右クリックメニュー)に、オリジナルのメニューを追加する方法~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
★ 関連記事
以下の記事は、COMオートメーションとすごく関連が深いので、COMオートメーションがしたいときは必ずご自分でもチェック・テスト等々をしてみてください。
~用語:Setと「New」キーワードのことについて。「New」って何?~(「Add」についても書いてあります。)
★ はじめに
すべての右クリックメニューでやれるわけではないっぽいです。
Column(列番号の右クリック)
List Range Layout Popup(テーブル機能のテーブル内?)
Cell(セルの右クリック)
Row(行番号の右クリック)
など、限られた右クリックメニューへのみ、自作のメニュー追加ができるもようです。
(※もしかしたら、何らかの技を使うとすべての右クリックメニューが特定できるのかもしれませんが・・)
★ 右クリックメニューがどれかを探すには?
以下のコードを実行してみて、出てきた名前(Nameプロパティの値)が、同じものが2つあるやつ、が、右クリックメニューがあるっぽいです。
インデックス番号が異なるので、どちらかが右クリックメニューです。
名前で指定してあげれば、自動的に勝手に右クリックメニューが取得(≒選択)できるっぽい感じでもあります。
ただ、ヘルプには「ユーザー設定のメニューまたはサブメニューのうち、名前の同じものがいくつかある場合、CommandBars(index) は先頭のものを取得します。」とありました。
たまたま右クリックメニューが先に位置していただけかも?
なので、もし名前での指定で右クリックメニューが取得できなかったら、インデックス番号で指定(取得≒選択)してあげればOKだと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
' ' Sub CmdBar_Search01() Dim bb As CommandBar 'bbにしたのは特に意味はありません。 'さっと調べたかっただけなので短くしたかっただけです。 For Each bb In Application.CommandBars Debug.Print bb.Index & "---" & bb.Name & "---" & bb.Type Next bb End Sub ' ' |
実行すると、以下のようなものがあります。
Column(列番号の右クリック)
Annotation Pens
Diagram
Drawing and Writing Pens
List Range Layout Popup(テーブル機能のテーブル内?)
Cell(セルの右クリック)
Row(行番号の右クリック)
Chart
Layout
★ サンプルVBAの内容
(01)個人用マクロブックにあらかじめ書いておくプログラム(プロシージャ)
1 2 3 4 5 6 7 8 9 |
' ' '個人用マクロブック(Personal.xlsまたはPersonal.xlsb)に書くプロシージャ Sub TestProc200() MsgBox "いいいいいいいいいいいいいいいいいいいいいいいいいいいい" End Sub ' ' |
(02)実際にメニュー追加するプログラム
ポイント:オブジェクトを取得(=特定≒選択)するのには、
・「オブジェクトを取得するプロパティ名(インデックス番号)」
・「オブジェクトを取得するプロパティ名(”名前”)」
とやるだけではなく、
・「オブジェクトを取得するプロパティ名("キャプション")」
も使える場合がある・・・ということです。
なので、特に『Nameプロパティをもともと保持・内包していないオブジェクト』を取得したい場合(=特定したい場合)は、
「オブジェクトを取得するプロパティ名(”名前”)」が通用しないので、
「オブジェクトを取得するプロパティ名("キャプション")」を試してみるのもいい、
ということになります。
このような『意外とできちゃった!的な』、『ある意味例外的なオブジェクトの取得方法』は、ほかにも色んなケースがあるかもしれないので、『なんとなく似ているのものを使ってみる・ダメもとで試す』ということは必要なのかもしれません。
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
' ' Option Explicit '###################################################################### '右クリックメニュー(="Cell")に、オリジナルのメニューを追加する '###################################################################### Sub OrgMenuAdd() Dim NewMenu01 As CommandBarButton '空の新しいメニューを作成 Set NewMenu01 = Application.CommandBars("Cell").Controls.Add() 'セルに対しての右クリックメニューン場合は、("Cell") と書きます。他のものは他の書き方になります。 '空のメニューに対して各種設定をします。 NewMenu01.Caption = "テストメニュー" 'メニューの文言は「テストメニュー」にする。 NewMenu01.OnAction = "TestProc01" '「TestProc01()」プロシージャを呼び出すようにする。「TestProc01()」は標準モジュールのプロシージャ名 NewMenu01.BeginGroup = False 'どこかのグループには含めず、一番下に表示??(まだちゃんを分かっていません。すみません。) End Sub '###################################################################### '追加したテストメニューから呼び出されるプロシージャ '###################################################################### Sub TestProc01() MsgBox "あああああああああ" End Sub '###################################################################### 'テストメニューのインデックス番号を調べたいので、 'For Eachでキャプション(表示文言)と番号を調査 '###################################################################### Sub OrgCommandCtl_ItemNumber_Search01() Dim bb As CommandBarControl 'bbにしたのは特に意味はありません。 'さっと調べたかっただけなので短くしたかっただけです。 For Each bb In Application.CommandBars("Cell").Controls Debug.Print bb.Index & "---" & bb.Caption Next bb End Sub '###################################################################### '調べたインデックス番号で、追加したメニューを削除 '###################################################################### Sub OrgCommandCtl_Del() Dim MigiMenuCtls_01 As CommandBarControls Set MigiMenuCtls_01 = Application.CommandBars("Cell").Controls MigiMenuCtls_01.Item(27).Delete ' MigiMenuCtls_01.Item("テストメニュー").Delete ' MigiMenuCtls_01("テストメニュー").Delete '削除は↑この書き方でも可。 'メニューの特定・指定は、インデックス番号のほかに、キャプションでもできるようです。 'インデックス番号だと、並び順を変えた場合に、 'もろともで インデックス番号も変わってしまうため、 '独自メニューの指定がめんどくさくなるので、 'キャプションで指定してしまうほうがラクちんっぽいです。 End Sub '###################################################################### '「セル」に対しての右クリックメニューのリセット(初期状態に戻す) '###################################################################### Sub CellMigiClickMenuReset() Application.CommandBars("Cell").Reset End Sub '###################################################################### '調べたインデックス番号で、追加したテストメニューの '「OnAction(=呼び出すプロシージャ)」の内容と、並び順を変更 '###################################################################### Sub OrgCommandCtl_OnAction_Add() Dim MigiMenuCtls_01 As CommandBarControls 'CommandBarControlsコレクションを格納するためのオブジェクト変数を定義。 Set MigiMenuCtls_01 = Application.CommandBars("Cell").Controls MigiMenuCtls_01.Item(27).OnAction = "Personal.xls!TestProc200" '個人用マクロブックの「TestProc200」プロシージャが呼び出されるように差し替え '↑拡張子は「xls」じゃなかったら、「xlsb」に変更してください。 MigiMenuCtls_01.Item(27).Move Before:=1 '↑並び順の変更。独自メニューの並び順の位置を一番上にもってくる。 '(3番目にもってきたいなら、一番下などにあるときに Before:=3 と書きます。 ' その時点で上から3番目にあるメニューの上に挿入されます。) 'MigiMenuCtls_01.Item(27).Move Before:=1 を・・・・、 '「MigiMenuCtls_01(27).Move Before:=1」とか、 '「MigiMenuCtls_01.Item("テストメニュー").Move Before:=1」 '「MigiMenuCtls_01("テストメニュー").Move Before:=1」と書いても可、です。 '基本、「Item」は各コレクションオブジェクトの既定のプロパティ(必ず内包 'しているプロパティ?)のため、そのため、省略することもできるので、 'もしそうしたい場合は、「MigiMenuCtls_01("テストメニュー")・・・・」と '書くこともできます。 ' '基本、メニューの特定・指定は、インデックス番号のほかに、 'キャプションでもできるようです。 'メニューの並び順を変えた場合には、 'もろともでインデックス番号も変わってしまうため、 'もし何度もメニューの並び順を変えたい場合は、インデックス番号ではなくて 'キャプションで指定してしまうほうがラクちんっぽいです。 End Sub ' ' |