Excelで文字列から漢字のみを抽出・削除する方法!関数他、VBAで一括処理も!

Excelで文字列から漢字のみを抽出・削除させたいときはないでしょうか。

けど、そんな中で悩むことは、

・Excelで文字列から漢字のみを抽出・削除するやり方がわからない。
・関数やVBAで効率的に行いたいがやり方がわからない。

ですよね。

今回はそんなお悩みを解決する

・関数で文字列から漢字のみを抽出・削除する方法
・VBAで文字列から漢字のみを抽出・削除する方法

についてまとめます!

関数で文字列から漢字のみを抽出・削除する

関数文字列から漢字のみを抽出・削除する方法について説明をします。
方法は文字列から一文字づつ取り出し、漢字か否かを判定し、抽出であれば漢字と判定した値のみ出力し、削除であれば漢字と判定できなかった文字のみを出力するものです。

今回のサンプルデータは以下の通り、各全角文字、半角カタカナの混合のパターンで漢字のみを抽出・削除していきます。

漢字のみ抽出

漢字を削除

関数その1:文字列から漢字のみを抽出する

MID関数で取得した文字列から1文字づつ取り出し、CODE関数で漢字かどうか判定し、漢字である場合はそのままの値、漢字でない場合は””を出力し、出てきた結果をTEXTJOIN関数で結合する方法となります。

全角カタカナと漢字を判別し漢字のみ抽出する

サンプルではB2に全角カタカナと漢字の文字混合の値を入力しています。

数式は以下の通りです。
出力するD2へ数式を入力します。

=TEXTJOIN("",TRUE,IF(CODE(MID(B2,SEQUENCE(LEN(B2)),1))>=12321,MID(B2,SEQUENCE(LEN(B2)),1),""))

関数について説明します。

まず、セルに入力されている文字を一文字づつ取り出していきます。

使う関数はSEQUENCE関数で、連続した配列を作成する関数です。
その値にLEN関数でB2の文字数を取得し、その分の配列を作成します。

B2の値は10文字ですので、10個分の配列ができる形となります。

=SEQUENCE(LEN(B2))

 

次にMID関数を使い、抽出したい文字を指定します。
MID関数は取得開始位置の中間指定が可能な関数です。

以下のように指定することで抽出したい文字を指定します。

MID(文字列, 開始位置, 文字数)

第二引数の開始位置に配列を指定すると配列の値を取得し、その値を位置番号として文字列の文字を取得できます。

MID関数の第二引数に「SEQUENCE(LEN(B2))」、文字数は1文字を指定します。

=MID(B2,SEQUENCE(LEN(B2)),1)

結果は以下のようになります。

タカヒロ
タカヒロ
セルの文字列が各配列に一文字づつ入力されてた形となります。

次にMID関数が取得した文字をCODE関数で文字コードに変換します。

CODE(<文字>)

CODE関数とは指定した文字列の文字コード番号を返す関数です。

タカヒロ
タカヒロ
通常文字コード進数は16進数となりますが、CODE関数のコード番号は10進数となりますのでご注意ください。

漢字の文字コード番号は9249-9331となりますので、取得した文字が文字コードの範囲内かどうかで判定していきます。

B2に入力されている全角カタカナのコード範囲は12321-29734となりますので、境界線を12321とし、12321以上であるかどうかで漢字の判定をしています。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
全角ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

仕上げにTEXTJOIN関数で文字を結合していきます。

TEXTJOIN関数の構文は以下の通りです。

TEXTJOIN (区切り記号, 空の文字列を無視するかどうか, 結合する文字1,・・・,文字列252)

サンプルでは区切り記号に空文字を指定し、空の文字は無視、という条件にしています。

=TEXTJOIN("",TRUE,<漢字判定文字>1,<漢字判定文字>2,・・・)

実行結果を確認してみましょう。

はい、漢字のみが抽出されましたね。

全角カタカナと漢字を判別し漢字のみ抽出する

そのままD3へドラッグし、2行目にも数式をコピーしましょう。

次は全角カタカナと漢字の混合となります。

全角カタカナのコード範囲は9505~9590となりますので、前回の条件である12321以上のみでそのままマッチすることになります。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

問題ありませんね。

半角カタカナと漢字を判別し漢字のみ抽出する

D4へ数式をドラッグしましょう。

今度は半角カタカナでコード範囲は161-223となりますので、前回の条件である12321以上のみでそのままマッチすることになります。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

問題ありませんね。

 

半角英字と漢字を判別し漢字のみ抽出する

次は半角英字との混合文字の判定となります。

半角英字のコード範囲は65-122ですので、

前回の条件である12321以上のみでそのままマッチすることになります。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

問題ありませんね。

半角数字と漢字を判別し漢字のみ抽出する

D6へ数式をドラッグしましょう。

最後は半角数字、漢字の混合文字から漢字のみを抽出します。

半角英字のコード範囲は48-57ですので、

前回の条件である12321以上のみでそのままマッチすることになります。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

問題ありませんね。

関数その2:文字列から漢字のみを削除する

次は文字列の内、漢字のみを削除します。

MID関数で取得した文字列から1文字づつ取り出し、CODE関数で漢字かどうか判定し、漢字である場合は空白の””、漢字でない場合はそのままの値を出力し、出てきた結果をTEXTJOIN関数で結合する方法となります。

ひらがなと漢字を判別し漢字のみ削除する

サンプルでは抽出と同じくB2にひらがなと漢字の文字混合の値を入力しています。

数式は以下の通りです。
出力するD2へ数式を入力します。

=TEXTJOIN("",TRUE,IF(CODE(MID(B2,SEQUENCE(LEN(B2)),1))<12321,MID(B2,SEQUENCE(LEN(B2)),1),""))

IF関数以外の処理は抽出と同様であるため割愛します。

条件判定のIF関数ですが、各文字コード判定の不等号を反転させ、抽出時と反対の条件(漢字である場合から漢字でない場合)にし、漢字以外の文字を抽出することにより削除を行っていきます。

漢字のコード範囲は12321-29734となりますので、境界線を12321とし、12321より小さい場合抽出する条件にすることによりひらがなを除いた漢字だけが抽出されるようにしています。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

結果を確認しましょう。

はい、ひらがなが削除され漢字のみになりましたね。

 

全角カタカナと漢字を判別し漢字のみ削除する

そのままD3へドラッグし、2行目にも数式をコピーしましょう。

次は漢字と漢字の混合となります。

全角カタカナのコード範囲は9505~9590となりますので、前回の条件(12321より小さい)がそのままマッチすることになります。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

問題ありませんね。

半角カタカナと漢字を判別し漢字のみ削除する

D4へ数式をドラッグしましょう。

今度は半角カタカナの混合でコードの範囲は161-223となりますので、前回の条件(12321より小さい)がそのままマッチすることになります。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

問題ありませんね。

半角英字と漢字を判別し漢字のみ削除する

D5へ数式をドラッグしましょう。

今度は英字との混合でコード範囲は65-122となりますので、前回と同じ条件でマッチすることになります。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

できましたね。

半角数字と漢字を判別し漢字のみ削除する

D6へ数式をドラッグしましょう。

最後は半角数字と漢字の混合文字になります。

コード範囲は48-57となりますので、前回と同じ条件でマッチすることになります。

文字の種類 CODE範囲-開始 CODE範囲-終わり
半角数字 48 57
半角英字(大文字) 65 90
半角英字(小文字) 97 122
半角カタカナ 161 223
全角数字 9007 9018
ひらがな 9249 9331
全角カタカナ 9505 9590
全角漢字 12321 29734

問題ありませんね。

VBAで文字列から漢字のみを抽出・削除する

VBAその1:文字列から漢字のみを抽出する

VBAで文字列から漢字のみを抽出してみましょう。

B2からB6まで入力されている値を取得し、漢字の正規表現”[亜-熙一-龠々]”で判定を行い漢字を抽出、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:B6")

'配列に格納された値すべてを対象に処理します。
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 "[亜-熙一-龠々]" Then
                strMojiTemp = strMojiTemp & strMoji
            End If
        Next
    
    Cells(i + 1, j + 3) = strMojiTemp

    strMoji = ""
    strMojiTemp = ""
         
    Next
Next

End Sub

値がある対象レンジ”B2:B6″を変数に指定します。

strTemp = Range(“B2:B6”)

二次元配列に格納された値すべてを対象に処理します。

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 “[亜-熙一-龠々]” Then
strMojiTemp = strMojiTemp & strMoji
End If
Next

タカヒロ
タカヒロ

コード番号の分布に従うと、漢字の正規表現”[亜-熙]”が考えられますが、この場合ですと以下のような結果となります。

ですので、抜けている部分の[一-龠]を追加し、さらに全角記号に位置する「々」を追加しています。

結果を対象セルへ出漁します。

Cells(i + 1, j + 3) = strMojiTemp

文字列から漢字のみを抽出できました。

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("B2:B6")

'配列に格納された値すべてを対象に処理します。
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 "[亜-熙一-龠々]" Then
                strMojiTemp = strMojiTemp & strMoji
            End If
        Next
    
    Cells(i + 1, j + 3) = strMojiTemp

    strMoji = ""
    strMojiTemp = ""
         
    Next
Next

End Sub

値がある対象レンジ”B4:B5″を変数に指定します。
strTemp = Range(“B4:B5”)

正規表現”[亜-熙一-龠々]”で漢字の判定を行い、抽出時と反対にNotで否定し、漢字でない場合に値を出力するようにします。

If Not strMoji Like “[亜-熙一-龠々]” Then
strMojiTemp = strMojiTemp & strMoji
End If

結果を対象セルへ出漁します。
※B4から開始ですので、「i + 3」へ変更しています。

Cells(i + 3, j + 3) = strMojiTemp

実装して実行してみましょう。

文字列から漢字のみを削除できましたね。

VBAの実装手順

実装手順は以下の通りです。

今回はExcel側にこのVBAを実装します。

①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。

VBAを実行する

では早速VBAの実行をしてみましょう。

①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。

②処理がされたことが確認できれば完了です。
※完了メッセージやステータス管理など必要に応じて実装してもらえばと思います。

さいごに

いかがでしょうか。

今回は、

・関数で文字列から漢字のみを抽出する方法
・VBAで文字列から漢字のみを抽出・削除する方法

についてまとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。








4 件のコメント

  • ご返信ありがとうこざいます。
    問題の数式を用いて「英文+吉田」のセルを参照したときに「田」と返ってきます。
    それ以外の漢字の組み合わせについては問題なく漢字のみ抽出されています。
    ちなみにですがMicrosoft365のweb版Excelを用いています。

    • ご連絡ありがとうございます。

      Web版のブラウザ経由ですと複雑な数式は正常に動かない場合があり、
      大変恐縮ですが、サポート外とさせていただいております。
      お手数ですが、デスクトップ版にてご確認いただきたくおねがいいたします。

  • 本記事非常にご参考になりました。ありがとうございます。

    一点質問なのですが
    本記事の「関数その1:文字列から漢字のみを抽出する」を用いた際に
    「吉」と言う漢字が抽出されません。
    「吉」のCODEは13640なので数式に誤りはないと思うのですが…
    大変お手数おかけしますが
    何かわかることがあればご教示お願いします。

    • いつもご利用ありがとうございます。

      「吉」が抽出されない件につきまして、数式内のセルの指定が誤っている可能性がありますので、
      ご確認いただけますでしょうか。
      ※サンプルではB2セルの指定となっております。
      また「吉」以外の漢字が抽出されるか否か確認をお願いします。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です