VBAによる置換の怪(Word)
VBAによる置換の怪
ちょっと変な現象に出くわしたので報告。
無駄な改段落マークを削除する
最近、Webページ上で公開されている議事録の類をWordドキュメント化する作業にハマっている。今すぐ役に立つわけではないけれど、後で利用するときに楽かな、と思って。
Webページ上からWordドキュメントにテキスト部分をコピッペして、後は主にマクロを使って整形する。
そのときにやたら遭遇するのが
のようなパターン。
行と行の間に無駄な改段落マークがあるやつ。
まずはこいつを一掃したかった。
要は、二つ連なっている改段落マークを一つにすればよいのだから、次のようなコードでやった。
リスト1
'テキストの置換' Private Sub replaceText(ByVal str1 As String, _ ByVal str2 As String) With Selection.Find '……(1)' Call .ClearFormatting Call .Replacement.ClearFormatting End With With Selection.Find '……(2)' Call .Execute(FindText:=str1, _ replacewith:=str2, _ Replace:=wdReplaceAll) End With With Selection.Find '……(3)' Call .ClearFormatting Call .Replacement.ClearFormatting End With End Sub Private Sub removeUnsightlyCR() '……(4)' '連続するCarriageReturnを一つにする' Call replaceText(vbCr & vbCr, vbCr) End Sub
まずは、replaceText
メソッド。
str1
とstr2
の二つの引数を受け取って、ドキュメント中のstr1
をstr2
に置換する。それだけ。
(1)の
With Selection.Find Call .ClearFormatting Call .Replacement.ClearFormatting End With
でFind
オブジェクトの設定をリセットする。
次に(2)の
With Selection.Find '……(2)' Call .Execute(FindText:=str1, _ ReplaceWith:=str2, _ Replace:=wdReplaceAll) End With
でFind.Execute
メソッドを実行する。
str1
をstr2
に置換したいので、引数FindText
にstr1
を、引数ReplaceWith
にstr2
を渡す。
また、全て置換するために引数Replace
にはwdReplaceAll
を渡す。
後は、(3)の
With Selection.Find Call .ClearFormatting Call .Replacement.ClearFormatting End With
で再度Find
オブジェクトをリセットしておしまい。
このreplaceText
メソッドを、(4)の
Private Sub removeUnsightlyCR() '連続するCarriageReturnを一つにする' Call replaceText(vbCr & vbCr, vbCr) End Sub
のように、str1
にvbCr & vbCr
(二つ連なった改段落マーク)、str2
にvbCr
を指定して実行することによって、行のカンチャンの目障りな改行マークを一掃するのである!
実行
さて、
この状態で、上記リスト1のremoveUnsightlyCR
を実行すると、当然
こうなる。
しかし!
この状態で、イミディエイトに
?ActiveDocument.Paragraphs.Count
と打ち込んで[Enter]を押すと、
なんと、段落数は1
なのである。
どう見ても5
なのに。
標準機能で置換する
ちなみに、
このように、標準機能を用いて置換した場合、
段落数は5
になる。VBAでやった場合と標準機能を用いた場合とで結果が異なるのである。まさにち~んw珍現象!
おわりに
テキストドキュメントを整形する機会のある人は、注意しましょう。