前回の記事「PDFからWordに変換した際の全角文字間の半角スペースを削除するWordマクロ」の応用版です。
前回のマクロでは文書全体を処理対象にしましたが、今回のマクロでは選択範囲を処理対象にします。
<目次>
このマクロでできること
選択範囲内の全角文字に挟まれた半角スペースを削除します。削除箇所の着色はしません。目視で確認できるからです。
処理前後の文字列の選択状態が変わるので2つのパターンを説明します。マクロの特性上このようになりますが、誤動作ではありません。
パターン1
(処理前)
文字列の末尾に半角スペースを含むように処理対象を選択した状態で実行します。
(処理後)
パターン2
(処理前)
文字列の末尾に半角スペースを含まずに処理対象を選択した状態で実行します。
(処理後)
選択範囲がもともと選択された範囲から末尾が2文字ずれてしまいます。処理自体は正確に行われます。
マクロの解説
前回の記事「PDFからWordに変換した際の全角文字間の半角スペースを削除するWordマクロ」と同じような考え方で処理をしています。検索する文字列も置換後の文字列も同じです。
わざわざワイルドカードの置換で半角スペースを処理する目的は、全角文字間の半角スペースに対象を絞り込むこと以外にもあります。選択範囲の文字書式を保持したいのです。
たとえば、選択範囲内の半角スペースを除去するだけであれば、以下の1行のマクロでも半角スペース自体は処理できます。文字列処理だけを考えたプログラムを組むとこちらをやりたくなります。
Selection.Text = Replace(Selection.Text, " ", "")
しかし、この場合は選択されている範囲内の文字書式がすべて解除されてしまい、選択範囲の先頭1文字の書式がすべて適用されてしまいます。
(処理前)
(処理後)
これは、望む処理結果ではないですよね。ワイルドカードの置換は[検索と置換]ダイアログボックスを使った場合でも同じですが、置換後も元の書式を保持できるという優れた特性があるのでこれを利用しています。
(参考:【Word】ワイルドカードを用いて検索する文字列の書式を保持する方法)
では、この記事のマクロを使った場合にはどうなるのでしょうか。
(処理後)
こちらが欲しい結果ですよね。
あと、このマクロでは、選択範囲内の処理に限定するため、検索した結果が元の選択範囲内にあるのかをInRangeメソッドで判定しています(28行目)。
マクロ
Sub 全角文字間の半角スペースを削除する_選択範囲() Dim myRange As Range '置換処理用 Dim myInRange As Range '範囲確認用 '選択範囲をRangeオブジェクトに設定 Set myRange = Selection.Range Set myInRange = myRange.Duplicate '置換実行 With myRange.Find .Text = "([! -~^9^11^12^13^14]) ([! -~^9^11^12^13^14])" With .Replacement .Text = "\1\2" End With .Forward = True .Wrap = wdFindStop .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = True Do While .Execute = True '見つけた個所が選択範囲内であれば置換実行 If myRange.InRange(myInRange) Then .Execute Replace:=wdReplaceOne myRange.Collapse wdCollapseStart Else '見つけた箇所が選択範囲外であれば終了 Exit Do End If Loop End With '処理中に解除される選択範囲を再度選びなおす myInRange.Select Set myRange = Nothing Set myInRange = Nothing End Sub