先日のWordマクロセミナー
を受講いただいた方から質問をいただきました。
ご本人から許可をいただきましたので掲載させていただきます。
Wordマクロセミナー(プログラミング編)
では、マクロの記録やブログに掲載されているマクロを組み合わせて、自分の目的にあったマクロをつくる方法を説明しています。
そのため、マクロをゼロからつくるのではなく、あるものを組み合わせて、編集するための技術をお伝えしています。
このときに大切なのは、とにかくつくって動かしてみることだと思います。
怖がっていると何もできません。自己責任のもと、どんどんマクロをつくって使ってみることが大切だと思います。
そんなことをお伝えしたところ、受講後にすぐにマクロをつくられた方がいらっしゃいまして、いくつか質問をいただいています。
他の方にも参考になると思われますので掲載させていただきます。
▼マクロが目指すもの
よくある英文特許明細書です。
上書き翻訳時に、このクレーム部分を日本語表記にするためのマクロです。
欲しい結果は以下の通りです。
特許翻訳を上書きでする場合には、必須アイテムです。
▼いただいたマクロ
いただいたマクロで、上記の目的を達成できます。
ワイルドカードの一括置換を効果的に使っています。
しかし、うまくいかない場合もありえます。
好ましくないと思われる部分を赤文字にしました。
Sub 請求項切替英日()
'
' 請求項切替英日 Macro
'
'
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "What is claimed is:"
.Replacement.Text = "【書類名】 特許請求の範囲"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
With Selection.Find
.Text = "^13([0-9]{1,}).^9"
.Replacement.Text = "^p【請求項\1】^p"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
▼いただいたマクロの修正が必要な箇所と理由
私がつくるならこうする、というものを書きました。
正解は1つではないので、他にも方法はあると思います。
考え方の参考としてご覧ください。
Selection.Find.Execute Replace:=wdReplaceAll
この記述はまずいです。
何かのマクロのコピペだと思いますが、これは現在の「検索と置換」ダイアログボックスの設定にて「すべて置換」をするという指令です。
「検索と置換」ダイアログボックスには、前回の置換に用いられた条件(検索する文字列、置換語の文字列、書式設定、検索条件など)が保持されますから、前回の「検索と置換」ダイアログボックスの条件そのままを実行することになります。
これは削除します。
.Wrap = wdFindContinue
私は、この記述は使用しないように心がけています。
検索や置換を実行したときに、対象範囲で末尾まで検索をして見つからなかったときに、対象範囲の先頭までいき検索を再開する指令です。
経験上、この記述を使ってループ処理を行うと無限ループに陥ることがあるので、私は普段から極力使わないようにしています。
これを、
.Wrap = wdFindStop
と書き換えて、対象範囲の末尾で検索や置換が終了するようにしています。
あと、検索や置換を開始する前に、カーソルを先頭に移動します。以下の1文です。
マクロの記録で、[Ctrl] + [Home] をすると得られるコードです。
Selection.HomeKey Unit:=wdStory
Selectionオブジェクトで検索や置換を実行したときには、カーソル位置からカーソルが置かれたストーリー(本文など)内の検索や置換が始まります。
検索する文字列内にカーソルがあると、その部分が検索対象から外れてしまうこともあります。なので、検索を先頭から始めることは大切です。
特に、上記のように、.Wrap = wdFindStop としているため、文書全体を検索する場合であれば、カーソルを一度先頭に移動させる必要があります。
(参考)
「検索と置換」ダイアログボックスとマクロコードの関係は、以下の記事に少し記載があります。
選択されている文字列を文書内で検索するマクロ(文書の末尾で検索をとめたりとめなかったり)
「検索と置換」ダイアログの検索方向とマクロとの関係
.MatchFuzzy = True
検索条件の「あいまい検索(日)」がオンになっています。
マクロで置換を実行するときには、あいまいなことは避けた方がいいです。
「あいまい検索」の結果を予測するためには、Wordの「あいまい検索」のルールをすべて理解する必要があります。それは無理です。
マクロで自動的に置換するわけですから、間違いがあっては困ります。
なので、あいまいさを排除して、できるかぎり自分が予測する結果を得られるようにマクロをくみます。
よって、以下のように「あいまい検索(日)」をオフにします。
.MatchFuzzy = False
あとは、「検索と置換」ダイアログボックスの設定を解除するための以下の記述を追加します。
お気づきの方も多いと思いますが、Selectionオブジェクトで検索や置換をした場合には、そのマクロの検索条件が「検索と置換」ダイアログボックスに残ります。
そのため、設定を解除しています。今回は、「検索する文字列」や「置換後の文字列」を解除して、「ワイルドカードを使用する」もオフにしたいですよね。
以下のコードは、上記以外の設定も解除する記述になっているので行数が多いですが、こういう慣用句みたいなものを毎回追記(コピペ)するようにしています。
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
▼修正後のマクロ
青文字部分を追記しました。
赤文字部分を修正しました。
Sub 請求項切替英日()
'
' 請求項切替英日 Macro
'
'
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "What is claimed is:"
.Replacement.Text = "【書類名】 特許請求の範囲"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
With Selection.Find
.Text = "^13([0-9]{1,}).^9"
.Replacement.Text = "^p【請求項\1】^p"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
End Sub
▼関連記事
Wordマクロセミナー
選択されている文字列を文書内で検索するマクロ(文書の末尾で検索をとめたりとめなかったり)
「検索と置換」ダイアログの検索方向とマクロとの関係