VBAで自動化 VBA一覧 セル・値の取得と貼り付け 値の一部

【VBA】セル内の数字だけ/文字だけを抽出する方法を完全解説【混在データ対応】

Excel VBAでデータを扱っていると、
「セルに混在している 数字だけを取り出したい
「逆に 文字だけを抽出したい
という要件は非常に頻繁に発生します。

たとえば、

  • 「商品A123」から 123 だけ取得したい
  • 「No.456B」から No.B だけを残したい
  • 郵便番号・電話番号・管理番号を分離したい
  • システム連携用に数値・文字を正規化したい

といったケースです。

一見すると単純そうに見えますが、実務では

  • 全角・半角が混在している
  • 記号が含まれている
  • 空白や改行が紛れている
  • データ形式が不統一

といった問題が必ず発生します。

この記事では、
VBAで「セル内の数字だけ」「セル内の文字だけ」を安全・確実・再利用可能に抽出する方法を、
基礎から実務レベルまで体系的に解説します。

✅ セル内から数字・文字を抽出する処理が重要な理由

Excel業務では、見た目は同じでも中身がバラバラなデータが頻繁に登場します。
特に人が入力したデータや外部システムから取り込んだデータは、
「きれいに揃っている前提」で処理すると必ず破綻します。
数字だけ・文字だけを抽出できるかどうかで、
VBAの実務対応力は大きく変わります。
ここを理解せずに処理を書くと、
一部のデータで突然エラーや誤判定が起きます。
まずは、この処理がなぜ重要なのかを整理します。

・データ正規化の第一歩

数値と文字を分離することで、
後続の計算・判定・比較処理が安定します。

・RPA・自動処理との相性が良い

数字だけ・文字だけに分けておくことで、
自動処理が止まりにくくなります。


✅ VBAで使える基本的な考え方(1文字ずつ判定する)

セル内の数字・文字を抽出する基本は、
文字列を1文字ずつチェックして、条件に合うものだけを連結する
という考え方です。

SplitやReplaceだけでは対応できないケースが多いため、
この基本構造を理解することが重要です。
ここを押さえておくと、応用が一気に楽になります。
まずは考え方を整理しましょう。

・1文字ずつループする

For文で文字列を1文字ずつ取り出します。

・数字か文字かを判定する

IsNumeric や Like 演算子を使って判定します。


✅ セル内の「数字だけ」を抽出する最も基本的な方法

まずは、
半角数字のみを対象にした最も基本的な例から解説します。
この処理が、すべての応用の土台になります。
仕組みを理解しながら確認してください。

・基本コード例(数字だけ抽出)

Sub ExtractNumbers_Basic()

    Dim src As String
    Dim result As String
    Dim i As Long
    Dim ch As String

    src = Range("A1").Value
    result = ""

    For i = 1 To Len(src)
        ch = Mid(src, i, 1)
        If ch Like "[0-9]" Then
            result = result & ch
        End If
    Next i

    MsgBox result

End Sub

・コード解説

  1. セルA1の文字列を取得
  2. 文字列の長さ分ループ
  3. Mid関数で1文字ずつ取り出す
  4. 数字なら result に連結
  5. 最終結果を表示

「ABC123D4」の場合、結果は「1234」になります。


✅ IsNumericを使った数字判定の注意点

VBAには IsNumeric関数 が存在しますが、
使い方を誤ると想定外の結果になります。
ここでは、IsNumericの特性を正しく理解します。
実務で非常に重要なポイントです。

・IsNumericを使った例

If IsNumeric(ch) Then
    result = result & ch
End If

・IsNumericの注意点

  • 「-」「.」も数値と判定される
  • 全角数字も True になる場合がある
  • 厳密な数字判定には不向きなケースがある

そのため、Like "[0-9]" の方が安定する場面が多いです。

参考:【VBA】IsNumericの使い方|数値判定の基本と落とし穴を徹底解説


✅ セル内の「文字だけ」を抽出する基本例

次に、
数字を除外して文字だけを残す 方法を解説します。
考え方は数字抽出の逆です。
この処理も実務で非常によく使われます。

・基本コード例(文字だけ抽出)

Sub ExtractLetters_Basic()

    Dim src As String
    Dim result As String
    Dim i As Long
    Dim ch As String

    src = Range("A1").Value
    result = ""

    For i = 1 To Len(src)
        ch = Mid(src, i, 1)
        If ch Like "[!0-9]" Then
            result = result & ch
        End If
    Next i

    MsgBox result

End Sub

・コード解説


✅ 記号や空白を除外して「文字のみ」を抽出する方法

実務では、
「文字だけ」と言いつつ、
記号や空白は不要なケースがほとんどです。
この章では、
英字・日本語文字のみを残す考え方を解説します。
ここを理解すると、実務精度が一段上がります。

・英字のみを残す例

If ch Like "[A-Za-z]" Then
    result = result & ch
End If

・日本語を含める場合の考え方

VBAでは、日本語1文字も1文字として扱われます。
厳密な日本語判定は難しいため、
「数字・記号を除外する」という発想が現実的です。


✅ 全角数字・全角文字が混在する場合の対処

日本語環境では、
全角数字・全角英字が混在するケースが非常に多いです。
ここを考慮しないと、
抽出結果が想定とズレます。
この章では、全角対応の考え方を整理します。

・全角数字を半角に変換してから処理する

StrConv関数を使うことで、
全角→半角変換が可能です。

src = StrConv(src, vbNarrow)

この一行を入れるだけで、
数字抽出の精度が大きく向上します。

参考:【VBA】型変換(CInt/CLng/CStr/CDate)の使い分けと注意点|実務のデータ処理


✅ 正規表現を使って数字・文字を抽出する方法

条件が複雑になる場合、
正規表現 を使うことでコードが簡潔になります。
大量データやパターンが不統一な場合に有効です。

・数字だけを正規表現で抽出

Function ExtractNumbers_Regex(src As String) As String

    Dim reg As Object
    Set reg = CreateObject("VBScript.RegExp")

    reg.Pattern = "[0-9]+"
    reg.Global = True

    If reg.Test(src) Then
        Dim m As Object
        For Each m In reg.Execute(src)
            ExtractNumbers_Regex = ExtractNumbers_Regex & m.Value
        Next
    End If

End Function

・正規表現を使うメリット


✅ 複数セルを一括処理する実務例

実務では、
1セルだけ処理することはほとんどありません。
ここでは、範囲をループ処理する実務例を紹介します。

・複数セル処理例

Sub ExtractNumbers_Range()

    Dim c As Range

    For Each c In Range("A1:A20")
        c.Offset(0, 1).Value = GetNumbers(c.Value)
    Next c

End Sub

✅ 処理を関数化して再利用性を高める

数字・文字抽出処理は、
関数としてまとめるのがベストです。
これにより、
可読性・保守性・再利用性が大きく向上します。

・数字抽出用関数例

Function GetNumbers(src As String) As String

    Dim i As Long
    Dim ch As String

    For i = 1 To Len(src)
        ch = Mid(src, i, 1)
        If ch Like "[0-9]" Then
            GetNumbers = GetNumbers & ch
        End If
    Next i

End Function

✅ よくある失敗パターンと回避策

セル内の数字・文字抽出で、
特に多い失敗を整理します。

  • 全角数字を考慮していない
  • 空白セルを想定していない
  • IsNumericを過信している
  • 記号を含めてしまっている

これらはすべて、
今回紹介した設計で回避できます。


✅ RPA・自動化を意識した設計の考え方

RPAやバッチ処理では、
「止まらない処理」が最重要です。

  • 空文字は空文字で返す
  • エラーを投げない
  • 関数化して共通化する

この設計思想は、
後々大きな差になります。


 

✅ まとめ:セル内の数字・文字を安全に抽出するために

  • 基本は1文字ずつ判定する
  • Like演算子は非常に強力
  • 全角対策は事前変換が有効
  • 正規表現は複雑条件で有効
  • 関数化で再利用性を高める

セル内の数字だけ/文字だけを抽出できるようになると、
VBAでのデータ加工力は一気に向上します。
今回の内容をベースにすれば、
混在データ処理で迷うことはほとんどなくなるはずです。

参考:【VBA】プロシージャの分ける基準とは?|迷わない設計ルールと実務での考え方を徹底解説

    -VBAで自動化, VBA一覧, セル・値の取得と貼り付け, 値の一部