1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【VBA】Split関数で氏名を苗字と名前に分ける

Posted at

いつもはpythonを使用してExcelファイルの操作を勉強していまして
日々の気づきをアウトプットしているのですが
今回は、VBAでSplit関数を使を使った名前の分割についてです。

A列に名前が入力されていて、B列に苗字、C列に名前を分割して入れたい、
ということをしたいとします。

気を付けることは次の2点でしょうか。

  1. 区切り方
  2. 海外の方の名前
1.区切り方

区切り方は

  • 全角スペース
  • 半角スペース
  • セル内での改行(LF)

の4つの区切りパターンがあると思います。

2.海外の方の名前

海外の方の名前を表記する場合は、カタカナか英字など使うと思います。
また、名→姓の順で表記です。
今回はカタカナや英字の場合は、名→姓の順で表記されているとします。

InStr関数

InStr(元の文字列A, 検索する文字列B)

InStr関数は、引数Aで指定した文字列の中から、引数Bで指定した文字列を検索して、
見つかった位置を返します

InStr("ABCD", "C")
-->3

' 見つからなかった場合は「0」を返す。
InStr("ABCD", "E")
-->0

Split関数

Split(元の文字列, 区切り文字)

Split関数は、ある区切り文字で区切られた文字列を、その区切り文字で区切り、区切られた各文字列を、一次元配列として返します。

str = Split("田中,山田,武田", ",")
str(0)--> 田中
str(1)--> 山田
str(2)--> 武田

配列の要素は0から始まるところがポイントでしょうか。

正規表現

正規表現を使うためのRegExpクラスを利用したいです。

VBAの画面で「ツール」→「参照設定」でダイアログを開きます。
ライブラリファイルの中から
「Microsoft VBScript Regular Expressions 5.5」にチェックを付けると
正規表現のRegExpクラスが利用できるようになります。

コード

先ずは出来上がったコードからです。

Sub 名前分割()
    Dim v                           ' Split関数結果
    Dim s                           ' A列の分割前の氏名
    Dim r           As Range        ' 基準Rangeオブジェクト
    Dim i                           ' ループカウンタ
    Dim regKatakana As New RegExp   ' カタカナチェック用正規表現
    Dim regAlphabet As New RegExp   ' 英字チェック用正規表現
    Dim sFirstName                  ' 姓
    Dim sLastName                   ' 名
    
    ' カタカナの正規表現
    regKatakana.Pattern = "[。-゚ァ-ー]"
    regKatakana.Global = True
    ' 英字の正規表現
    regAlphabet.Pattern = "[a-zA-Z]"
    regAlphabet.Global = True
    
    ' A2セルを基準セルに設定。
    Set r = Range("A2")
    
    ' ループのカウンタを初期化
    i = 0
    
    ' A列のループ
    Do
        ' A列の現ループの行位置の氏名を取得
        s = r.Offset(i, 0).Value
        
        ' 氏名が取得できなかった場合
        If s = "" Then
            ' ここでループは終了
            Exit Do
        End If
        
        ' 各区切り文字を含んでいる場合は、その区切り文字で分割
        If (InStr(s, " ") > 0) Then
            v = Split(s, " ")
        ElseIf (InStr(s, " ") > 0) Then
            v = Split(s, " ")
        ElseIf (InStr(s, "・") > 0) Then
            v = Split(s, "・")
        ElseIf (InStr(s, vbLf) > 0) Then
            v = Split(s, vbLf)
        End If
        
        ' 正規表現で氏名がカタカナか英字だった場合
        If (regKatakana.Test(v(0)) = True And regKatakana.Test(v(1))) Or _
           (regAlphabet.Test(v(0)) = True And regAlphabet.Test(v(1))) Then
            sFirstName = v(1)   ' 苗字(A列の氏名が逆)
            sLastName = v(0)    ' 名前(A列の氏名が逆)
        Else
            sFirstName = v(0)   ' 苗字
            sLastName = v(1)    ' 名前
        End If
        
        '// B列に苗字を貼り付け
        r.Offset(i, 1).Value = sFirstName
        
        '// C列に名前を貼り付け
        r.Offset(i, 2).Value = sLastName
        
        ' 次セル用にループカウンタを加算
        i = i + 1
    Loop
End Sub

A列に氏名が複数入力されていて、それぞれの苗字をB列、名前をC列に貼り付けたいので
A列を1行ずつループして苗字と名前に分割して貼り付けるようにしてみました。

氏名がカタカナもしくは英字の場合は
苗字と名前を逆に貼り付けないといけないので
まずは正規表現を使ってカタカナまたは英字の氏名かを判定して
そうであれば苗字と名前を逆に貼り付けるようにしています。

今回は、急ぎだったのでVBAで作ったのですが
意外と忘れていて作るの時間がかかっちゃいました。

どちらにせよプログラム書いているときは時間の経過が速くてびっくりしますね。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?