前回の記事「【コード】括弧内の言葉をマーキングして読みやすくするWordマクロ(その2)」の応用版です。検索対象を丸括弧にしておりましたが、ここにダブルクオーテーションにも対応するように変更してみます。
<目次>
このマクロでできること
半角と全角の丸括弧だけではなく、半角のダブルクオーテーションで囲まれた文字列も対象にしてみます。
実行前
実行後
マクロ1の解説
まずは、惜しい!マクロから解説します。
実は、今回のマクロは検索対象にダブルクオーテーションを加えるだけではうまくいきません。まずは、ダブルクオーテーションを検索できるようにしたときにどのように失敗するのか試してみます。
ダブルクオーテーションを検索対象に入れる場合には、8行目の検索対象の文字列に " を追加するのではなく、"" と2つ重ねて追加します。
.Text = "[((""]*[""))]" '検索する文字列
これでダブルクオーテーションで囲まれた箇所も検索できるようになりました。
さて、今回の検索条件でマクロを実行すると実行結果として以下のようになります。
実行後
ちょっと惜しくないですか?ダブルクオーテーションに囲まれた半角スペースも着色されてしまっています。
これは、どうして起こるのでしょうか?
実は、最初のThis is a pen.の着色後に、検索開始位置が、pen. のピリオドの直後になっているのです。以下の赤い棒の個所です。
"This is a pen.|"
なので、ここからまたダブルクオーテーションを探し始めるからこの半角スペースを囲んだダブルクオーテーションがヒットするわけです。
マクロ1
Sub 括弧内の文字の背景を灰色25パーセント3() Dim myRange As Range Set myRange = ActiveDocument.Range(0, 0) With myRange.Find .Text = "[((""]*[""))]" '検索する文字列 .Forward = True .Wrap = wdFindStop .MatchWildcards = True 'ワイルドカードを使用する Do While .Execute = True '見つかったら背景を灰色25パーセント With myRange .Start = .Start + 1 .End = .End - 1 .Font.Shading.BackgroundPatternColor = wdColorGray25 .Collapse wdCollapseEnd End With Loop End With Set myRange = Nothing End Sub
マクロ2の解説
では、次に正しく修正する方法です。
18行目に1行追加します。検索開始位置をダブルクオーテーションの後にするために、末尾を1文字分進めるのです。
これで大丈夫です。めでたしめでたし。
マクロ2
Sub 括弧内の文字の背景を灰色25パーセント4() Dim myRange As Range Set myRange = ActiveDocument.Range(0, 0) With myRange.Find .Text = "[((""]*[""))]" '検索する文字列 .Forward = True .Wrap = wdFindStop .MatchWildcards = True 'ワイルドカードを使用する Do While .Execute = True '見つかったら背景を灰色25パーセント With myRange .Start = .Start + 1 .End = .End - 1 .Font.Shading.BackgroundPatternColor = wdColorGray25 .End = .End + 1 .Collapse wdCollapseEnd End With Loop End With Set myRange = Nothing End Sub
注意点
今回の検索はかなり簡易なサンプルです。実務ではもっと厳密にした方がいいかもしれません。対象とする文書の書き方により工夫してみてください。
上記の例では「正しく括弧が閉じられている」という前提になっています。括弧が入れ子状になっていないという前提で書いています。気を付けてくださいね。
たとえば、「((((あああ))))」となっている場合にどのように着色されるのか試してみてください
さらに、「(彼が"こんにちは!"と言いました)」となってる場合も誤着色されてしまいます。丸括弧とダブルクオーテーションは別の検索にしたほうがいいのかもしれませんね。