【Word VBA】桁区切りのコンマを入れる(その2)

以前、「【コード】桁区切りのコンマを入れる」というマクロをご紹介しました。

今回の案件で利用する場面があったので、使ってみました。

使おうと思ったら、今回私が使いたい場面では使えないことがわかりました。

マクロは動きます。でも、実務向けじゃくて、そのままでは仕事で使えないことがあるという意味です。

当時はあまり状況がわからずにとりあえずマクロにしてみました、という感じですね。

自分の実務で使っていなかったので、状況をしっかり想像しきれていませんでした。

そもそも、一括置換にしてしまったらまずいこともありますね。

特許文献であれば、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

トップへ戻る