【Word VBA】「○○において」→「in the ○○」に置換するWordマクロ(その2)

2010年6月19日

先日の「『○○において』→『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

関連ページ

-コード
-