以前、「【コード】桁区切りのコンマを入れる」というマクロをご紹介しました。
今回の案件で利用する場面があったので、使ってみました。
使おうと思ったら、今回私が使いたい場面では使えないことがわかりました。
マクロは動きます。でも、実務向けじゃくて、そのままでは仕事で使えないことがあるという意味です。
当時はあまり状況がわからずにとりあえずマクロにしてみました、という感じですね。
自分の実務で使っていなかったので、状況をしっかり想像しきれていませんでした。
そもそも、一括置換にしてしまったらまずいこともありますね。
特許文献であれば、4桁以上の参照符号にコンマを入れたらまずいし、商品の型番などもコンマは不要ですし。
日本語の文章でも英語の文章でもそうですが、様々な半角数字が入っています。
【コード】桁区切りのコンマを入れるでは、段落番号と年号を除外するようになっていますが、それ以外にも除外する場面が出てきます。
というわけで、1回1回確認しながらコンマを入れるマクロに変えてみました。
<目次>
このマクロでできること
カーソルが置かれているストーリー(本文、テキストボックスなど)内の半角数字を探して、3桁毎にコンマを挿入します。
ストーリーの先頭に数字が記載されている場合には、コンマを挿入できません。
ワイルドカードで半角数字を探しているのですが、その都合でこうなりました。
なお、小数、年号、特許の段落番号の場合には4桁以上であっても当然コンマが入りませんので、判定できる範囲で検索対象から除外しています。
カーソル位置から上方向に検索を開始します。
以下の例では、本文の末尾にカーソルをおいて実行したものです。
マクロの解説
半角数字は、ワイルドカードで探しています。
年号、段落番号、小数ではないと思われる数字をワイルドカードで設定しています。
13行と14行の記載により、探したものをどう置換すればいいのか、ご覧ください。
.text = "([!.\[])([0-9]{1,})([0-9]{3})([!年\]])" .Replacement.text = "\1\2,\3\4"
マクロ
Sub 半角数字にコンマ挿入2() Dim myRange As Range Dim myLen As Integer Dim myAnswer As String '現在カーソル位置にRangeオブジェクトを設定 Set myRange = Selection.Range 'ワイルドカードで4桁以上の数字を検索 '文書の末尾から先頭に向けて検索します With myRange.Find .text = "([!.\[])([0-9]{1,})([0-9]{3})([!年\]])" .Replacement.text = "\1\2,\3\4" .Forward = False .Wrap = wdFindContinue .MatchWildcards = True End With '4桁以上の数字が見つかったときの処理 With myRange Do While .Find.Execute = True myRange.Select myAnswer = MsgBox("コンマを挿入しますか?", _ vbYesNoCancel Or vbQuestion, _ "3桁毎にコンマを挿入するマクロ") Select Case myAnswer Case vbYes myLen = Len(myRange) .Find.Execute Replace:=wdReplaceOne .SetRange .End + myLen, .End + myLen Case vbNo '何もしない Case vbCancel Exit Sub End Select Loop End With 'Rangeオブジェクトの解放 Set myRange = Nothing End Sub