VBAで長い文字列に置換する方法

Pocket

VBA(Word)で文字列の置換を行う場合、置換後の文字列が長すぎるとエラーになります。

実行時エラー5854
文字列型パラメータが長すぎます。

これを回避する方法を考えました。
次に挙げる二つの関数が必要です。「長い文字列の置換」がメインです。
使う場合は「call 長い文字列の置換(mae, ato)」のようにして使います。

全てを置換

ページ全体に対して置換を行うマクロです。これ自体は長い文字列に対応していません。

Function 全てを置換(mae, ato)
    'ページ全体に対して置換
    Dim myRange
    Set myRange = ActiveDocument.Range(Start:=0, End:=0)
    With myRange.Find
        .ClearFormatting
        .Text = mae
        With .Replacement
            .ClearFormatting
            .Text = ato
        End With
        .Execute Replace:=wdReplaceAll
    End With
End Function

長い文字列の置換

メインとなる部分です。
置換後の文字列が255文字を超えるとエラーになります。
まず置換後の文字列を250文字ずつ分割すると何個になるかを計算します。
もし700文字だとすると3個になります。
そこで、置換後の文字列を「{{1}}{{2}}{{3}}」として、とりあえず置換します。これが255文字を超えることはないでしょう。
次に置換後の文字列から250文字ずつ分割して「{{1}}」「{{2}}」「{{3}}」と置換します。それぞれは255文字を超えないのでエラーが出ません。

Function 長い文字列の置換(mae, ato)
    '置換後の文字列が255文字超に対応
    Const partLen = 250
    Const markLeft = "{{"
    Const markRight = "}}"
    Dim atoLen As Long, kaisu As Long, i As Long
    Dim markAll, part As String
    atoLen = Len(ato)
    kaisu = Int(atoLen / partLen + 1)
    markAll = ""
    For i = 1 To kaisu
        markAll = markAll & markLeft & i & markRight
    Next i
    Call 全てを置換(mae, markAll)
    For i = 1 To kaisu
        markAll = markLeft & i & markRight
        part = Mid(ato, partLen * (i - 1) + 1, partLen)
        Call 全てを置換(markAll, part)
    Next i
End Function

編集中の文書に変更を施しますので、マクロは文書を保存してから実行してください。ご利用は自己責任でお願いします。

[ 2014年9月1日 | カテゴリー: Word | タグ: , ]

« | »

コメント

  1. […] 次に紹介するマクロの他に、以前、紹介した「長い文字列の置換」「全てを置換」の二つの関数が必要になります。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報