VBAによる置換の怪(Word)

VBAによる置換の怪

ちょっと変な現象に出くわしたので報告。

無駄な改段落マークを削除する

最近、Webページ上で公開されている議事録の類をWordドキュメント化する作業にハマっている。今すぐ役に立つわけではないけれど、後で利用するときに楽かな、と思って。

Webページ上からWordドキュメントにテキスト部分をコピッペして、後は主にマクロを使って整形する。

そのときにやたら遭遇するのが

f:id:akashi_keirin:20200312074238j:plain

のようなパターン。

行と行の間に無駄な改段落マークがあるやつ。

まずはこいつを一掃したかった。

要は、二つ連なっている改段落マークを一つにすればよいのだから、次のようなコードでやった。

リスト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メソッド。

str1str2の二つの引数を受け取って、ドキュメント中のstr1str2に置換する。それだけ。

(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メソッドを実行する。

str1str2に置換したいので、引数FindTextstr1を、引数ReplaceWithstr2を渡す。

また、全て置換するために引数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

のように、str1vbCr & vbCr(二つ連なった改段落マーク)、str2vbCrを指定して実行することによって、行のカンチャンの目障りな改行マークを一掃するのである!

実行

さて、

f:id:akashi_keirin:20200312074240j:plain

この状態で、上記リスト1のremoveUnsightlyCRを実行すると、当然

f:id:akashi_keirin:20200312074243j:plain

こうなる。

しかし!

この状態で、イミディエイトに

?ActiveDocument.Paragraphs.Count

と打ち込んで[Enter]を押すと、

f:id:akashi_keirin:20200312074246j:plain

な、なんだってーーー!?

なんと、段落数は1なのである。

どう見ても5なのに。

標準機能で置換する

ちなみに、

f:id:akashi_keirin:20200312074249j:plain

f:id:akashi_keirin:20200312074251j:plain

このように、標準機能を用いて置換した場合、

f:id:akashi_keirin:20200312074255j:plain

段落数は5になる。VBAでやった場合と標準機能を用いた場合とで結果が異なるのである。まさにち~んw珍現象!

おわりに

テキストドキュメントを整形する機会のある人は、注意しましょう。