特定の文字より左側にある文字列を抽出する

 文字列に含まれる特定の文字(指定した文字)よりも左側の部分を取り出すときの関数の使い方です。
 FAQの1つですがExcelの場合はLEFT関数とFIND関数の組み合わせで実現するのに対し、AccessではLeft関数とInStr関数の組み合わせで実現します。
 以下で2つの例を見てみます。

特定の文字が必ず存在する場合の例

f:id:accs2014:20181027153701p:plain:right:w500

 サンプルはこのようなテーブルです。
 メニュー名にある「/」よりも左側の、名称部分だけを抽出するものとします。


f:id:accs2014:20181027153657p:plain:right:w600

 クエリのデザインビューです。
 次のような列を設けます。



容量なしメニュー名: Left([メニュー名],InStr([メニュー名],"/")-1)

 補足ですが、Left関数によりメニュー名の文字列中の指定した位置(数字)までの文字列を取得できます。
 では何文字取得するかですが、これは『「/」の位置-1』で求まります(1を引かないと「/」が一緒に取得されてしまいます)。Instr関数により商品名列の文字列中の「/」の文字が何文字目にあるのか(数字)を取得できますので、「InStr([メニュー名],"/")-1」とします。
 この2つの関数を入れ子(ネスト)にすることで「/」という文字までの部分を抽出できます。


f:id:accs2014:20181027153655p:plain:right:w500

 データシートビューです。
 正しく抽出されているのがわかります。


特定の文字が必ず存在するとは限らない場合の例

f:id:accs2014:20181027153652p:plain:right:w500

 サンプルはこのようなテーブルです。
 メニュー名にある「/」以降を除いて名称の部分だけを抽出しますが、「/」が存在しないレコードもあります。
 このとき、上記の例と同じ式を用いると「#Func!」エラーが出ますので少し工夫が必要です。


f:id:accs2014:20181027153649p:plain:right:w600

 クエリのデザインビューです。
 次のような列を設けます。



容量なしメニュー名: IIf(InStr([メニュー名],"/")=0,[メニュー名],Left([メニュー名],InStr([メニュー名],"/")-1))

 探そうとする文字が存在しない場合にInstr関数の戻り値は0となりますので、その場合はメニュー名をそのまま表示します。そうでない場合は上記の例と同じ式で文字列を抽出するものとします。


f:id:accs2014:20181027153729p:plain:right:w500

 データシートビューです。
 「/」が存在しないレコードについても正しく抽出されています。


備考

 特定の文字より右側を抽出する例については次の記事をご覧ください。

www.accessdbstudy.net