Excelで数字混合文字列から文字だけを抽出・削除させたいときはないでしょうか。
例えば「ABC123」と値があり「ABC」や「123」だけを抜き出したいときです。
けど、そんな中で悩むことは、
・関数やVBAで効率的に行いたいがやり方がわからない。
ですよね。
今回はそんなお悩みを解決する
Excelで半角数字混合文字列から文字だけを抽出・削除する方法について
まとめます!
もくじ
関数で数字混合文字列から文字だけを抽出・削除する
関数で数字混合文字列から文字だけを抽出・削除する方法について説明をします。
方法は数字混合文字列から一文字づつ取り出し、数値か否かを判定し、抽出の時は数字以外の文字を、削除の時は数字のみを出力し、結合していきます。
今回のサンプルデータは以下の通り、漢字、ひらがな、全角カタカナ、半角英字、半角記号、半角数字混合の文字列から数字を除く文字だけを抽出・削除していきます。
半角数字以外の文字だけを抽出
半角数字以外の文字を削除
関数その1:半角記号、半角数字混合文字列から半角記号を除く文字だけを抽出する
半角記号、半角数字混合文字列から半角記号を除く文字だけを抽出していきます。
MID関数で取得した数字混合文字列から1文字づつ取り出し、CODE関数で数字かどうか判定し、数字である場合はそのままの値、数字でない場合は””を出力し、出てきた結果をTEXTJOIN関数で結合する方法となります。
数式は以下の通りです。
出力するD2へ数式を入力します。
=TEXTJOIN("",TRUE,IF(CODE(MID(B2,SEQUENCE(LEN(B2)),1))>57,MID(B2,SEQUENCE(LEN(B2)),1),""))
関数について説明します。
まず、セルに入力されている文字を一文字づつ取り出していきます。
使う関数はSEQUENCE関数で、連続した配列を作成する関数です。
その値にLEN関数でB2の文字数を取得し、その分の配列を作成します。
B2の値は23文字ですので、23個分の配列ができる形となります。
=SEQUENCE(LEN(B2))
次にMID関数を使い、抽出したい文字を指定します。
MID関数は取得開始位置の中間指定が可能な関数です。
以下のように指定することで抽出したい文字を指定します。
第二引数の開始位置に配列を指定すると配列の値を取得し、その値を位置番号として文字列の文字を取得できます。
MID関数の第二引数に「SEQUENCE(LEN(B2))」、文字数は1文字を指定します。
=MID(B2,SEQUENCE(LEN(B2)),1)
結果は以下のようになります。
次にMID関数が取得した文字をCODE関数で文字コードに変換します。
CODE(<文字>)
CODE関数とは指定した文字列の文字コード番号を返す関数です。
B2に入力されている半角数字のコード範囲は48-57となりますので、境界線を57とし、57以上であるかどうかで数字以外の文字の判定をしています。
文字の種類 | CODE範囲-開始 | CODE範囲-終わり |
半角数字 | 48 | 57 |
半角英字(大文字) | 65 | 90 |
半角英字(小文字) | 97 | 122 |
半角カタカナ | 161 | 223 |
全角数字 | 9007 | 9018 |
全角ひらがな | 9249 | 9331 |
全角カタカナ | 9505 | 9590 |
全角漢字 | 12321 | 29734 |
仕上げにTEXTJOIN関数で文字を結合していきます。
TEXTJOIN関数の構文は以下の通りです。
サンプルでは区切り記号に空文字を指定し、空の文字は無視、という条件にしています。
=TEXTJOIN("",TRUE,<判定文字>1,<判定文字>2,・・・)
実行結果を確認してみましょう。
はい、数字を除いた文字だけが抽出されましたね。
半角記号、半角数字混合文字列から半角記号を含む文字だけを抽出する
次は角記号を含む文字を抽出していきたいと思います。
数式は以下の通りで、D3へ入力します。
<code>=TEXTJOIN("",TRUE,IF(CODE(MID(B3,SEQUENCE(LEN(B3)),1))>57,MID(B3,SEQUENCE(LEN(B3)),1),IF(CODE(MID(B3,SEQUENCE(LEN(B3)),1))<48,MID(B3,SEQUENCE(LEN(B3)),1),"")))
半角記号のコード範囲は33-47となりますので、前回の条件に48より小さいコードは除外する条件を加えています。
文字の種類 | CODE範囲-開始 | CODE範囲-終わり |
半角記号 | 33 | 47 |
半角数字 | 48 | 57 |
半角記号(大文字) | 65 | 90 |
半角英字(小文字) | 97 | 122 |
半角カタカナ | 161 | 223 |
全角数字 | 9007 | 9018 |
ひらがな | 9249 | 9331 |
全角カタカナ | 9505 | 9590 |
全角漢字 | 12321 | 29734 |
結果を確認してみましょう。
半角記号が追加されましたね。
関数その2:半角記号、半角数字混合文字列から半角記号を除く文字だけを削除する
次は数字混合文字列の内、半角記号を除く文字だけを削除します。
MID関数で取得した数字混合文字列から1文字づつ取り出し、CODE関数で数字かどうか判定し、数字か記号でない場合は空白の””、数字か記号である場合はそのままの値を出力し、出てきた結果をTEXTJOIN関数で結合する方法となります。
数式は以下の通りです。
出力するD2へ数式を入力します。
=TEXTJOIN("",TRUE,IF(CODE(MID(B2,SEQUENCE(LEN(B2)),1))<=57,MID(B2,SEQUENCE(LEN(B2)),1),""))
IF関数以外の処理は抽出と同様であるため割愛します。
半角数字のコード範囲は48-57、半角記号は33-47となりますので、境界線を57とし、57以下であるかどうかで数字と記号の文字の判定をしています。
文字の種類 | CODE範囲-開始 | CODE範囲-終わり |
半角記号 | 33 | 47 |
半角数字 | 48 | 57 |
半角記号(大文字) | 65 | 90 |
半角英字(小文字) | 97 | 122 |
半角カタカナ | 161 | 223 |
全角数字 | 9007 | 9018 |
ひらがな | 9249 | 9331 |
全角カタカナ | 9505 | 9590 |
全角漢字 | 12321 | 29734 |
はい、半角記号と数字だけになりましたね。
半角記号、半角数字混合文字列から半角記号を含む文字だけを削除する
次は半角記号を含む文字を削除し、半角数値だけの結果にします。
前回の条件から48以上であれば除外する条件を追加します。
文字の種類 | CODE範囲-開始 | CODE範囲-終わり |
半角記号 | 33 | 47 |
半角数字 | 48 | 57 |
半角記号(大文字) | 65 | 90 |
半角英字(小文字) | 97 | 122 |
半角カタカナ | 161 | 223 |
全角数字 | 9007 | 9018 |
ひらがな | 9249 | 9331 |
全角カタカナ | 9505 | 9590 |
全角漢字 | 12321 | 29734 |
=TEXTJOIN("",TRUE,IF(CODE(MID(B3,SEQUENCE(LEN(B3)),1))<=57,IF(CODE(MID(B3,SEQUENCE(LEN(B3)),1))>=48,MID(B3,SEQUENCE(LEN(B3)),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 Not 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 Not strMoji Like “[0-9-/@:\]” Then
strMojiTemp = strMojiTemp & strMoji
End If
Next
半角記号も抽出する場合は、正規表現を数値のみ”[0-9]”にしてください。また半角記号で除外したいものがあれば”0-9-/@:\”の末尾に追加してください。
結果を対象セルへ出漁します。
数字混合文字列から文字だけを抽出できました。
VBAその2:数字混合文字列から文字だけを削除する
次にVBAで数字混合文字列から文字だけを削除してみましょう。
B2からB3まで入力されている値を取得し、 正規表現”[0-9]”で数字の判定を行い抽出、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″を変数に指定します。
正規表現”[0-9]”で数字の判定を行い、数値のみ出力するようにします。
strMojiTemp = strMojiTemp & strMoji
End If
結果を対象セルへ出漁します。
実装して実行してみましょう。
数字混合文字列から文字だけを削除し数字のみにできましたね。
VBAの実装手順
実装手順は以下の通りです。
今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
VBAを実行する
では早速VBAの実行をしてみましょう。
①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。
②処理がされたことが確認できれば完了です。
※完了メッセージやステータス管理など必要に応じて実装してもらえばと思います。
さいごに
いかがでしょうか。
今回は、
Excelで数字混合文字列から文字だけを抽出・削除する方法について
まとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す