前回の記事「【コード】括弧内の言葉をマーキングして読みやすくする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
注意点
今回の検索はかなり簡易なサンプルです。実務ではもっと厳密にした方がいいかもしれません。対象とする文書の書き方により工夫してみてください。
上記の例では「正しく括弧が閉じられている」という前提になっています。括弧が入れ子状になっていないという前提で書いています。気を付けてくださいね。
たとえば、「((((あああ))))」となっている場合にどのように着色されるのか試してみてください
さらに、「(彼が”こんにちは!”と言いました)」となってる場合も誤着色されてしまいます。丸括弧とダブルクオーテーションは別の検索にしたほうがいいのかもしれませんね。
コメント
先日このマクロのやり方の教えていただいた者です。マクロ2を設定してみたのですが、ダブルクオーテーションが認識されないようで、なにも起きません。。なにか原因があるのでしょうか?お忙しいところ申し訳ございませんが、教えていただけますと幸いです。
ちなみに、このマクロを使いたい目的は、英語の文書中のダブルクオーテーションで囲われた定義語を塗りつぶし、それを「別のファイルに書き出すマクロ」を使って抽出し、用語集を作ることです。和文の方は、教えていただいた方法で「」に変えてやってみたところ上手く行っているのですが、英語の方が上手く行きません。。
英文中の大文字表記の定義語が抽出できればいいので、ダブルクオーテーションで検索できなくても、例えば、頭文字が大文字の英語を抽出するなど、もし別の方法をご存じであれば、教えていただきたいです。
度々恐縮ですが、どうぞよろしくお願いいたします。
マクロ超初心者さん
お試しをいただきましてどうもありがとうございます。なるほど、そういう目的でマクロを使われているのですね。
おそらく、マクロ超初心者さんが扱われている文書中のダブルクオーテーションは、ひげのついているタイプじゃないでしょうか。
先日、別件でひげのついているダブルクオーテーションを処理するマクロを作成しましたので、また機会があるときにそのプログラムを記事にします。それが参考になるのかもしれません。
ダブルクォーテーションの処理のマクロを記事にしていただけるとのこと、ありがとうございます!お忙しいところ恐れ入りますが、どうぞよろしくお願いいたします。
先日ご相談させていただいたこちたの件なのですが、文字コードをいれましたら、解決いたしました!お忙しいところお騒がせいたしましたm(._.)m
解消できたとのことよかったです。こちらこそ記事をアップできずにおりまして失礼いたしました。