Excelで文字列から数値のみを抽出・削除させたいときはないでしょうか。
けど、そんな中で悩むことは、
・関数やVBAで効率的に行いたいがやり方がわからない。
ですよね。
今回はそんなお悩みを解決する
・VBAで文字列から数値のみを抽出・削除する方法
についてまとめます!
もくじ
関数文字列から数値のみを抽出する
関数文字列から数値のみを抽出・削除する方法について説明をします。
方法は文字列から一文字づつ取り出し、数値か否かを判定し、抽出であれば数値と判定した値のみ出力し、削除であれば数値と判定できなかった文字のみを出力するものです。
今回のサンプルデータは以下の通り、全角文字と数字の混合と、英数字の混合のパターンで数字のみを抽出・削除していきます。
関数その1:文字列から数値のみを抽出する
MID関数で取得した文字列から1文字づつ取り出し、VALUE関数で数値かどうか判定し、数値である場合はそのままの値、数値でない場合は””を出力し、出てきた結果をTEXTJOIN関数で結合する方法となります。
サンプルではB2に数字混合の値を入力しています。
数式は以下の通りです。
出力するD2へ数式を入力します。
=TEXTJOIN("",TRUE,IF(ISERR(VALUE(MID(B2,SEQUENCE(LEN(B2)),1))),"",MID(B2,SEQUENCE(LEN(B2)),1)))
SEQUENCE関数は、連続した数値の配列を作成する関数です。
その値にLEN関数でB2の文字数を取得し、その分の配列を作成します。
B2の値は10文字ですので、10個分の配列ができる形となります。
=SEQUENCE(LEN(B2))
次に文字列から一文字づつ取得していきます。
MID関数はその名の通り取得開始位置の中間指定が可能な関数です。
以下のように指定することで抽出したい文字を指定します。
第二引数の開始位置に配列を指定すると配列の値を取得し、その値を位置番号としてB2の文字を取得し、配列数分繰り返していきます。
=MID(B2,SEQUENCE(LEN(B2)),1)
次にMID関数が取得した文字をVALUE関数で数値かどうか判定します。
=TEXTJOIN("",TRUE,IF(ISERR(VALUE(MID(B2,SEQUENCE(LEN(B2)),1))),"",MID(B2,SEQUENCE(LEN(B2)),1)))
数値でない場合はエラーが返りますので、IF関数でISERR関数にてエラー判定し、エラーである場合は””、エラー出ない場合はそのまま値を出力させます。
=IF(ISERR(VALUE(<数値判定文字>)),"",<数値判定文字>)
仕上げにTEXTJOIN関数で文字を結合していきます。
構文は以下の通りです。
サンプルでは区切り記号に空文字を指定し、空の文字は無視、という条件にしています。
=TEXTJOIN("",TRUE,<数値判定文字>1,<数値判定文字>2,・・・)
実行結果を確認してみましょう。
はい、数式のみが抽出されましたね。
そのままD3へドラッグし、2行目にも数式を提供します。
問題ありませんね。
関数その2:文字列から数値のみを削除する
次は数値のみ削除していきます。
MID関数で取得した文字列から1文字づつ取り出し、VALUE関数で数値かどうか判定し、数値である場合は””、数値でない場合はそのままの値を出力し、出てきた結果をTEXTJOIN関数で結合する方法となります。
サンプルではB4に数字混合の値を入力しています。
数式は以下の通りです。
出力するD4へ数式を入力します。
=TEXTJOIN("",TRUE,IF(ISERR(VALUE(MID(B4,SEQUENCE(LEN(B4)),1))),MID(B4,SEQUENCE(LEN(B4)),1),""))
IF関数以外の処理は抽出と同様であるため割愛します。
条件判定のIF関数ですが、
削除の時は数値である場合に””としたいので、以下のようにします。
=IF(ISERR(VALUE(<数値判定文字>)),<数値判定文字>,"")
非常にカンタンですね。
結果を確認しましょう。
サンプルデータはB5までありますので、D4からD5へドラッグし、数式をコピーします。
はい、数値のみが削除されましたね。
関数その他:全角数字が数値として判定されてしまう
今回の関数で問題がありました。
それは全角数字が半角数字と同様に数値として判定されてしまうことです。
厳密に判断するには文字コードレベルで判定する必要があります。
関数その3:半角数値を文字コードで判別し数値を抽出・削除する
半角数字「0123456789」の文字コードは48番から57番が割り当てられています。
それをCODE関数を使い対象文字の文字コードを参照し半角数値の文字コードの範囲内か確認し、数値の判定を行う方式となります。
以下判定文です。
しかしこの方法でSEQUENCE関数を使い連続処理しようとすると処理タイミングがことなるので、すべてFalseの判定となってしまいます。
ですので、ANDの構文はとりやめ、コード番号が57以下であるかという条件のみで行いたいと思います。
数式は以下の通りです。
文字コードから数値のみを抽出する数式
文字コードから数値のみを削除する数式
早速実装をして確認してみましょう。
各セルに合わせた数式は以下の通りです。
文字コードから数値のみを抽出する数式
=TEXTJOIN("",TRUE,IF(CODE(MID(B2,SEQUENCE(LEN(B2)),1))<=57,MID(B2,SEQUENCE(LEN(B2)),1),""))
文字コードから数値のみを削除する数式
=TEXTJOIN("",TRUE,IF(CODE(MID(B4,SEQUENCE(LEN(B4)),1))>57,MID(B4,SEQUENCE(LEN(B4)),1),""))
全角数字は数値判定対象から外れ、半角数値のみ判定されていることがわかりますね。
VBAで文字列から数値のみを抽出・削除する
VBAその1:文字列から数値のみを抽出する
VBAで文字列から数値のみを抽出してみましょう。
B2からB3まで入力されている値を取得し、 数値の正規表現で数値の判定を行い数値を抽出、D列へ結果を返します。
以下サンプルコードです。
Sub 文字列から数値のみを抽出する()
Dim strTemp As Variant
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim strMoji As String
Dim strMojiTemp As String
'処理対象のセルをレンジ指定します。
strTemp = Range("B2:B3")
'配列に格納された値すべてを対象に処理します。
For i = LBound(strTemp, 1) To UBound(strTemp, 1)
For j = LBound(strTemp, 2) To UBound(strTemp, 2)
For k = 1 To Len(strTemp(i, j))
strMoji = Mid(strTemp(i, j), k, 1)
If strMoji Like "[0-9]" Then
strMojiTemp = strMojiTemp & strMoji
End If
Next
Cells(i + 1, j + 3) = strMojiTemp
strMoji = ""
strMojiTemp = ""
Next
Next
End Sub
値がある対象レンジ”B2:B3″を変数に指定します。
二次元配列に格納された値すべてを対象に処理します。
For j = LBound(strTemp, 2) To UBound(strTemp, 2)
正規表現 “[0-9]”を使い数値の判定をおこない、文字数分繰り返します。
strMoji = Mid(strTemp(i, j), k, 1)
If strMoji Like “[0-9]”Then
strMojiTemp = strMojiTemp & strMoji
End If
Next
結果を対象セルへ出漁します。
文字列から数値のみを抽出できました。
VBAその2:文字列から数値のみを削除する
次にVBAで文字列から数値のみを削除してみましょう。
B3からB4まで入力されている値を取得し、 数値の正規表現で数値の判定を行い数値を抽出、D列へ結果を返します。
以下サンプルコードです。
Sub 文字列から数値のみを削除する()
Dim strTemp As Variant
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim strMoji As String
Dim strMojiTemp As String
'処理対象のセルをレンジ指定します。
strTemp = Range("B4:B5")
'配列に格納された値すべてを対象に処理します。
For i = LBound(strTemp, 1) To UBound(strTemp, 1)
For j = LBound(strTemp, 2) To UBound(strTemp, 2)
For k = 1 To Len(strTemp(i, j))
strMoji = Mid(strTemp(i, j), k, 1)
If Not strMoji Like "[0-9]" Then
strMojiTemp = strMojiTemp & strMoji
End If
Next
Cells(i + 3, j + 3) = strMojiTemp
strMoji = ""
strMojiTemp = ""
Next
Next
End Sub
値がある対象レンジ”B4:B5″を変数に指定します。
正規表現”[0-9]”で数値の判定を行い、抽出時と反対にNotで否定し、数値でない場合に値を出力するようにします。
strMojiTemp = strMojiTemp & strMoji
End If
結果を対象セルへ出漁します。
※B4から開始ですので、「i + 3」へ変更しています。
VBAを実装して実行してみましょう。
文字列から数値のみを削除できましたね。
VBAその他:全角数字が数値として判定されないか確認する
関数の時に問題があった全角数字が数値として判定されてしまう事象についてVBA版でも確認してみましょう。
サンプルデータは関数の時と同様に全角数字と半角数値、それ以外の全角文字を混合させます。
それぞれのVBAを実行すると、
問題なく全角数値は数値判定されず、半角数値のみが判定されましたね。
VBAの実装手順
実装手順は以下の通りです。
今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
VBAを実行する
では早速VBAの実行をしてみましょう。
①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。
②処理がされたことが確認できれば完了です。
※完了メッセージやステータス管理など必要に応じて実装してもらえばと思います。
さいごに
いかがでしょうか。
今回は、
・VBAで文字列から数値のみを抽出・削除する方法
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す