【Word VBA】「検索と置換」ダイアログボックスを表示させる(けっこう重要)

2011年8月29日

これは、きぬあささん から教えていただいたコードを少し詳しく解説するコーナーです。

通常、Word VBAで「検索と置換」ダイアログボックスを表示させようと思うと、組み込みのダイアログボックスを表示させる方法を思い浮かべます。

ところが、組み込みのダイアログボックスを用いなくてもダイアログボックスを表示させる方法があったのですね。しかも、もっと使いやすい方法で!!

コマンドバー(CommandBar)のIDを使って指定します。

特に、なぜか理由はわかりませんが、「検索と置換」ダイアログボックスについては、組み込みのダイアログボックスが非常に使いにくいので、このコマンドバーIDを使って指定する方法がいいですね。

(後日追記)以下の記事で具体的なコードを紹介しています。

 

 

コードの比較

以下、「検索と置換」ダイアログボックスで、置換のタブを表示するコードです。

(1)組み込みのダイアログボックスのコード

Dialogs(wdDialogEditReplace).Show

(2)CommandBar IDを用いたコード

CommandBars.FindControl(ID:=313).Execute

何が違うのか?

(1)のコードで実行した場合のデメリットを書くことになるのですが、そういう観点からの比較です。

・タブをクリックできない!?

(1)の方法だと、「検索」と「ジャンプ」のタブをクリックして選択することができません。

(1)組み込みのダイアログボックスのコードの場合の表示

Dialogs(wdDialogEditReplace).Show

[検索と置換]ダイアログボックス1

(2)CommandBar IDを用いたコードの場合の表示

CommandBars.FindControl(ID:=313).Execute

[検索と置換]ダイアログボックス2

・押せないはずのボタンが押せる!?

(1)の方法だと、通常では押せないはずのボタンが押せる状態になってしまいます。

通常では、文字列が入力されていない場合には、「検索と置換」ダイアログボックスのボタンはクリックできないのに。。。

ということで、ついうっかり押してしまうと、エラーになるんですね。まるでトラップです。だまされてはいけません。

よって、使うときには、エラー処理を施す必要がでてくるわけです。

(1)組み込みのダイアログボックスのコードの場合の表示

Dialogs(wdDialogEditReplace).Show

[検索と置換]ダイアログボックス3

(2)CommandBar IDを用いたコードの場合の表示

CommandBars.FindControl(ID:=313).Execute

[検索と置換]ダイアログボックス4

・検索条件が見えない!?

実は、上の2つの画像でもわかるのですが、同じ検索条件に設定されているのに、組み込みのダイアログボックスを使うと、検索条件が表示されません。

以下のようにオプションボタンをクリックするとわかります。

実は、「あいまい検索」の設定なんですよ。なのに、表示されていませんね。

(1)組み込みのダイアログボックスのコードの場合の表示

Dialogs(wdDialogEditReplace).Show

[検索と置換]ダイアログボックス5

まとめ

これからは、「検索と置換」に関しては、CommandBar IDで指定する方法がよいですね。

他のコマンドでもこのようなことがあるかもしれませんのでご注意を。

非常に有益な情報のシェアをどうもありがとうございました。

それにしても、きぬあささんのサイトは、宝の山ですね。

このCommandBar IDを公開されていることは存じておりましたが、今回、その利用価値を理解いたしました。非常にありがたい情報のご提供でした。

コメント

  • 6. Re:Re:Re:Re:Re:ダイアログボックスを消してしまいました

    >しょーさん

    お試しいただきありがとうございました!

    確認いたしました。おっしゃるとおり、マクロで表示させた[検索と置換]ダイアログボックスでも大丈夫でしたね。
    先日実験をしていたときには、何か操作を間違えてしまったかもしれません。
    ご希望のことができてよかったです。

  • 5. Re:Re:Re:Re:ダイアログボックスを消してしまいました

    >新田順也☆ワードプログラマーさん

    遅くなりましたが返答ありがとうございました。

    下記のようなモジュールでFindの設定を変えたものを複数作り、連続で実行してみたところ、希望していた通りFindの設定を反映した状態でダイアログボックスが表示されました。

    Dialogs(wdDialogEditReplace).Parent.Activate
    Findの設定
    CommandBars.FindControl(ID:=313).Execute

    マクロで開いたものは閉じれないとのことでしたがうまく閉じてくれました。
    Windows7、Word2013を使用していますが環境によってことなるのでしょうか?

    とにかく、これでわずらわしさが解消されました。ありがとうございました。

    しょー返信する
  • 4. Re:Re:Re:ダイアログボックスを消してしまいました
    >しょーさん
    さっそくお試しいただきありがとうございます。モジュールのエクスポート、インポートを行えば、複数のマクロをいっきに移動できていいですね。
    > 別件になりますが、ダイアログボックスを閉じるメソッドはないのでしょうか?
    探してみましたがわかりませんでした。
    理由はわかりませんが、Ctrl + H で開いた通常の[検索と置換]ダイアログボックスの場合、以下のコードを走らせると閉じます。
    Dialogs(wdDialogEditReplace).Parent.Activate
    マクロで開いた[検索と置換]ダイアログボックスの場合には、上記の別のマクロを実行できません。[検索と置換]ダイアログボックスが開かれている状態はダイアログを開くマクロの実行中となってしまうためです。
    > 検索と置換ダイアログボックスを開いた状態で、find.textなどの設定をしても、一度ダイアログボックスを閉じないと反映されないため、これを解決したいと思っています。
    おっしゃるとおり、[検索と置換]ダイアログボックスを開いたままでは設定変更ができずエラーになってしまいます。なので、[検索と置換]ダイアログボックスは用事がすんだら閉じるようにしています。私もかつて他の方法を探しましたが見つかりませんでした。
    本件については方からも要望をいただいたことがありますので、ニーズがあることは存じているのですが、、、。
  • 3. Re:Re:ダイアログボックスを消してしまいました

    >新田順也☆ワードプログラマーさん

    Normalの初期化は最終手段と思っていましたが、やはりそうするしかなかったんですね。
    モジュールのエクスポート、インポートが少し煩わしいだけでしっかりと修復できました。

    別件になりますが、ダイアログボックスを閉じるメソッドはないのでしょうか?
    Close Hidden Hide などを試してみましたがエラーで不可能でした。

    検索と置換ダイアログボックスを開いた状態で、find.textなどの設定をしても、一度ダイアログボックスを閉じないと反映されないため、これを解決したいと思っています。
    再設定できれば他の方法でも問題ありません。

    ご存じでしたら教えていただきたいです。
    よろしくお願いします。

    しょー返信する
  • 2. Re:ダイアログボックスを消してしまいました
    >しょーさん
    2つ方法があります。
    【1】Normal.dotmを削除する
    この場合、マクロやショートカットキーが登録されている場合に全て消えてしまいます。ご注意ください。
    以下の記事の方法でNormal.dotmの保存先のフォルダを開きます。
    http://ameblo.jp/gidgeerock/entry-10972818823.html
    Wordを終了させてNormal.dotmを削除します。
    念のため、Normal.dotmをコピーして名前を変えたもの(例:Normal_20160125.dotm)をバックアップとしておけば、より安心です。
    ちなみに、バックアップ用のNormal_20160125.dotm をStartupフォルダに入れれば、今まで登録したマクロもショートカットキーも利用できます。
    【2】マクロを実行する
    以下のマクロを実行すると、Wordの全てのツールバーが初期化されます。少し雑なマクロですが元に戻ります。
    私のアドインのツールバーのボタンは初期化はできません。このような場合にはエラーになってしまうので、エラー回避のために「On Error Resume Next」を入れました。
    他の方が作ったアドインがインストールされている場合にどのような挙動になるのか検証できておりませんのでご注意ください。
    Sub コマンドバーを初期化する()
    Dim myCB As CommandBar
    On Error Resume Next
    For Each myCB In CommandBars
    myCB.Reset
    Next
    End Sub
  • 1. ダイアログボックスを消してしまいました

    こちらの内容を拝見し、効率良く作業できるようになりました。とても役に立ちありがたいです。

    しかし、ダイアログボックスを閉じたいと思い、
    CommandBars.FindControl(ID:=313).Delete
    を実行してしまい、
    CommandBars.FindControl(ID:=313).Execute
    でエラーが出るようになってしまいました。

    Officeの修復を行いましたが解決しませんでした。
    Delete前の状態に戻すことは可能かご存知でしょうか?
    よろしくお願い致します。

    しょー

-コード
-,