みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Word VBAでいろいろな検索や置換をする方法についてシリーズでお伝えしています。
前回の記事はコチラでした。
カーソル位置から先の範囲について連続して検索する方法についてお伝えしました。
前回は検索にヒットした文字列について蛍光ペンでハイライトをしたり、Fontオブジェクトで文字書式を変更したりしたのですが、今回変更するのは文字そのもの、つまり「置換」をしていきます。
Word VBAで置換をする方法はいくつかありますので、それぞれ紹介していきますね。
Executeメソッドの引数ReplaceとReplaceWith、Replacementオブジェクトなど、ポイントとなる情報が盛りだくさんでお送りします。
では、行ってみましょう!
検索結果のTextプロパティを変更する方法
まずは、前回紹介した以下プロシージャをベースした方法です。
おさらいを兼ねて紹介します。
Sub findText()
With Selection.Find
.Text = "Word"
Do While .Execute
Selection.Font.Underline = True
Loop
End With
End Sub
カーソル位置以降の「Word」という文字列に下線を引くというものです。
Do While文の中の処理を「テキストを変更する」という内容に変更していけばよさそうですね。
まず、Selectionオブジェクトの文字範囲であるRangeオブジェクトを取得して
文字範囲のテキストを表すTextプロパティの値を変更するという段取りです。
つまりプロシージャとしては
Sub replaceText()
With Selection.Find
.Text = "Word"
Do While .Execute
Selection.Range.Text = "ワード"
Loop
End With
End Sub
となります。
Selection.Textではダメな理由
実は、Word VBAはSelectionオブジェクトからRangeオブジェクトを取り出さなくても、直接Textプロパティを操作することができます。
ですから、このようなプロシージャも思いつくのです。
Sub replaceText()
With Selection.Find
.Text = "Word"
Do While .Execute
Selection.Text = "ワード"
Loop
End With
End Sub
ただ、このプロシージャですと、カーソル位置の直後でヒットした文字列だけ置換して終了します。というのも、実行してみればわかるのですが
置換した文字列が選択範囲になります。次のExecuteメソッドの実行はこの選択範囲内に対しての検索になってしまうので、マッチする文字列がなくFlaseになるため、Do While文の繰り返しから抜けてしまうのです。
ですから、Textプロパティの値の変更を行ってもSelectionが「範囲にならないよう」にする必要があるのです。
RangeオブジェクトのTextプロパティに対して値変更をした場合には、置換後の文字列は選択範囲にならず、文字列の先頭にカーソルが配置されます。
ですから、次回のExecuteメソッドの検索範囲は文書のカーソル以降となります。
「全て置換」をする方法
Executeメソッドの引数Replaceを指定する
カーソル以降の全ての文字列を置換する方法はもう一つあります。
Executeメソッドの名前付き引数Replaceを指定する方法です。
Replaceには置換の実行方法について表すWdReplace定数を指定します。
定数 | 置換の方法 |
---|---|
wdReplaceNone | 置換しない(既定値) |
wdReplaceOne | 1つだけ置換 |
wdReplaceAll | 全て置換 |
つまり、引数ReplaceにwdReplaceAllを指定すれば、全て置換ができるというわけです。
Executeメソッドの引数ReplaceWithを使う
ただ、置換をするのであれば、どの文字列に変更をするのかを指定しなければいけません。
その指定の方法もいくつかありまして、一つ目はExecuteメソッドの名前付き引数ReplaceWithを使う方法です。
これらを活用すると以下のようなプロシージャとなります。
Sub replaceText()
With Selection.Find
.Text = "Word"
.Execute Replace:=wdReplaceAll, replacewith:="ワード"
End With
End Sub
かなりシンプルに記述できますね。
Replacementオブジェクトを使う方法
もう一つの方法が、Replacementオブジェクトを使う方法です。
ReplacementオブジェクトはFindオブジェクトの配下にある置換条件を設定するためのオブジェクトです。
ReplacementオブジェクトのTextプロパティで置換後の文字列を指定することができます。
また、Replacementオブジェクトは配下にFontオブジェクトを持ちますので、置換と同時に文字書式の変更を施すことも可能です。
実際にプログラム内で使う場合は以下のように記述をすればOKです。
Sub replaceText()
With Selection.Find
.Text = "Word"
With .Replacement
.Text = "ワード"
.Font.Size = 24
.Font.Underline = True
End With
.Execute Replace:=wdReplaceAll
End With
End Sub
このプロシージャを実行すると、以下のように置換されます。
すっかりダサい文書になりました。
まとめ
Word VBAで文字列の置換をするいくつかの方法についてお伝えしました。
どれを使うか迷ってしまいそうですが、以下のような使い分けが良いでしょう。
- 単純に文字列の置換だけを行うのであれば、Executeメソッドの引数ReplaceをwdReplaceAllにしつつ、引数ReplaceWithに置換後の文字列を設定
- 置換後の文字列に文字書式の設定もしたいのであれば、Replacementオブジェクトを設定しつつ、Executeメソッドの引数ReplaceをwdReplaceAllに設定
- 文字列の置換、文字書式の設定以外に何かしらかの処理を施したいのであれば、Do While~Loop文
次回は、検索条件に目を向けて、いろいろな条件設定の仕方についてお伝えしますね。
どうぞお楽しみに!