【Word VBA】下付き文字の書式情報をタグ化(テキスト情報)に変換するWordマクロ

前回の記事にて、あの手・この手の特許翻訳の秀丸マクロセミナー について少し触れました。

このセミナーでの話題に関するものです。

 秀丸にて英訳をする場合に、原文のワード文書の書式が崩れてしまうことがあります。
たとえば、ワード文書では、下付き文字、上付き文字、太文字などありますが、秀丸に文章をコピーするとこれらの文字の書式がなくなってしまいます。

よって、ワードの文字書式をテキスト情報で維持するためのマクロがあると便利だねという話がありました。

作用

まず、下付き文字が入った文書を準備してください。

タグ化

①下付き文字の書式を<sub>と</sub>のタグで囲むことで、書式情報をタグ(テキスト情報)に置換します。

タグ化

②元に戻します。

タグ化

つまり、①と②のマクロの二つセットでお使いいただきます。
なお、このプログラムの考え方は、特許翻訳者の水野麻子さんの私塾でのワードマクロの授業で習いました。
htmlで使われるタグの記号を使うので、処理結果を目で確認できます。

登録方法

以下のページをご覧ください。

プログラム1(下付き文字書式をタグ(テキスト情報)へ変換)


Sub 下付き文字の書式をタグへ変換()

 Dim myRange As Range
 
 Set myRange = ActiveDocument.Range(0, 0)
 
 With myRange.Find
  .Wrap = wdFindStop
  .Font.Subscript = True
  .Execute findText:=""
 End With
 
 Do While myRange.Find.Found = True
  myRange.Font.Subscript = False
  With Selection.Range
   .SetRange Start:=myRange.End, End:=myRange.End
   .Text = "</sub>"
   .SetRange Start:=myRange.Start, End:=myRange.Start
   .Text = "<sub>"
  End With
  myRange.Collapse
  myRange.Find.Execute
 Loop
 
 Set myRange = Nothing

End Sub

プログラム2(テキスト情報から、下付き文字書式へ変換)


Sub タグを下付き文字書式へ変換()

 Dim myRange As Range
 
 Set myRange = ActiveDocument.Range(0, 0)
 
 With myRange.Find
  .Wrap = wdFindStop
  .MatchWildcards = True
  .Execute findText:="[<]sub[>]*[<][/]sub[>]"
 End With
 
 Do While myRange.Find.Found = True
  myRange.Font.Subscript = True
  With Selection.Range
   .SetRange Start:=myRange.End, End:=myRange.End - Len("</sub>")
   .Delete
   .SetRange Start:=myRange.Start, End:=myRange.Start + Len("<sub>")
   .Delete
  End With
  myRange.Collapse
  myRange.Find.Execute
 Loop
 
 Set myRange = Nothing

End Sub

プログラム1の解説

7行~11行
下付の任意の文字列を探す命令です。

rangeオブジェクトを使いましたが、selectionオブジェクトでも同じです。

検索対象のテキストを空欄(50行)にして、検索したい書式(今回は下付:40行)
だけを指定すると、指定した書式をもつ任意の文字列を検索できます。

これは、通常の「検索と置換」ダイアログボックスでの考え方と同じですね。

13行~23行
下付文字列が見つかった場合に、<sub>と</sub>を前後に書くための命令です。

プログラム2の解説

7行~11行
<sub>と</sub>とで囲まれた文字列を検索する命令です。

検索対象文字列が以下のようになっていることに注目。

findText:=”[<]sub[>]*[<][/]sub[>]

findText:=”<sub>*</sub>”

ではありません。

また、

findText:=”[<]sub[>]*[</]sub[>]”

これも厳密にいうと間違いです。(今回のプログラムでは動きますが。。。)

心がけとして、記号の </ が連続していても、横着せずに一つずつ [] で囲みましょう。

今回の検索では、「*」を用いて、0以上の任意の文字列を検索をするために、ワイルドカード検索をしています。

 ワイルドカード検索の場合には、ワイルドカード検索で用いる特殊記号(たとえば、*, ^, [, ], <, >など)を検索の文字列に利用することができません。
なので、例えば、「<」を検索文字列であることを示すため、[<]として、前後をスクウェアブラケットで囲んでいるわけです。
ちなみに、[を検索する場合には、[[]というように書きます。

工夫

選択範囲の指定のために、以下の構文を使いました。

Selection.Range.SetRange Start:=カーソル開始位置, End:=カーソル終了位置

Selection.Rangeとして、Rangeオブジェクトとして扱っているため、カーソルは移動しません。
Selection.SetRange Start:=カーソル開始位置, End:=カーソル終了位置
として、.Rangeを削除すると、Selectionオブジェクトとして扱うので、カーソルが移動します。
変更して試してみてください。
トップへ戻る