しがないOLのはじめての「Microsoft Access」 ~コンボボックスの絞り込み編~

2013.03.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

 こんにちは。クニ吉です。
「STEINS;GATE」というゲームのPSP版をクリアしました。すごく感動!神ゲー認定!
近々映画も公開しますので、大変楽しみです。(前売り券買いました)

コンボボックスの絞り込みとは

さて、早速本題=3
前回はコントロールについてご紹介しましたが、今回はコンボボックスの絞り込みについてご紹介したいと思います。
例えば、担当者情報を登録するフォームに会社名と部署名というコンボボックスが用意されているとします。

担当者情報登録フォーム
会社コンボボックスは企業情報テーブルを、部署コンボボックスは部署情報テーブルを参照しております。
これら2つのコンボボックスを担当者情報の登録フォームに配置、値を選択することで担当者情報と企業情報、部署情報が関連付けられます。
例えば、「AAA株式会社」の「管理部」に所属する「クラスメA子さん」というデータを登録することができます。
担当者情報テーブルには、それぞれのコンボボックスで選択した値を格納するためのフィールドを予め用意しておく必要があります。
テーブルの関連付けやコンボボックスとフィールドの連結については、本シリーズのリレーションシップ編コントロール編をご参照ください。

しかしコンボボックスを配置しただけの状態ですと、2つのコンボボックスは独立して存在しているため会社コンボボックスと部署コンボボックスはそれぞれが持っている全データを表示してしまいます。
つまり会社コンボボックスで「AAA株式会社」を選択したとしても、部署コンボボックスではBBB株式会社やCCC株式会社の部署も表示します。
異なるそれぞれの会社に同じ名称の部署が存在する場合や登録データ量が多い場合、コンボボックスから正しい部署を選択することが大変困難な状態となります。

コンボボックスのデータ表示

そこで、コンボボックスの絞り込みが役に立ちます。
リレーションシップ編でご紹介したように、それぞれの関連するテーブルは外部キーによって関連付けされています。
部署情報テーブルにも企業情報テーブルの主キーとなる「企業ID」を格納するフィールド(外部キー)が用意されており、そのため企業と部署は紐付いています。
この外部キーを利用してコンボボックスの絞り込みができるようになります。

コンボボックスの絞り込み

コンボボックスの絞り込み設定

では絞り込みの設定をしていきます。設定する対象は、部署コンボボックスです。
これらの設定はコンボボックス作成時にできますので最初にやっておきましょう。

フォームをデザインビューに切り替え、部署コンボボックスのプロパティシートを開きます。
データタブ内にある「値集合ソース」の「...」をクリックし、クエリビルダー画面を表示します。

クエリビルダーの表示

このクエリビルダー画面では、コンボボックスに表示する内容や表示順序、抽出条件などを設定することができます。
今、クエリには部署テーブルから部署ID(主キー)と部署名フィールドしか選択されていない状態です。
会社コンボボックスの値により部署コンボボックスの絞り込みを行いたいので、部署テーブルから外部キーとなる企業IDを格納しているフィールドをクエリに追加します。

クエリ変更

追加したら、このフィールドの「抽出条件」欄に抽出条件を指定します。
やりたいことはこんな感じ↓

コンボボックス絞り込みの仕組み

コンボボックスに表示されている値と、実際にフィールドに格納されている値はイコールではありません。
コンボボックスの場合、関連付けるためにID(主キー)を格納するのが基本です。
しかし、コンボボックスに番号が表示されているだけでは何を選択しているのかわかりませんので、見た目には会社名を表示しています。
参照元の値によって条件設定するフィールドは変わってきますので、参照元(今回は会社コンボボックス)にはどういう値が格納されているのかをきちんと把握しておきましょう。
それでは、抽出条件として参照するコントロール(会社コンボボックス)を指定します。

書き方:[forms]![フォーム名]![参照するコントロール名]

今回は[forms]![担当者情報フォーム]![cboCompany]となります。
これを企業ID(外部キー)の抽出条件欄に記述すれば、会社コンボボックスで選択された値によって部署が絞り込まれ、担当者登録における部署選択が楽になります。

コンボボックスの絞り込み完了

テキストボックスを使ったあいまい検索

先程はコンボボックスを使って抽出を行いましたが、抽出条件の参照元はテキストボックスでも可能です。
例えば、レコード検索用コンボボックスの会社名フィールドに[forms]![担当者情報フォーム]![txtCompany]という条件を指定すれば、抽出して検索することができます。
しかし、この書き方では問題があります。
このままだとテキストボックスの値とコンボボックスの会社名フィールドの値が完全一致しなければ、コンボボックスにレコードが表示されることはありません。

テキストの条件指定

これではいちいち正式名称を入力しなければなりませんので、面倒なままです。
上図の2番目、3番目の入力でもコンボボックスにレコードを表示できるように、Like演算子ワイルドカード(*)を使ってあいまい検索を可能にします。

Like演算子とは

Like演算子とは、ワイルドカードを使用して文字列を検索するための演算子です。
ワイルドカードは様々な種類があり、検索する文字列の内容や検索方法によって使用するものが変わってきます。

ワイルドカード

今回は検索内容によって文字数がかわるため、「*(アスタリスク)」を利用します。
例えば「あいうえお」を検索したい場合の書き方は、Like "*あいうえお*”となります。
*で囲んでいるのは「あいうえお」の前後に文字が続く場合があるためで、このようにすると「株式会社あいうえお」と「あいうえお株式会社」の両方が検索できるようになります。

Like演算子の*使用例

今回のようにテキストボックスに入力された値を含むデータを抽出する場合、上記の「あいうえお」の部分を参照するテキストボックスに置き換えます。
[Forms]![担当者情報フォーム]![txtCompany]のことですね。
しかし、
Like"*[Forms]![担当者情報フォーム]![txtCompany]*"と書いても、テキストボックス内の値を参照してはくれません。
なぜなら
[Forms]![担当者情報フォーム]![txtCompany]を ” ” で囲っているため、文字列として扱ってしまうからです。
つまり、
[Forms]![担当者情報フォーム]![txtCompany]という文字列を検索していることになりますので、これを文字列として扱わないようにしなければなりません。
なので、
[Forms]![担当者情報フォーム]![txtCompany]を" "から出してあげましょう。書き方はこんな感じ。

書き方:Like"*"&[Forms]![フォーム名]![参照するテキストボックス名]&"*"

つまり、Like"*"&[Forms]![担当者情報フォーム]![txtCompany]&"*"となります。
このように書くことで、[Forms]![担当者情報フォーム]![txtCompany]を文字列として扱わず、指定したテキストボックスを参照し、正しく検索をできるようになります。

Like演算子の注意点

これで「あいまい検索」が可能になり、前述の不完全な文字列(「あいうえお」等)でも抽出することができるようになります。
抽出する際には、圧倒的に検索しやすくなりますので、ぜひお試しください。
テキストの条件指定2

Like演算子のほかにも、=、<、>、<>、<=、>=、Between~AND~などさまざまな比較演算子があり、これらを用いて条件に合う抽出を行うことができます。
また、これらの演算子による抽出は、リストボックスでも同じ手順で利用することができ、私もこれを利用することでかなり検索が楽になりました。

そんなところで、コンボボックスの絞り込みは完了!
また次回~ノシ