先日の「『○○において』→『in the ○○』の置換マクロ」の記事で間違いがありました。
大変失礼しましたが、みなさんが同じような間違いをしないように、記録として残すことにします。
恥をさらすような気がしますが、自分の学びでもありますからね。
間違いの説明
先日紹介したプログラムでは、文書中で何も選択されていない場合(つまり、置換する対象となる文字列が選択されていない場合)には、プログラムを終了するつもりでした。
しかし、文書中で何も選択されていなくても、プログラムが終了しないことがわかりました。
たとえば、以下の場所にカーソルが置かれている状態でマクロを実行します。
(処理前)
(処理後)
こんなふうになってしまいます。
理由はわかりますか?
上記の場合の一括置換の対象は以下のようになっています。
検索する文字列:"の中において" 置換後の文字列:"in the "
つまり検索対象としたいmyPhrase(1)に何も入っていない状態で、置換を実行してしまっているんですね。
間違いの理由
「【コード】文書中で文字列を選択しているかどうか調べるWordマクロ」の記事で書きました。
修正版マクロ
以下の通りです。修正点は8行目の通りです。
Sub in_the_solution_2() Dim myPhrase(1 To 2) As String Dim myRange As Range Set myRange = Selection.Range myRange.SetRange Start:=Selection.Start, End:=Selection.Start With myRange myPhrase(1) = .Text .Collapse direction:=wdCollapseEnd .MoveEndWhile Cset:="においてける中ので", Count:=6 myPhrase(2) = .Text End With myRange.SetRange Start:=Selection.Start, End:=Selection.Start With myRange.Find .Text = myPhrase(1) & myPhrase(2) .Replacement.Text = "in the " & myPhrase(1) .Replacement.Font.ColorIndex = wdBlue .Forward = True .Wrap = wdFindStop .Execute Replace:=wdReplaceAll End With Set myRange = Nothing End Sub