2012年8月23日木曜日

Word,Excelのコンテキストメニューを初期化する

【まえがき】

  • VBAでWordのコンテキストメニューを操作していたら、うっかりコンテキストメニューにゴミ(不要なメニュー)を大量生成してしまった。
  • WordやExcelのアドインを色々試していたら、アドインをアンインストールしたのに、種々のコンテキストメニューに必要のないメニュー(ゴミ)が残った
ゲンナリする状況を示す図 (一例)

などなど、WordまたはExcelのコンテキストメニュー周りでゲンナリするような気分を味わったときには、『コンテキストメニューなんてなかった』と開き直り、『この件は水に流そう(綺麗さっぱり初期化しよう)』と思うのが人の常だと思うのです。というわけで、Word, ExcelのコンテキストメニューをVBAで初期化するコードを書いてみました。

【先に結論を書いておく】
検索してみると、Microsoftのサポートサイトに
という、まさに今回の問題解決にぴったりのページがありました(機械語訳のページなので、日本語がおかしい気がしますが…)。解決策を簡単にまとめると、
  • VBAコードを書かない方法
    • 「ユーザー設定」 を開いて、『リセット』ボタンを選択
      • ※ この方法は、Office2003以前のみ可能なように思います。自分の曖昧な記憶に基づけば、2007以降では下記のVBAのコードを書く方法を使う必要があるのではないかと思います。(手元ではOffice2003, 2013Previewでのみ確認)
  • VBAコードを書く方法
    • Excelの場合: 
      • Application.CommandBars("Worksheet Menu Bar").Reset
    • Wordなどの Excel以外のOfficeソフトの場合:
      • Application.CommandBars("Menu Bar").Reset
ボタン1つ、もしくは、コードを書く場合でも一行で完結、とめっちゃ簡単でした(*)。

にも関わらず、以下ではVBAでわざわざコードを書いています(コードを書き終わってから検索したためです)。『また、つまらぬコードを書いてしまった』感がハンパないです。あらかじめご了承ください。

(*) この方法、必要であればVBEのイミディエイトウィンドウで実行できるので、ほんとお手軽です。

【対処法】
コンテキストメニューの実態であるCommandBarオブジェクトには、(アドインなどによりボタンを追加・削除するなどの変更が加わった状態から)初期状態に戻すためのReset()メソッド が用意されています。
というわけで、片っ端からCommandBarのReset()を実行するコードを書いてみました。なお、今回コードを書くにあたり、MSDNのコマンドバーに関する解説ページ(*1)を参考にしました。MSDNに開示されているコードは全体的にすっきりしていたので、お手本にするにはちょうど良いなと感じました。

上記コードの補足説明を加えると、CommandBar.Resetメソッドは、 MSDN(*2)に記載されているように、Officeにデフォルトで組み込まれている(BuiltInプロパティが True の) CommandBarでしか利用できないため、ループ内でBuiltInプロパティをチェックしています。

(*1) VBA コードでコマンド バーとコマンド バー コントロールを操作する
   Programming Microsoft Office Command Bars

(*2) CommandBar.Reset メソッド

【蛇足】
上記コードに限れば、全てのCommandBarについてResetメソッドを呼び出しているだけなので、On Error Resume Next でエラーを握りつぶすのもありかなと思ったりします。エラーを握りつぶすのは個人的には好きくないのですが…、こちらの方が「水に流す」感がアリアリと感じられて、蒸し暑い夏の夜にはちょうど良いかなと思ったりします。

-