和風スパゲティのレシピ

日本語でコーディングするExcelVBA

文字列の中にある数字を抽出する関数

指定の文字列から数字だけを抜き出す汎用関数を紹介します。


Aパターン:文字列内の数字を全部を取ってくる

123みかん456りんご789123456789


Bパターン:文字列内で最初に登場した数値部分を取ってくる

1,100(10%)1,100


↑の2パターンがありますので、目的にあった方をご覧ください。


お忙しい方は、ソースコードをコピーして、使い方のように呼び出すだけでOKです。
コードをしっかり読みたい方は、解説をどうぞ。

文字列内に登場する数字を全部を取ってくる関数

ソースコード

' 123みかん456りんご789 ⇒ 123456789
Function 文字列からすべての数字を取り出す(ByVal 元の文字列 As String) As String
    
    ' 全角を半角にして日本語の1、2、…も拾う
    元の文字列 = StrConv(元の文字列, vbNarrow)
    
    ' 元の文字列を1文字ごとに数値か判定して返り値に取込
    Dim 取り出す数値テキスト As String: 取り出す数値テキスト = ""
    Dim 第n文字 As String
    Dim n As Long
    For n = 1 To Len(元の文字列)
        第n文字 = Mid(元の文字列, n, 1)

        ' 数値であれば返り値に追加
        If 第n文字 Like "[0-9]" Then
            取り出す数値テキスト = 取り出す数値テキスト & 第n文字
        End If
        
    Next ' 1文字ずつ判定

    文字列からすべての数字を取り出す = 取り出す数値テキスト
End Function

使い方

文字列からすべての数字を取り出す("123みかん456りんご789") ' ← "123456789" が返る

文字列内で最初に登場した数値部分を取ってくる関数

ソースコード

' 1,100円(税10%) ⇒ 1,100
Function 文字列から最初に登場した数値部分を取り出す(ByVal 元の文字列 As String) As String

    ' 全角を半角にして日本語の1、2、…も拾う
    元の文字列 = StrConv(元の文字列, vbNarrow)

    ' 元の文字列を1文字ごとに数値か判定して返り値に取込
    Dim 取り出す数値テキスト As String: 取り出す数値テキスト = ""
    Dim is数字が登場済 As Boolean: is数字が登場済 = False
    Dim 第n文字 As String
    Dim n As Long
    For n = 1 To Len(元の文字列)
        第n文字 = Mid(元の文字列, n, 1)
        
        ' 数字であれば返り値に加える
        If 第n文字 Like "[0-9]" Then
            取り出す数値テキスト = 取り出す数値テキスト & 第n文字
            is数字が登場済 = True
        
        ' 第1数字登場後であれば、カンマ、小数点も返り値に加える
        ElseIf is数字が登場済 And (第n文字 = "." Or 第n文字 = ",") Then
            取り出す数値テキスト = 取り出す数値テキスト & 第n文字

        
        ' 第1数字登場後に数字以外が来たらExit
        ElseIf is数字が登場済 Then
            Exit For
        End If
        
    Next ' 1文字ずつ判定
    
    ' 完成テキストが数値の場合のみ返す(1.2.3のような複数の小数点があった場合は""を返す)
    If IsNumeric(取り出す数値テキスト) Then
        文字列から最初に登場した数値部分を取り出す = 取り出す数値テキスト
    End If
    
End Function

使い方

文字列から最初に登場した数値部分を取り出す("1,100円(税10%)") ' ← "1,100" が返る

解説

最初に注意事項ですが、両方の関数とも、数字を取り出しつつもString型で返します。

これは、LongやDoubleを返り値にしようとすると、どうしても0は必ず返るため、
「0があった」のか、「数字は無かった」のかが判定できなくなるためです。

""が返ったら数字なし、0が返ったら0が文字列内にあったと解釈してください。


いずれの場合も、IsNumericがFalseになってしまうような文字列は返しませんので、

Dim Long型の変数 as Long
Long型の変数 = 文字列の内部から最初に登場した数値を取り出す("○○")

こうやってLongの変数に直接代入しても、これがエラーになることはありません。
※ もちろん桁が多すぎればオーバーフローは起こしますが


処理の中身については、
「元の文字列を1文字ずつ判定して、数字なら返り値に加えていく」だけです。

特別な関数などは使用しておりませんので、ここでズラズラ解説を書くより、
コメントを追いながらコードを読むほうがわかりやすそうですね。

If 第n文字 Like "[0-9]" Then

↑の部分を初めて見る方は、「Like演算子」でお勉強してください。


なお、Aパターンの「数字をすべて取ってくる」バージョンの関数は、

If 第n文字 Like "[0-9]" Then

↑これを

If 第n文字 Like "[0-9]" Or 第n文字 = "-" Then

↑こう書き替えることで、住所から「12-3-4」を取ってくるなど、
取ってくるテキストをアレンジできます。

というか、Likeの部分を書き換えれば、
数字に限らず好きな文字を取ってくる関数にアレンジできます。

活用してみてください。