前回「英数字を半角にカタカナを全角に変換するExcel関数」という記事を書きました。
でも、このような機能は、長文でこそ威力を発揮します。そこで、Wordで同様の機能が得られるマクロを書いてみました。
マクロの使い方が分からない場合は、こちらの記事をご覧ください。Excelの例ですが、操作方法はWordもほぼ同じです。
では、マクロを示します。標準モジュールを挿入し、コピー&ペーストしてください。
'-----------------------------------------------------------------------
' Summary: 文書全体を全角変換し、英数は半角にする。1桁数値は選択する
'-----------------------------------------------------------------------
Public Sub CorrectTheCharacterWidth()
Dim intAsc As Integer ' 文字コード
Dim rng As Range ' 処理対象領域
Dim strPattern As String ' マッチングパターン
Dim vbRet As VbMsgBoxResult ' MsgBoxの戻り値保持用
' ─── 文書全体を全角に変換する ───
ActiveDocument.Content.CharacterWidth = wdWidthFullWidth
' ─── 英字を半角にする ───
' 文書の先頭から検索する
Set rng = ActiveDocument.Range(0, 0)
With rng.Find
' 任意の1文字を処理対象にする
.Text = "?"
.MatchWildcards = True
' ワイルドカードがマッチする間はループする
Do While .Execute
' 処理対象の1文字を半角にして、さらに文字コードにする
intAsc = Asc(StrConv(rng.Text, vbNarrow))
' 文字が数字を除くAsciiコードなら半角変換対象
If (intAsc >= &H20 And intAsc <= &H2F) Or _ (intAsc >= &H3A And intAsc <= &H7E) Then
' ワイルドカードがマッチした領域を半角に変換する
rng.CharacterWidth = wdWidthHalfWidth
' 現在の処理対象領域の最後を次の検索開始位置にする
rng.Collapse (wdCollapseEnd)
' 文書の最後で&H0Dにマッチする無限ループを避ける
If rng.Start + 1 = rng.StoryLength Then Exit Do
End If
Loop
End With
' ─── 数値を半角にする。1桁数値は選択する ───
vbRet = MsgBox("1桁数値を全角にしますか?", _
vbYesNo + vbQuestion, "1桁数値の全角/半角の選択")
Select Case vbRet
' 1桁を全角にするために1桁でない数をマッチングパターンにする
Case vbYes: strPattern = "[0-9]{2,}"
' 1桁も含めて半角にするために全ての数にマッチングさせる
Case vbNo: strPattern = "[0-9]{1,}"
Case Else: Exit Sub
End Select
' 文書の先頭から検索する
Set rng = ActiveDocument.Range(0, 0)
' ワイルドカードがマッチする間はループする
With rng.Find
.Text = strPattern
.MatchWildcards = True
Do While .Execute
' ワイルドカードがマッチした領域を全角に変換する
rng.CharacterWidth = wdWidthHalfWidth
' 現在の処理対象領域の最後を次の検索開始位置にする
rng.Collapse (wdCollapseEnd)
Loop
End With
' Rangeオブジェクトを解放する
Set rng = Nothing
End Sub
長文の文書では、1桁の数値を全角で書いた方が見栄えがいいと思える場合があります。そこで、このマクロではメッセージボックスを表示して、1桁の数値を全角にするか半角にするかを選べるようにしました。
また、英字は、アスキーコードが特定の範囲に入ることで判断しています。丸カッコ、疑問符、感嘆符なども半角に変換されますので、ご注意ください。
本原稿もこのマクロで清書しました。1桁数値は全角にしました。英字を半角に変換する場合に1文字ずつ判断しているので、所要時間は約20秒でした。もう少し高速に動作させたいものです。でも、目視で確認するよりは高速ですし、見落としもありません。
コメント