Excel関数を用いてスペース(区切り文字)なしの氏名を名前と苗字(姓と名)に分ける方法

お客様や社員の情報など、仕事をする上で氏名(名前)の情報はExcelやシステムなどで何かしら管理をしているかと思います。氏名の管理の方法は色々とありますが、大きくは

  1. 姓と名を分けて管理
  2. 姓と名の間にスペースを入れて管理
  3. 姓名で管理(姓と名の間にスペースを入れない)

という大きく3つの方法が考えられます。

通常使う分には特に問題はありませんが、上記の3のように氏名を姓と名の間にスペースを入れずに管理しているような場合において

氏名を「名字」と「名前」を分けたい

ということが発生すると、少し考慮が必要になります。

2のように姓と名の間にスペースを入れてている (例えば「佐藤 太郎」)ならばスペースの前後で簡単に姓と名を分割して情報を取ることが出来ますが、姓と名の間に何も無いような場合 (例えば「佐藤太郎」) だと、そう単純にはいきません。

とはいえ、絶対にできないということは無く、Excelの関数と考え方を組み合わせれば実現することが出来ます。

今回は、姓(苗字)と名(名前)の間に区切り文字が入っていないような場合の姓と名の分割方法について、Excel関数を利用した例をご紹介します。VBAは使わずに実現できる方法なので、誰でも名字と名前の分割が可能です。

姓名(氏名)を姓と名に分ける難しさ

姓と名の間に何も区切り文字が無い場合において、なぜ分割することが簡単に出来ないのでしょうか。それは、

  • どこが苗字でどこが名前か判断がつかない
  • 名字と名前の組み合わせは無限にある
  • 似たような苗字がある

からではないでしょうか?

自分(人)が読めば名字と名前の区切りがどこかはなんとなく判断がつきます。そのため、データ量が少ないのであれば1つ1つ人の手で姓と名を分けていけばよいですが、データ量が膨大な場合、1つ1つマニュアルで分けていくのは効率的ではありません。

そんな時にパッと思いつくのが、「Excelだったらどうにか出来るんじゃない?」では無いでしょうか。

氏名を姓と名に分ける際の考え方

Excelの関数を用いてどうにかして氏名を分割することを考えた場合、次の考え方で姓と名の文字を分割することが出来ます。

  1. 名字と名前の間にスペースが入っていたり入っていなかったりが混在する場合は、 名字と名前の間のスペースを取り除く
  2. 名字を判別して氏名から切り取る
  3. 氏名から名字を取り除いた文字列を名前として取得する

ここで一番考慮が必要なのは、2の「名字を判別して 氏名から切り取る」の部分です。

名字を判別して氏名から切り取るには

名字は様々なものがあるため、例えば

REPLACE関数やSUBSTITUTE関数のような文字列置換用関数を用いて、氏名に対して1つ1つ名字を空文字に変換をかけて名前を取得する

というようなやり方も可能です。しかしこれは変換をかける名字の数が膨大であるため、非効率で現実的ではありません。

そこで役立つのが、VLOOKUP関数です。

名字のリストを作っておいてVLOOKUP関数を用いて存在チェックをかけることで、1つ1つ置換する必要がなくなります。

名字の桁数と似たような名字を考慮するには

名字は文字数が異なるため、ここも考慮が必要です。

佐藤・田中・鈴木など2文字の名字が圧倒的に多いですが、林・森・原などの1文字の名字や、勅使河原・小比類巻など珍しいものは4文字以上の名字があります。

また、原・原田・原之園などのように、同じ文字で(ここでは「原」)から始まる名字があるため、ここについても考慮が必要になります。

そこで、今回は考え方としては次のように関数で判定をしていきます。

  1. 4文字の名字リストに対してチェックを行い、一致していれば名字として切り取る
  2. 3文字の名字リストに対してチェックを行い 、一致していれば名字として切り取る
  3. 2文字の名字リストに対してチェックを行い 、一致していれば名字として切り取る
  4. 1文字の名字リストに対してチェックを行い 、一致していれば名字として切り取る

こうすることで、「原」始まりの名字の方でも、名字の判定が出来るようになります。

この考え方で実施した場合の考慮できない点

名字と名前の区切りが難しいような方の場合、きちんと姓と名で分割できない可能性があります。

例えば「片平太郎」さんという方がいた場合です。

この考え方で変換をかけると「片平」として名字を取得できます。実際は「片」が名字で「平田郎」が名前だったとしても、このように取得する事はできませんので、この点は仕方ないものとして考える必要があります。

氏名を姓と名に分ける方法

では実際にどう行うのか、サンプルをご紹介します。

名字一覧の作成

氏名から姓を抜き出すために、名字のリストを作成します。ここでは「名字一覧」というシート名で作成しています。名字は様々な種類があるためリストに載せるデータを手打ちするのも手ですが、全国名字ランキングなどのサイトに使えるデータが載っていますので、ここから持ってくるのが良いでしょう。

名字の一覧サンプル
名字一覧

合わせて、名字列の隣に文字数の列を追加します。LEN関数を使うことで文字の長さを取得することが出来ます。

文字数を計算するLEN関数のサンプル
文字数をカウント

文字数はこの後の処理で参考程度に利用します。

名字抜き出し用の列の設定

名字一覧とは別のシートに、まず以下のような項目を設定します。

氏名と名字抜き出し用列
A列~E列

氏名用の列設定(A列)

A列には氏名を、姓と名の間にスペースが入っていない状態で設定します。もしスペースが入っているようであれば、SUBSTITUTE関数でスペースを空欄に変換します。

名字候補用の列設定(B~E列)

B~E列には、それぞれ4文字・3文字・2文字・1文字名字のどれに一致するかの関数を入れます。以下はB2セルに設定している関数です。

氏名と名字の比較用関数設定
B列の数式

この関数では次のようなことを行っています。

  1. A2セル(氏名)の左から4文字をキーに、名字一覧シートからVLOOKUP関数で取得する。存在する場合は名字を表示する。
  2. 存在しない場合は#N/Aと表示されてしまうため、IFERROR関数でエラーの場合は空文字("")を表示する。

簡単に言うと、名簿一覧と名字を比較して存在すればその名字を表示させる ということをしています。B列は氏名の左4文字を名字として比較、C列は氏名の左3文字を名字として比較・・・というようなことをしています。

名字一覧のどれかに一致するものがあれば、B~E列のどれかにその名字が表示されます。例えば上記の例の場合、A2セルの「片平太郎」さんは片平または片という名字と一致していることを指しています。

参考に、B2~E2セルの数式は次の通りです。これを全行にコピペします。

B2、C2、D2、E2セルの各数式

=IFERROR(VLOOKUP(LEFT($A2,4), 名字一覧!$A$1:$A$30000,1,FALSE), "")

=IFERROR(VLOOKUP(LEFT($A2,3), 名字一覧!$A$1:$A$30000,1,FALSE), "")

=IFERROR(VLOOKUP(LEFT($A2,2), 名字一覧!$A$1:$A$30000,1,FALSE), "")

=IFERROR(VLOOKUP(LEFT($A2,1), 名字一覧!$A$1:$A$30000,1,FALSE), "")

名字抜き出し・名前抜き出し用の列の設定

次にF列~G列を追加します。ここでは、B~E列の情報を元に、名字と名前をそれぞれ抜き出していきます。名字一覧に一致しないものも考えられるため、それらが分かるように分割不可用の列も追加します。

氏名から名字・名前抜き出し用列のサンプル
名字・名前抜き出し用列(F~G列)

名字抜き出し用列の設定(F列)

名字抜き出し用の列に関数を設定します。

ここではIF関数を用いて、

B列→C列→D列→E列の順にデータを見ていき、空欄ではない場合にその名字を表示する

ということを行っています。例えば上記サンプルの2行目の場合、「片平」と「片」が名字として一致していますが、2文字名字の「片平」を名字として採用しています。

名前抜き出し用列の設定(G列)

名前抜き出し用列に関数を設定します。

ここではSUBSTITUTE関数を用いて、

A列(氏名)の中に含まれるF列(名字)を空欄に変換する

ということを行っています。名字があれば名前のみが取得できます。

分割不可の判定用列の設定(H列)

名字と名前を分割しましたが、品名一覧に名字がなくて分割できないものが中にはあるかもしれません。その行を抽出する用の列を追加します。

抜き出した名字または名前が空ならば★を表示するようにしています。

名字と名前を分割した結果のサンプル

以上のように行うことで、次のように分割されます。

まとめ

エクセル関数を駆使することで、名字と名前を分割する例をご紹介しました。

比較的よく使用するIF関数、VLOOKUP関数、SUBSTITUTE関数、IFERROR関数で実現できますので、氏名以外にも特定の項目で文字列を分離したい場合にも応用が出来ると思います。

Twitterでフォローしよう

おすすめの記事