素人がExcelVBAによる「一人働き方改革」に挑むブログスマートフォン用の表示で見る素人がExcelVBAによる「一人働き方改革」に挑むブログExcelVBAネタです。2018-01-01自作右クリックメニューが逃げる・・・?ユーザーフォームコンテキストメニューが逃げる「ユーザーフォーム上のテキストボックスで右クリックメニューが使えない」問題ユーザーフォームに設置したテキストボックス(いや、テキストボックスに限りませんけど)にテキスト入力しているときに右クリックが効かない、というのはわりかし有名なんじゃないかと思う。普通に考えたら、これは不便な話。ショートカットキーは生きているから、クリップボードの内容をペーストしたけりゃ[Ctrl]+[V]でおkなんだけれど、普段とことん慣れ親しんだ動作だけに、やはり右クリックメニューは出てきてほしい。ならないものなのか、とggっていて発見したのがコチラおよびコチラ。参考にさせていただいた。呼び出される処理を標準モジュールに準備しておく。フォームのインスタンス化時にCommandBarオブジェクトを追加する。テキストボックスのMouseDownイベントでCommandBarオブジェクトのShowPopupメソッドを実行してCommandBarオブジェクト(右クリックメニュー)を表示する。やってみたまずは、標準モジュールに次のコードを書いて、テキスト編集用の処理を準備する。Sub何のことはない。Application.SendKeysメソッドを用いて、おなじみのショートカットキー押下を再現しているだけ。お次はフォームモジュール。CommandBarでは、フォームモジュールの宣言セクションでCommandBar型のオブジェクト変数contextMenuを宣言している。フォームモジュール内の複数のプロシージャ(「UserForm_Initialize」と、後述の「TextBoxMain_MouseDown」)から参照される変数なので、モジュールレベル変数とした。Temporary:=True)では、Application.CommandBarsコレクションのAddメソッドを用いて、CommandBarオブジェクトを新しく生成して変数contextMenuにぶち込んでいる。バーの位置または種類を指定します。いうことで、msoBarPopupを指定しているので、たぶん「その場でポップアップする」ぐらいの意味なんだろう(適当)。あと、もう一つ指定した引数Temporaryってのは、コチラに使用が終わったとき自動的に破棄されるよう引数TemporaryにTrueを指定しておきましょう。あるので、そういう意味なんだろう(適当)。Withでは、contextMenuオブジェクトの配下にControlオブジェクトを追加する処理。ControlsコレクションのAddメソッドの引数Captionには表示される文字列、OnActionに実行されるプロシージャ名、FaceIdで表示されるアイコンを指定しているっぽい(適当)。「切り取り」、「コピー」、「貼り付け」は同じように記述している。TrueでBeginGroupプロパティをTrueにしている。このControlオブジェクトは新しいグループに設定せよ、ということなんだろう(適当)。あとは、テキストボックスのMouseDownイベントの設定。contextMenu.ShowPopupイベント発生時に受け取った引数Buttonの中身が「2」だったら、右クリックされたということになるので、CommandBarオブジェクトのShowPopupメソッドを実行する、ということだ。「2」と指定する代わりにxlSecondaryButtonを指定しているが、たぶんこれでいいと思う(適当)。「XlMouseButton」のメンバだし。なんと、右クリックメニューが逃げたんです。無事に「貼り付け」は実行される。これ、他の3つ(「切り取り」、「コピー」、「全て選択」)のどれをやっても同じ挙動になる。何でなんだ???まあ、たぶん、どうせしょうもない原因なんでしょうけれど......。»プロフィールid:akashi_keirinExcelVBAネタです。SyntaxHighlighter.all();注目記事はてなブログをはじめよう!akashi_keirinさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。