[Access 2016/2013/2010/2007]
「氏」と「名」の間にスペース(空白)が入力されている[氏名]フィールドのデータから、「氏」と「名」を取り出してみましょう。スペースの位置を正しく求めることがポイントです。
目次
手順ダイジェスト
氏: Left([氏名],InStr([氏名]," ")-1)
名: Mid([氏名],InStr([氏名]," ")+1)
手順解説
Step1.InStr関数でスペースの位置を確認する
氏名を分解する準備として、スペースが氏名の何文字目にあるのかを求める方法を理解しておきましょう。InStr関数は、[検索文字列]が[文字列]の何文字目にあるかを調べる関数です(構文1、正式な構文はInStr関数のページを参照してください)。
構文1 文字列から検索文字列を探す
InStr(文字列, 検索文字列)
スペースが[氏名]の何文字目にあるかを調べるには、InStr関数の引数[文字列]に[氏名]フィールド、[検索文字列]にスペース「" "」を指定します(式1、図1)。「小田島□健二」の場合は「4」、「鈴木□佳穂子」の場合は「3」という具合にスペースの位置が返されます(図2)。
式1 スペースが[氏名]の何文字目にあるかを調べる
空白位置: InStr([氏名]," ")
メモ
式1では、第2引数「" "」内のスペースが全角と半角のどちらの場合でも、全角と半角を区別せずにスペースの位置が求められます。もし、「全角スペースの位置だけを求めたい」という場合は、
全角空白位置: InStr(1,[氏名]," ",0)
と式を立てます。その際、第3引数「" "」内のスペースは必ず全角スペースにしてください。第1引数の「1」は検索開始位置を表し、第4引数の「0」はバイナリモードで比較するための指定です。第1引数と第4引数について、詳しくはInStr関数のページを参照してください。
Step2.スペースの位置を手掛かりに「氏」と「名」を取り出す
スペースの位置がわかれば、あとは簡単。スペースが4文字目なら「氏」の文字数は3、スペースが3文字目なら「氏」の文字数は2というよういに、「空白位置-1」が「氏」の文字数となります。Left関数を使用して(構文2)、[氏名]の先頭から「空白位置-1」文字、つまり「InStr([氏名]," ")-1」文字を取り出しましょう(式2)。
構文2 文字列の左から文字数分の文字列を取り出す
Left(文字列, 文字数)
式2 [氏名]から「氏」を取り出す
氏: Left([氏名],InStr([氏名]," ")-1)
また、スペースが4文字目なら「名」は5文字目以降、スペースが3文字目なら「名」は4文字目以降というよういに、「空白位置+1」が「名」の開始位置数となります。Mid関数を使用して(構文3、正式な構文はMid関数のページを参照)、[氏名]の「空白位置+1」文字目以降、つまり「InStr([氏名]," ")+1」文字目以降を取り出しましょう(式3)。
構文3 文字列の指定した位置以降の文字列を取り出す
Mid(文字列, 開始位置)
式3 [氏名]から「名」を取り出す
名: Mid([氏名],InStr([氏名]," ")+1)
クエリの[フィールド]欄に式2と式3を入力すると、氏名中のスペースより前の文字列を[氏]、後の文字列を[名]として取り出せます(図3、図4)。
ヒント…氏名が未入力の場合やスペースが含まれない場合の対処
式2と式3は、スペースで区切られた氏と名が必ず[氏名]フィールドに入力されていることを前提とした式です。そのため、氏名が未入力の場合や、スペースが含まれない場合に、エラーが出てしまいます(図5のIDが「2」「3」のデータ)。また、氏名の前後に余分なスペースが入っていたり、氏と名の間に2個以上のスペースが連続している場合にも、正しい結果が得られません(図5のIDが「4」「5」のデータ)。
ここでは、IIf関数(構文4)を2つ入れ子で使用して、「氏名が未入力の場合」「氏名にスペースが含まれていない場合」「氏名にスペースが含まれている場合」の3とおりに場合分けします。
- 氏名が未入力の場合:Null値を返す
- 氏名にスペースが含まれていない場合:
氏だけが入力されているものと見なして「氏」だけを取り出す - 氏名にスペースが含まれている場合:「氏」と「名」を取り出す
また、氏名の前後の余分なスペースや氏名中の連続したスペースを排除するために、Trim関数(構文5)を併用します。こうして作成した式4と式5を使用したのが図6のクエリです。入力データがイレギュラーな場合にも、意図したとおりの結果が表示されています。