- Excelで文字列先頭の数字部分を数値化するには、Value関数、Left関数、IfError関数を組み合わせます。
- 数字部分がどんな桁数でも対応できるようにするにはVBAを使用したカスタム関数が有効です。
=IFERROR(VALUE(LEFT(B4,4)), VALUE(LEFT(B4,3)))
1. 文字列先頭の数字を取り出したい
IDと名前が組み合わさった文字列があります。
そのID部分だけを抽出し、数値として取得したいです。
- 入力: 104田中 → 出力: 104
- 入力: 1234斉藤 → 出力: 1234
- 入力される文字列は “数字 + 文字” の形式です
(例:「104田中」「1234斉藤」)。 - 名前の文字数やIDの桁数が様々なケースでも、エラーが発生しないようにしてください。
1-1. Value関数とLeft関数
ExcelではValue関数を使って文字列を数値にできます。
ただし、Value関数は文字列に数値以外の文字が含まれているとエラー(#VALUE!)になってしまいます1。
そこで、まずは、Left関数を使って数値部分を切り出します。
=Value(Left(B4, 3))
B4セルに "104田中"
が入力されていれば、
まず Left関数で "104"
にしてから Value関数の結果 104
を出すわけです。
2. IfError関数で場合分けする
ところが、IDの桁数が揃わない場合にうまくいきません。
LEFTの文字数を3にすると 4桁の数字がおかしくなりますし、4にすると 3桁の数字がエラーになります。
そこで、IfError関数を使います。
たとえば、3桁と4桁だけなら、以下のような数式にします。
=IFERROR(VALUE(LEFT(B4,4)), VALUE(LEFT(B4,3)))
まず 4桁とみなしてValue関数で数値を求めます。
3桁の場合はそこでエラーになるので、今度は Left関数で3桁分にして数値化します。
2-1. 桁数の分だけIfError関数を入れ子にする
もう少し一般化してみます。
もし、最大の桁数が 5桁なら、もう少しIfError関数を重ねていきます。
=IFERROR(VALUE(LEFT(B4,5)), IFERROR(VALUE(LEFT(B4,4)), IFERROR(VALUE(LEFT(B4,3)), IFERROR(VALUE(LEFT(B4,2)), VALUE(LEFT(B4,1))))))
桁数が増えるほど式は複雑になりますが、会員番号などの場合はこれで十分なことが多いです。
3. カスタム関数で解決する方法(Excel VBA)
もっとスマートな解答はないの?
Excel VBAが利用できる環境なら、どの桁数にも対応できる方法があります。
VBAでカスタム関数を作れば、このような長い数式を使わずに済みます。
Function ExtractID(inputString As String) As Long
Dim i As Integer
Dim idPart As String
' 文字列の先頭から順に数字かどうかをチェック
For i = 1 To Len(inputString)
If Not IsNumeric(Mid(inputString, i, 1)) Then
Exit For
End If
idPart = idPart & Mid(inputString, i, 1)
Next i
' 抽出したID部分を数値に変換して返す
If idPart <> "" Then
ExtractID = CLng(idPart)
Else
ExtractID = 0 ' IDが見つからない場合は0を返す
End If
End Function
このコードをExcelのVBAエディタに貼り付ければ、そのブックでカスタム関数を使えるようになります。
- Alt + F11 でVBAエディタを開きます。
- 挿入 > モジュール を選択し、新しいモジュールにコードを貼り付けます。
あとは、Excelシート上のセルに以下のように入力します。
=ExtractID(B4)
3-1. 文字列内の数字の位置が先頭に限定しない場合のカスタム関数
文字列から数字だけを抽出して数値化するカスタム関数を作ることもできます。
文字列内のすべての数字を抽出し、それらを連結して1つの数値として返します。
Function ExtractNumbers(inputString As String) As Double
Dim i As Integer
Dim numberPart As String
' 文字列内のすべての数字を抽出
For i = 1 To Len(inputString)
If IsNumeric(Mid(inputString, i, 1)) Then
numberPart = numberPart & Mid(inputString, i, 1)
End If
Next i
' 抽出した数字を数値に変換して返す
If numberPart <> "" Then
ExtractNumbers = CDbl(numberPart)
Else
ExtractNumbers = 0 ' 数字が見つからない場合は0を返す
End If
End Function
カスタム関数は文字列を入力して数値を返します。
=ExtractNumbers(A1)
たとえば、
セルに “テスト100円” と入力 → 関数の結果: 100
セルに “abc123def456” と入力 → 関数の結果: 123456
(補足)
- #VALUE は、”入力した数式に問題があるか、参照先のセルに問題があります” と Excel が伝えていることを意味します。 – エラー値 #VALUE! を修正する – Microsoft サポート