【Word VBA】選択されている文字列を文書内で検索する

2011年4月26日

Wordの「検索と置換」ダイアログを使っていると、ふと疑問に思うことがあります。

たとえば、文字列を選択した状態で、[Ctrl] + [F] を押すと、選択されている文字列が「検索と置換」ダイアログの検索する文字列の欄に自動で記入される場合とそうでない場合とがあります。

こういうことです。

以下、ニュース記事の引用です。

選択例

上記の場合に[Ctrl] + [F] を押して「検索と置換」ダイアログを開くと、以下のように、検索する文字列の欄に「フォード」と入力されます。

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

しかし、別の事例を試してみましょう。

選択例2

上記のように、フォード・モーターを選択した状態で、[Ctrl] + [F] を押しても、「検索と置換」ダイアログの検索する文字列の欄には、新たに文字が入力されず、前回の検索文字列である「フォード」が残ったままです。

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

どうやら何かのルールがあって、それに沿うものと沿わないものとで、自動入力を区別しているんですね。

正直、そのルールが何なのかよくわかりません(笑)。(注:後日、「【Word】[検索する文字列]欄に自動入力する場合としない場合の差」にルールをまとめました)

というわけで、今回は、そういったルールにかかわらず、選択中の文字列(複数段落を選択してもよい!!)を、検索する文字列として検索してくれるマクロを紹介します。

このマクロでできること

文字列を選択した状態でマクロを実行すると、その文書中でその文字列を「あいまい検索」の設定にて検索します。

選択範囲以降に、同じ文字があれば、カーソルがその位置までジャンプします。

同じ文字列がない場合には、カーソルは移動しません。

なお、このマクロでは、「検索と置換」ダイアログは表示されません。

次も同じ検索をする場合には、マクロを再度実行するか、[Ctrl] + [PageUp] または[Ctrl] + [PageDown] を用いると便利ですね。

このマクロをキーボードやツールバーのボタンに登録をすれば、便利に使えますね。
(関連記事の、マクロコードの登録方法ツールバーのボタン登録 をご覧ください。)

マクロの解説

基本的な構造は、マクロの記録機能で記録した「あいまい検索(日)」を実行したときのコードです。

少し工夫したのが5行目~9行目の部分ですね。

Word文書中で選択されている文字列を、「検索する文字列」に設定するための仕掛け(条件分岐)です。

If Selection.Start = Selection.End Then

この文章によって、現在文字が選択されているかどうかを確認しています。

注(16-07-14追記)
上記の文字列が選択されているか否かの判定には、Typeプロパティを使えます。

If Selection.Type = wdSelectionIP Then

としてもいいですね。

Selection.Start は、選択範囲の先頭の位置を示し、Selection.End は、選択範囲の末尾の位置を示します。

よって、文字が選択されていない場合には、上記条件の判定は「はい(Yes)」になります(詳細は、「【1行マクロ】文書中で文字列を選択しているかどうか調べる 」をご覧ください)。

この場合には、「検索する文字列」で用いるmyTextは空欄になります。

myText = ""

ですね。

それ以外の場合(文字が選択されている場合)には、選択されている文字をmyTextに代入します。

myText = Selection.Text

ですね。

マクロ


Sub Search_Text()

Dim myText As String   ' 選択されている文字列

If Selection.Start = Selection.End Then
  myText = ""
Else
  myText = Selection.Text
End If

'あいまい検索を実施
  Selection.Find.ClearFormatting
  Selection.Find.Replacement.ClearFormatting
  With Selection.Find
    .Text = myText
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = False
    .MatchFuzzy = True
  End With
  Selection.Find.Execute

End Sub

 

-コード
-,