EXCEL: 同一セルの「姓名」→「姓」と「名」に分ける方法【VBAマクロ】

VBAマクロを勉強し始めて、1ヶ月が経過しました。
ちょっとずつコードの意味も理解できるようになり、日々楽しく勉強を続けています。
さて、今回は、同一セルに入った苗字と名前を、それぞれ別のセルに分けるマクロを書きました。
下記のように、全角スペースや半角スペースで分けられた姓名を分離することができます。

概要



何行あってもいいように、最終行を取得し、2行目から最終行までの繰り返しにより順次処理していく流れです。
処理の内容としては、If文を使い、全角スペース・半角スペース・改行の場合にそれぞれ姓と名を分ける作業を書いています。

コード【VBAマクロ】

  1. Sub SplitName()
  2.     Dim i As Long
  3.     Dim maxrow As Long
  4.     maxrow = Cells(Rows.Count, 1).End(xlUp).Row
  5.     For i = 2 To maxrow
  6.         Cells(i, 1) = Application.WorksheetFunction.Trim(Cells(i, 1))
  7.         '半角スペースが連続で2つ入っていた場合、半角スペースを1つ削除する
  8.         If InStr(Cells(i, 1), " ") > 0 Then '全角スペース
  9.         Cells(i, 2) = Split(Cells(i, 1), " ")(0)
  10.         Cells(i, 3) = Split(Cells(i, 1), " ")(1)
  11.         ElseIf InStr(Cells(i, 1), " ") > 0 Then '半角スペース
  12.         Cells(i, 2) = Split(Cells(i, 1), " ")(0)
  13.         Cells(i, 3) = Split(Cells(i, 1), " ")(1)
  14.         ElseIf InStr(Cells(i, 1), vbLf) > 0 Then '改行
  15.         Cells(i, 2) = Split(Cells(i, 1), vbLf)(0)
  16.         Cells(i, 3) = Split(Cells(i, 1), vbLf)(1)
  17.         End If
  18.     Next i
  19. End Sub







コード【VBAマクロ】の解説

1.
マクロの名前です。適当な名前でOKです。
2.
行番号を取得するので、iという変数を定義します。
3-4.
最後の行の取得です。下から数えていき、値が入っている最終行をmaxrowとしています。
5.
2行目から最終行までの繰り返しです。
6-7.
姓と名の間に、半角スペースx2が入っている場合は、下記のプログラムで分離できないので、あらかじめ半角スペースを1つ削除しておきます。
8-10.
InStr関数で、検索対象の文字列 Cells(i, 1) の中から、” ”(全角スペース)を検索します。
返し値は、” ”(全角スペース)が何番目にあるかなので、A2の例の場合、3です。
If文で、3>0となるので、11-12行目のコードを実行します。
Split関数で、検索対象の文字列 Cells(i, 1) を、” ”(全角スペース)で区切ります。
区切られた配列の最初が0(姓)、次の配列が1(名)となるので、Cells(i, 2)には0の配列を、Cells(i, 3)には1の配列を入れます。
11-13.
10-12で行った内容と同じです。半角スペースに対する処理です。
14-16.
10-12で行った内容と同じです。改行に対する処理です。

とりあえず作ってみたプログラミングですが、仕事でたまに使う機会もあり、活躍してくれています。
ただ、海外の方の名前だと、名前+姓の順番なので、アルファベットの時だけ、入れるセルを逆にするなどの処理が必要ですね。