クエリの作成を進めていくと、テーブルで付けたフィールド名称から変更したい場合や、演算処理によって得られるフィールドの名称を決めたいといったニーズが出てきます。この流れで、氏名データから姓と名を分割して抽出する方法も紹介します。
フィールド名称の変更方法
クエリのフィールド名称を設定する方法は、実は非常に簡単で、【フィールド】項目に「名付けたい名称」と「:」を入力し、この後ろに対象のフィールドや演算式等をセットすれば完成です。次のようなテーブル構造に対して、その出力方法を見ていきましょう。なお、今回のテーブル構造とサンプルとして用いるデータは、Accessクエリの抽出条件 テキスト型・数値型 で紹介したものと同じものを使用しています。
表 サンプルテーブル
フィールド名 | データ型 |
ID | オートナンバー型 |
氏名 | 短いテキスト |
年齢 | 数値型 |
それでは、サンプルテーブルとレコードの準備ができたところで、クエリを作成していきましょう。テーブルの追加で、先ほど作成したテーブルを設定します。
図1に示すように、テーブルで定義したフィールドをクエリの【フィールド】項目に追加することで、各フィールドの値を抽出して出力することができます。これはクエリ操作で良く使われる方法です。次に、フィールドの名称を変えた形で出力してみましょう。
先ほどのクエリ【フィールド】項目の最終列に「名前: [氏名]」と入力しました。ここで、「名前: 」までがフィールド名称を、「[氏名]」がサンプルテーブルから参照するフィールドを示しています。つまり、サンプルテーブルの「氏名」フィールドを「名前」というフィールド名称で出力するということを意味しています。実際にデータシートビューの出力結果では、フィールド名称が「名前」になっていることを確認いただけたと思います。
氏名から姓を抽出して出力する方法
データ処理をする上で、よく行う操作を紹介します。今回のサンプルデータには「氏名」というフィールドを作成していますが、このデータの中には「姓」と「名」がスペース1字を挟んで登録されています。ここで、苗字だけを知りたいとか、下の名前だけを知りたいといったニーズがあるかと思います。苗字も名も文字数は変動しますから、関数を上手く利用して抽出操作をする必要があります。そこで、クエリの演算により「氏名」フィールドから「姓」と「名」をそれぞれ抽出してクエリのフィールドに追加する方法を見ていきましょう。
まず、今回の「氏名」フィールドはスペースを挟んで姓と名に区別しているという点に着目をします。このような場合に活用できる関数として、InStr関数があります。
InStr関数: ある文字列が別の文字列の中で最初に現れる位置を指定するVariantを返す。
InStr([ start ], string1, string2, [ compare ])
start : それぞれの検索の開始位置を設定する数値式。省略可能であり、省略すると最初の文字の位置から検索が行われる。startにNullが含まれる場合、エラーが発生する。compareが指定されている場合は、start引数が必要です。
string1: 検査元の文字列式。(省略不可)
string2: 検索場所となる文字列式を指定する。(省略不可)
compare: 文字列比較の種類を指定する。compareがNullの場合、エラーが発生する。compareが省略された場合、Option Compare 設定は比較のタイプを決定する。ロケール固有のルールで比較するために有効なLCID (LocaleID) を指定する。
後半は難しく色々と書かれていますが、今回のケースでは「compare」は使用しませんので、読み飛ばしてください。
さて、「氏名」フィールドに対してInStr関数を用いると、スペースが最初に現れる文字列の位置が分かります。例えば、「山田 一」の場合、InStr([氏名], “ ”)により、スペースが最初に現れるのは3文字目になります。したがって、「3-1=2」文字までは「姓」であることが分かります。
「氏名」フィールドの文字列で最初から○文字目までが姓であることが分かれば、Left関数を活用することができます。
Left関数: 文字列の左から数えて指定した数の文字を含むバリアント型 (内部処理形式 String の Variant) を返す。
Left(string, length)
string : 左から文字列を返す元となる文字列式。string に Null が含まれている場合は、Null が返される。(省略不可)
length: 返す文字数を示す数値式を指定する。 0を指定すると、長さ0の文字列 (“”) が返される。 文字列の文字数以上の場合は、文字列全体が返される。
Left関数とInStr関数を組み合わせることで、「姓」を抽出することができます。先ほどの「山田 一」の場合、InStr関数-1で「2」という値が決まります。そのため、Left([氏名], InStr([氏名], “ ”)-1)とすることで、「山田」までの値が得られます。
以上の操作をクエリの【フィールド】項目に入力します。また、フィールド名称は「姓」として設定しましょう。入力する値は、「姓: Left([氏名],InStr([氏名],” ”)-1)」としてください。
氏名から名を抽出して出力する方法
先ほどは「姓」を抽出して出力する方法でしたが、「名」についてはどうでしょうか。スペースの後の文字列が「名」となります。「山田 一」の場合、InStr関数を用いてスペースがはじめて現れる位置を調べると「3」という値が返されます。また、「山田 一」は文字数としてはスペースも含めて4文字です。そこで、「4-3=1」が「名」の文字数となります。したがって、「山田 一」の場合は右から1文字目までが「名」に相当します。そのため、「氏名」フィールドの文字数を調べる方法とLeft関数と同様に、右からの文字列を出力する関数を用いることで「名」の抽出ができるようになります。
Len関数: 文字列の文字数、または変数の格納に必要なバイト数を含む長整数型 (Long) を返す。
Len(string | varname)
string: 任意の有効な文字列式を指定する。stringにNullが含まれている場合は、Nullが返される。
varname: 有効な変数の名前を指定する。 varnameにNullが含まれている場合は、Nullを返す。 varnameがバリアント型 (Variant) であれば、Lenはこれを文字列型 (String) として処理し、常にその文字数を返す。
Right関数: 文字列の右端から指定した文字数の文字を含む Variant (String) を返す。
Right(string, length)
string: 右端から文字を取得する文字列式。stringにNullが含まれている場合は、Nullが返される。
length: 返す文字数を示す数値式を指定する。0を指定すると、長さ0の文字列 (“”) が返される。 文字列の文字数以上の場合は、文字列全体が返される。
Right関数、Len関数、InStr関数を組み合わせることで、「名」を抽出することができます。「山田 一」の場合、Len関数で「4」を取得します。また、InStr関数で「3」を取得します。これより、「4-3=1」として、「名」の文字数が1となりますから、Right関数より、「氏名」フィールドの右から1文字目だけを取得することで「一」を抽出できます。
以上の操作をクエリの【フィールド】項目に入力します。また、フィールド名称は「名」として設定しましょう。入力する値は、「名: Right([氏名],Len([氏名])-InStr([氏名],” ”))」としてください。
これまでの操作を図3に示しましたので、ご参考までにご確認ください。
まとめ
今回は、クエリフィールド名称の変更方法と氏名から姓と名を抽出する方法を紹介しました。クエリは、演算処理として様々な関数を用いてニーズに応じたデータを抽出することができます。また、この際のフィールド名称も自由に設定することができます。データベースに登録された情報を欲しい形に変換して出力することができるようになると、業務効率が飛躍的に改善しますので、是非チャレンジしてみてください。
スポンサーリンク
コメント
クエリフィールド名称の変更方法は大変参考になりました。ありがとうございます。
その中で1点質問させて頂きたいのですが・・・クエリを使ってCSVデータを作成するとフィールド名は本来の名称のままとなってしまいます。この方法で変更した名称でCSVデータに落とす方法はあるのでしょうか?
ちなみにACCESS初心者でしてCSV出力はどこかのサイトを参照し、以下の記述で処理しています。
DoCmd.TransferText acExportDelim, , “クエリ1”, “C:\work\sample.csv”, True
おだろう様
弊HPをご覧いただき、ありがとうございました。
ご質問の内容ですが、本記事でご紹介したクエリのフィールド名変更方法で、
csvに出力した際にはcsv側のタイトル行も変更されます。
もしより詳細のことを確認されたいということでしたら、
弊HPのお問い合わせフォームからご連絡ください。
Asuma