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
'ページ全体に対して置換
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
'置換後の文字列が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
編集中の文書に変更を施しますので、マクロは文書を保存してから実行してください。ご利用は自己責任でお願いします。
コメント
[…] 次に紹介するマクロの他に、以前、紹介した「長い文字列の置換」「全てを置換」の二つの関数が必要になります。 […]