📊 Excel VBA Top100
🔧

ExtractNumbers

ユーティリティ

文字列から数字のみを抽出する

テキストと数値が混在するセルから数値部分だけを抽出するVBAマクロです。正規表現(RegExp)またはループによる文字種判定で数字文字だけを取り出し、数値として別セルに出力します。「123個」「¥5,000」「TEL:03-1234-5678」のような書式から純粋な数値を取り出す処理に最適で、データクレンジングや集計前の前処理として頻繁に使用されます。内部ではVBScript.RegExpオブジェクトに\d+のパターンを設定してマッチした数字列を抽出しており、正規表現エンジンを使うことでループによる1文字判定より高速かつ簡潔にコードを書けます。ExtractTextと対になる関係にあり、数値部分と文字列部分をそれぞれ別のマクロで抽出すれば、混在データの完全な構造化が実現します。手作業での転記に比べて桁の見間違いといった入力ミスも根絶できます。

ExtractNumbers デモ

📖 使い方

  1. VBAエディタを開く(Alt + F11)
  2. モジュールを挿入(挿入 > モジュール)
  3. 下記VBAコードをコピー&ペースト
  4. ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 数字を抽出する文字列が含まれるセル範囲を選択して実行

🎯 活用シーン

  • ✓「売上: 1,500,000円」のようなテキストから金額数値のみを抽出して集計
  • ✓電話番号フィールドからハイフンを除いた数字のみを取り出す
  • ✓コード番号に混入した余分な文字を除去して純粋なIDに整形
  • ✓問い合わせフォームの自由記述欄に混在する金額情報を抽出し、概算集計を自動化したいとき
  • ✓スキャンしたPDFから変換した住所データに紛れ込んだ郵便番号だけを抽出したいとき

💡 実装のヒント

  • ▸VBScript.RegExpオブジェクトで\d+パターンにマッチした数字を抽出できます
  • ▸IsNumeric関数を使った1文字ずつのループでも数字のみを抽出できます
  • ▸カンマや小数点も含めたい場合は抽出ロジックをカスタマイズします
  • ▸カンマ区切りの数値(1,234,567など)を正しく数値化したい場合は、抽出後にReplace関数でカンマを除去してからCLng/CDblで変換してください。
  • ▸マイナス値や小数点を含む数値を抽出したい場合は、正規表現パターンを拡張する必要があります。

💻 VBAコード

' ExtractNumbers
' -----------------
' Macro Name: ExtractNumbers
' Description: 文字列から数字のみを抽出する
' Parameters: なし
' Returns: なし
' Usage: 数字を抽出する文字列が含まれるセル範囲を選択して実行
' -----------------

Sub ExtractNumbers()
    Dim cell As Range
    Dim resultWs As Worksheet
    Dim outputRow As Long

    On Error GoTo ErrorHandler

    If TypeName(Selection) <> "Range" Then
        MsgBox "セル範囲を選択してください。", vbExclamation
        Exit Sub
    End If

    Set resultWs = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    resultWs.Name = "数字抽出_" & Format(Now, "hhnnss")

    resultWs.Cells(1, 1).Value = "数字抽出結果"
    resultWs.Cells(1, 1).Font.Bold = True
    resultWs.Cells(1, 1).Font.Size = 14

    resultWs.Cells(3, 1).Value = "元のセル"
    resultWs.Cells(3, 2).Value = "元の値"
    resultWs.Cells(3, 3).Value = "抽出結果"
    resultWs.Cells(3, 1).Font.Bold = True
    resultWs.Cells(3, 2).Font.Bold = True
    resultWs.Cells(3, 3).Font.Bold = True
    resultWs.Range(resultWs.Cells(3, 1), resultWs.Cells(3, 3)).Interior.Color = RGB(200, 200, 200)

    outputRow = 4

    For Each cell In Selection
        If cell.Value <> "" Then
            Dim originalText As String
            Dim normalizedText As String
            Dim extractedNum As String
            Dim i As Long

            originalText = CStr(cell.Value)
            normalizedText = StrConv(originalText, vbNarrow)
            extractedNum = ""

            For i = 1 To Len(normalizedText)
                Dim ch As String
                ch = Mid(normalizedText, i, 1)
                If ch >= "0" And ch <= "9" Then
                    extractedNum = extractedNum & ch
                End If
            Next i

            resultWs.Cells(outputRow, 1).Value = cell.Address
            resultWs.Cells(outputRow, 2).Value = originalText
            resultWs.Cells(outputRow, 3).NumberFormat = "@"
            resultWs.Cells(outputRow, 3).Value = extractedNum
            outputRow = outputRow + 1
        End If
    Next cell

    resultWs.Columns("A:C").AutoFit
    resultWs.Select

    MsgBox "数字抽出が完了しました。", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub