エクセルで【スペースで分かれていない文字列から】苗字だけを抜き出す

住所から都道府県だけを抜き出したり、名前から苗字だけを抜き出したりと、表「計算」ソフトではあってもデータベースのように使われることの多いエクセル。
今回は、「苗字だけを抜き出す」ことを目的としますが、それ自体はGoogleで検索すれば山のようにやり方が出て来ます。

問題は

 

そう、最初から都合よく苗字と名前の間に半角または全角でスペースが入っている場合を想定していることです。
確かにそのケースが多いかもしれませんが、では「スペースのないひと繋がりの文字列から、苗字だけを抜き出すことはできないのか」。
レアケースかもしれませんが、そういった状況だってあるでしょう。
今回はそこを最終の目的としていきましょう。

フラッシュフィル

まずはネットでよく見かけるやり方その1です。
最初の人名だけ手作業で苗字を直接入力し、後は全部フラッシュフィルで最初に苗字だけ入力したセルと同じ作業をエクセルに自動でやってもらおう、というやり方ですね。
方法はとても簡単で、

 

苗字だけ表示したい最初のセルに、手作業で苗字を入力します。
アクティブセルは一つ下になっていると思います。そこから下、名前が入っている行全てに先ほど行った「苗字だけ入力」を適用させたいので、選択セルの位置はそのままにしておいてください。
そうしたら、メニューから「データ」を選んでリボンをデータメニュー表示にしましょう。
その中に「フラッシュフィル」というのがありますので、そちらをクリック。

が、実はこれは
「A列に入っているデータの空欄部分までの文字列を入力する」
という、最初に自分が手作業で行ったことをエクセルが覚えて、同じ作業をしてくれたものに過ぎません。
そのため今回の目的である、最終的に「空欄が入っていない=区切りがわからない」場合は使えないのです。
とは言え、まずは基本ですから次の方法を見てみます。

Left関数とFind関数を使う

フラッシュフィルはセルの中身を見ればわかりますが、コピーされた部分は全て「値」として入っています。
それはそれで便利ですが、「もしかしたらA列の入力内容(氏名)を変更するかも」という場合は、値ではなく数式で入れておいた方が変更が自動で更新されるので便利ですね。
次に見ていくのはこういった場合のために「関数で」苗字を抽出する方法です。

使う関数は、

Left関数=指定したセルに入っている文字列の左からn番目の文字までを抜き出す
と、

Find関数=指定したセルに入っている文字列に、指定した文字が何番目に入っているかを調べる
です。

関数を入れていく前に、事前準備として図のように氏名の間の空欄をコピーしておきましょう。

それでは実際に関数を入力していきます。
A2セルに入っている「太宰 治」から、「太宰」を抽出します。
「太宰 治」だけなら左から二番目までの文字を抽出する、で良いですが他にも「江戸川」や「森」など抽出したい文字が一番目だけや三番目までと言った場合もありますので、

=Left(A2,2)

というように、A2セルの2番目の文字までを抽出と簡単に指定するわけにいきません。
そのため、2番目をn番目とするためにFind関数を使います。

一息に入力されるとわかりずらいですが、

①LEFT=左から
②A2=このセルの
③FIND=FIND番目

の文字までを抜き出す、がLeft関数の内容で、

①FIND=見つける
②”__”=空欄を
③A2=このセルの内容から
Find関数の内容です。

入力した結果は、

 

このように、先ほどフラッシュフィルで入れたものと同じ表示になりました。
後はA2セルをオートフィルして、苗字を表示したい行までコピーします。

 

目に見える結果としては、フラッシュフィルも関数も同じです。
違いは先ほど述べたように、値として格納される(フラッシュフィル)か、関数として格納されるかです。
データとしてコピーしやすいようにしたいなら値で、いつかA列の氏名を変更するかもしれないなら関数で、と使い分けましょう。

間に空欄がない氏名から抽出する

さて、いよいよ今回の主題です。
空欄や中黒(・)などで苗字と名前の間が区切られているなら、今まで見たようにやり方は簡単です。
ですが、区切りが見分けられない場合はどうしたら良いのか。

 

結論から言えば・・・

ど う し よ う もありません。

エクセルは人工知能ではありませんので、「あ、これはここまでが苗字だな」と判断してくれません。
あくまでも空白や中黒で苗字と名前の間の区切りを見分けるだけなので、それがない場合に苗字だけ抜粋しろと言われても無理なわけです。
実際にやってみると、

フラッシュフィルではこうなりますし、Left関数Find関数を使おうにも、「” “」のようにFind関数で「ここ(空白)までの文字数を数える」の「ここ」を指定できませんので、手の打ちようがないですね。

とは言え、それで終わってしまっては今回の記事は何のためにあったんだ、ということになりますので。
ここは力技で解決しましょう。

データベースを作り、該当する苗字があるかチェックする

方法としては、
①苗字のデータベースを作る
②A列の氏名から一文字〜四文字(場合によっては五文字)を抜き出し、データベースと照合する
③まず四文字をチェック
④あればその四文字は苗字として妥当なものと判断
⑤なければ次に三文字をチェック



と、苗字として珍しい四文字(文字数が多い)から順にチェックし、データベースに存在する文字列と適合するならそれを表示、そうでないなら文字数を減らして再検索と続けていきます。

ですので、まずやる作業はデータベース作りです。

 

有料ならいくらでも手に入りますが、どうしても無料で、ということならATOKやIMEの人名辞書から引っ張ってくるという方法があります。
※今回の主題ではありませんので、ご自分で調べてください。

苗字一覧を作ったら、後で関数を入力する時に面倒臭くないよう苗字一覧に名前をつけておきます。
「この範囲から」を、毎回「sheet1!A1:A11276」とか入力するの面倒じゃないですか。
だから「sheet1!A1:A11276」を「list」という名前のテーブルとしてエクセルに登録しておこうということです。
作業はとても簡単。

 

名前をつけたい範囲を選んで、左上にあるセル位置を表示する窓の部分に付けたい名前を入力するだけ。
これで「苗字一覧データベース」を「list」という名前にできました。

Iferror関数とVlookup関数を使う

いよいよ本作業です。
まず最終的にどうなるかを見てください。

 

こうなります。
と言われても見るだけで面倒くさいですね。
なので、最初に行う「四文字の苗字に該当するかどうか」だけを抜粋して確認してみましょう。

つまり、

Iferror=ここから先、エラーになるかどうか判断するよ
vlookup=どこの何を見るか指定するよ

と指示を出し、

A2=A2セルの
left=左から、
4=四文字を取り出して、

list=listデータベースの左端を上から下まで検索してみて、
1=適合したらその一列目を表示
“”=適合しなかったら空欄にしておく

という関数になります。
もちろん、「太宰治」の左から四文字は「太宰治+α」ですので、listにある日本の苗字一覧にはありません。いやあるのかな?ないですよね、普通。

エラーだったら次、それもエラーなら次、とネストしていく

この、「四文字検索してなかったら(エラーだった場合)空欄」の「エラーだった場合」の「空欄にする」を、「三文字を検索する」にします。

 

三文字は「太宰治」ですから、やっぱり苗字一覧にはありません。
だから結果は「エラーだった場合」のものです。

 

三文字検索して「エラーだった場合」の「空欄にする(””)」を「二文字を検索する」に変えます。

 

二文字は「太宰」ですので、苗字一覧にありました。
結果、空欄や中黒で区切られていない名前の文字列から、苗字だけを関数で抜粋することに成功です。

 

太宰治は成功しました(なんだか変な日本語ですね……)が、森鴎外など一文字の場合もありますので、ここで気を抜かず最後の作業をしてしまいましょう。
二文字検索しても「エラーだった場合は空欄(””)」の空欄部分を、「一文字で検索する」に変えます。

 

これにて成功、「空欄、スペースで区切られていないデータから、苗字だけを抽出する」作業が完成しました。

ネットで調べてもわからなければAkrosへ

ネットにはたくさんの情報があります。
エクセルで困ったことを、ネットで調べて解決できたという経験がある方も多いでしょう。
でも、全ての情報があるわけではありません。

どうしても解決できないぞ、という場合はAkrosへ。あ、さすがに「不具合を解消してくれ」というのは無料ではありません。
Web業界に転職したい、でも業界についてよくわからないしどういった勉強をしたらどうなれるのかも知りたい、という方はAkrosの無料カウンセリングにお申し込み下さい。疑問や不安がなくなるまで何時間でも相談に乗りますよ。

一緒に解決する

無料カウンセリングで相談する