Access。氏名を姓と名に分割したいけど、どうしたらいいの
<Access>
氏名フィールドに、フルネームで氏名が入力されています。
この氏名フィールドから、姓フィールドと名フィールドにデータをわけたいのですが、どのようにしたらいいのでしょうか。
考え方として、空白の前が姓で空白の後が名ですから、空白を見つけてあげる必要があります。
Excelですと、FIND関数という空白の文字を見つける関数があるのですが、AccessにはFIND関数はありません。
その代わりになるのが、InStr関数です。
InStr関数をつかって、空白を文字内から見つけることができれば、分割することは可能です。
では、早速クエリをつくっていくことにします。
作成タブのクエリデザインをつかってつくっていきます。
最初の、姓には、次の演算フィールドで対応しました。
姓: Left([氏名],InStr(1,[氏名]," ")-1)
この演算フィールドで使用されている関数は、
Left関数。
文字列の左側から指定の文字数を抽出する関数です。
Excelでもお馴染みですね。
Left関数の引数ですが、最初の引数は、文字列なので、氏名フィールドです。
2つ目の引数が、文字数です。文字数は、空白の前までです。
ExcelだとFIND関数をつかうのですが、Accessでは、InStr関数をつかって、空白を見つけます。
InStr(1,[氏名]," ")
「" "」と半角空白にしていますが、これで全角空白にも対応することができます。
InStr関数の最初の引数は、省略可能ですが、開始位置です。
最後に「-1」しているのは、見つけた空白の位置よりも一文字少ないのが姓だからです。
つづいて、名ですが、
Replace関数を使う方法もありますが、今回は、Right関数という右側から指定の文字数分を抽出するようにします。
名: Right([氏名],Len([氏名])-Len([姓])-1)
Right関数の最初の引数は、文字列なので、氏名フィールドを設定します。
2つ目の引数は、右端からの文字数です。
この右端からの文字数を求めるのに、全体の文字数を求める必要があります。
全体の文字列数を求めるには、Len関数を使います。
そして、空白を見つけてもいいのですが、すでに、姓を見つけていますので、その文字数を減算し、さらに空白文字分の「-1」を追加した数式、
名: Right([氏名],Len([氏名])-Len([姓])-1)
とすることで、名を抽出することができます。
では、実行してみましょう。
姓と名に分割することができました。
1件目は、半角の空白、2件目は、全角の空白で区切られていますが、半角・全角に関わらず、分割されています。
ただし、空白が無い3件目のデータは、空白が見つけられないので、エラーがでます。
空白が無い場合という判断も、データによっては必要になります。