先日ご紹介しました記事「【コード】カーソル以降の英単語に一括でtheを追加する」の改良版です。
前回の記事にいただいたコメント にて、以下のような現象のご指摘がありました。
例えば、以下のような状態でマクロを実行します。
すると、本来はpen 20とは異なるはずのpen 20aもにもあわせてthe が付いてしまいますね。
このような事態を想定して、一括置換した部分は青文字にしています。
文章後半に出てきた変形例の符号で、上記のような不備が起きたときには、色を基準にして判断がつくようになっています(私は、このように仕事をしていました)。
ただ、今回のマクロでは、このようなことにならないように少し工夫をしてみました。ちょっと贅沢なマクロです。
<目次>
このマクロでできること
以下のように、参照符号が異なる場合にはtheをつけません(このマクロの詳しい用途は、「【コード】カーソル以降の英単語に一括でtheを追加する」をご覧ください)。
以下の状態でマクロを実行します。
pen 20aには、the がついていませんね。
マクロの解説
まず、おまけ機能ですが、赤文字部分で、文字列が選択されていない場合にはマクロを実行しないように設定しました。
Wordマクロの悪い癖ですが、文字列を選択していない状態で、Textプロパティにより文字を取得すると、カーソルの右隣の文字が取得されてしまいます。
このような意図しない文字列の取得を回避するために赤文字部分を追記したわけです。
このことについては、「【1行マクロ】文書中で文字列を選択しているかどうか調べる 」の記事で解説しています。
さて、今回のテーマの部分ですが、ワイルドカードを用いてみました。
想定していることが1つあります。
参照符号には、半角数字、半角英字、半角アポストロフィのみが使われるということです(ギリシャ文字など、上記以外のものが使われる場合には、今回のマクロでもthe をつけてしまいますので、その場合には色で判断してください)。
よって、選択した文字列(例では、pen 20)の直後に、半角数字、半角英字、半角アポストロフィ以外が続く場合に、置換対象とするようにいたしました。
上記の青文字の条件は、以下の通りです。
[!a-zA-Z0-9']{1}
これを検索する文字列使って、さらに、置換後の文字列では、\1で受けています。
設定をワイルドカードにすることもお忘れなく。
以下、説明を端おってしまって多少わかりにくいですが、ワイルドカードのルールを解説しました。ご参考まで。
ワイルドカードの検索:ワードマクロ勉強会の資料(名古屋第4回)
ワイルドカードの置換:ワードマクロ勉強会の資料(名古屋第5回)
マクロ
Sub 一括the_2() Dim myText As String Dim myRange As Range '文字列が選択されていない場合には終了 If Selection.Start = Selection.End Then Exit Sub Set myRange = Selection.Range '文字列をmyTextに格納 myText = Trim(Selection.Text) '選択を解除して置換開始位置を選択した文字列の末尾へ myRange.Collapse direction:=wdCollapseEnd With myRange.Find .Text = myText & "([!a-zA-Z0-9']{1})" .Replacement.Text = "the " & myText & "\1" .Replacement.Font.ColorIndex = wdBlue .Forward = True .Wrap = wdFindStop .MatchWildcards = True .Execute Replace:=wdReplaceAll End With Set myRange = Nothing '選択を解除 Selection.Collapse direction:=wdCollapseEnd End Sub