MS Access Tips/Sample and VBA and Blog customize etc...

複数条件の抽出フォームの設計 その2

前回の 複数条件の抽出フォームの設計 その1 にさらに検索仕様を「完全一致、部分一致、前方一致、後方一致」から選択できるようにしてみました。

さらに対象フィールドを増やして、繰り返しをループで記述してコードをシンプルに記述できるようにしてみました。

タイトル画像

難易度:

方針

サンプルフォーム外観
複数条件抽出フォームのチャプター

前回のコードを見ると、一部が変化するだけでほとんど同じコードの繰り返しが多いことに気づかれたと思います。抽出条件が増えたときは、コピペして一部を変更すればいいだけなのでそれほど面倒でもないですが、ループ処理にするとコードが短縮できます。また、条件が増えたときも簡単に修正できメンテナンスが楽になります。

ただし、ループ処理にするには、コントロール名を規則的なものにする、などの工夫が必要になります。今回は条件入力用テキストボックス名を、txt社員コード txtフリガナ txt氏名 txt在籍支社 txt部署名 min誕生日 max誕生日 min入社日 max入社日 というように アルファベット3文字+フィールド名 となるようにしました。

また、Tagプロパティに、検索仕様 の判断用の値を格納するようにしました。具体的には、例えば、 min誕生日 のTagには、">=" と設定して、min誕生日の値以上 を抽出するという意味を持たせました。また、 txtフリガナ txt氏名 などは、下記のような法則付けをしました。

検索仕様 Tag設定値 
完全一致  
部分一致 * *
前方一致  *
後方一致 *

それぞれのテキストボックスの横のコンボボックスの更新後処理で、選択値によって、テキストボックスのTagを設定すればいいことになります。また、コンボボックスの Tagプロパティには、条件入力用テキストボックス名を設定して関連付けします。

前回も使った BuildCriteria関数を使うと、検索値の前後に、* や >= などを付加するだけで、自動的に適切な条件式を生成してくれますので、楽できます。

フォームのデザインビュー
フォームデザインビュー

一致条件選択コンボボックス

名前は、"cb" & フィールド名 とします。例えば、「氏名」フィールドの抽出条件を設定する場合は、「txt氏名」テキストボックスの隣にコンボボックスを配置してプロパティを下記のように設定します。

氏名の一致条件選択コンボボックス
プロパティ設定値
名前cb氏名
値集合タイプ値リスト
値集合ソース完全一致;部分一致;前方一致;後方一致
連結列0
規定値0

連結列を 0 に設定すると、ListIndex値がコンボボックスの Value になります。1行目が 0 です。
規定値を 0 に設定すると、フォームを開いたとき1行目(完全一致)が選択されます。部分一致が選択されていてほしいときは、1 と設定します。

フォームモジュール

フォームを開くときに、空白区切りで抽出用コントロール名を列挙して、Splitでバリアント配列に変換してグルーパル変数に代入して利用してます。

サンプルファイルが下記からダウンロードできます。
FrmFilter_2_07.zip (Access 2007-2010 形式 - 32kb)
FrmFilter_2.zip (Access 2002-2003 形式 - 30kb)
FrmFilter_2_2k.zip (Access 2000 形式 - 28kb)


拍手する

10 Comments

zenzen says..."このフィルタを使用してのクエリ作成について"

度々失礼いたします。
mougでこちらのchipsを紹介頂き、
どうにか動かせるようにはなったのですが、
再び行き詰っています。

このフィルタからクエリ式を作成してそれを
エクセル形式でエクスポートしたいのですが、上手くいっていません。
like演算子の使い方が悪いのでは、とも思えるのですが・・。
元々はクエリのフィールド欄に
IIf([forms]![F_伝票一覧フィルタ用Q]![txt担当者] Is Null,True,[T_伝票].[担当者]=[forms]![F_伝票一覧フィルタ用]![txt担当者])
条件欄にtrue
としていた(これもmougで紹介頂いたものですが・・・)ものを、
あいまい検索の結果でないと意味がないことに後から気が付き、

IIf([forms]![F_伝票一覧フィルタ用Q]![txt担当者] Is Null,True,[T_伝票].[担当者] Like '*" & [forms]![F_伝票一覧フィルタ用]![txt担当者] & "*')

のように記述し直しているのですが、思うように動きません。
やはりlike演算子の使い方が間違っているのでしょうか。

お手数おかけしますが、ご助言いただけないでしょうか。

2014.02.17 12:02 | URL | #- [edit]
hatena says..."re:このフィルタを使用してのクエリ作成について"

> あいまい検索の結果でないと意味がないことに後から気が付き、
>
> IIf([forms]![F_伝票一覧フィルタ用Q]![txt担当者] Is Null,True,[T_伝票].[担当者] Like '*" & [forms]![F_伝票一覧フィルタ用]![txt担当者] & "*')
>
> のように記述し直しているのですが、思うように動きません。
> やはりlike演算子の使い方が間違っているのでしょうか。

引用符の使い方が間違っていますね。' と " が混在してますが、どちらかに統一してください。

IIf([forms]![F_伝票一覧フィルタ用Q]![txt担当者] Is Null,True,[T_伝票].[担当者] Like "*" & [forms]![F_伝票一覧フィルタ用]![txt担当者] & "*")

ただし、これはクエリに抽出条件を設定する場合ですね。

このブログの記事では、クエリには抽出条件を設定せずに、フォームにフィルターをかける方法を紹介しています。

> このフィルタからクエリ式を作成してそれを
> エクセル形式でエクスポートしたいのですが、上手くいっていません。

ここで紹介した方法で抽出条件式を生成して、それをクエリに設定し、エクセルにエクスポートしたい場合は、
下記で紹介している方法でクエリのSQLを書き換えて、そのクエリをエクスポートすることになります。

テーブルのフィールドを指定してエクスポート - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-125.html

ちょっと難しいかもしれませんので、もしチャレンジされるなら、
できるとこまでやってみて躓いたらまた質問してください。

2014.02.17 13:50 | URL | #5uE6dEgY [edit]
zenzen says...""

hatena様
早速回答いただきありがとうございます。
とにかくできるところまでやってみます!
取り急ぎ、お礼まで。

2014.02.17 14:00 | URL | #- [edit]
zenzen says...""

hatena様
少し間が空いてしまいましたが、やっと取りかかれています。
debug.print SQLで確認しつつ、亀の歩みで進めてきましたが、
そろそろ足が攣りそうです。

現状の考え方は、以下の通りです。

1.変数としてstrSQL1,strSQL2,strSQL3の三種類を宣言する。
2.str1でSELECT文のフィールド名を指定する。
3.str2でSELECT文のWHERE句にあたる部分を指定する。
4.str3でstr1とstr2をまとめてSELECT文を生成する。
5.str3でquerydef実行

エラー番号3141が出ていますので、
生成したSQL文がおかしいことは分かっていますが
さてどう修正するべきかはたと立ち尽くしております。
例えば2.の場合です。
フィールドが一つであればカンマは必要ないですが、
複数あればフィールド間にカンマと半角スペースが必要です。
また、フィールドが複数あった場合に最後のフィールドにはカンマは
不要になります。

こう考えると、フィールド名をSQL文に直す時に複数のパターンが
必要になります。
A.指定するフィールドが一つの場合
B.指定するフィールドが複数の場合
C.指定するフィールドが複数の場合で、かつ最後のフィールド

nullでないフィールドの数をカウントしても最後かどうかは判定
できないのでは・・・?
というところで行き詰ってしまいました。

お手数をおかけしますが、
アドバイス頂ければ幸いです。

2014.02.21 18:03 | URL | #- [edit]
hatena says..."re:エクスポート"

テーブルのフィールドをすべてエクスポートするのではないのでしょうか。
エクスポートするフィールドをその都度選択するのなら、
前回紹介した

テーブルのフィールドを指定してエクスポート - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-125.html

の方法でWHERE句の前までのSQLは生成できます。

すべてのフィールドをエクスポートするのなら、

"SELECT テーブル名.* FROM テーブル名"

とすればOKです。

2014.02.21 21:25 | URL | #5uE6dEgY [edit]
zenzen says...""

hatena様
お返事遅くなり済みません。
全てのフィールドをエクスポート出来れば満足です。
考えなくて良い所を考えてしまっていたようです。
WHERE句の前まではこれで良いとして、
ひとまず現状を。
「str2で条件を積み重ね、str1でSQL文を完成させる」つもりで
やっています。
全部記述すると長いので端折りますが、コードは以下のような状態です。

strSQL2 = strSQL2 & "フィールド1" & " = " & Me.txtフィールド1 & ","
(以下、フィールドが計11種類)

strSQL1 = "SELECT * FROM T _販売管理" & " WHERE " & strSQL2 & ";"

CurrentDb.QueryDefs("Q_フィルタダミー").SQL = strSQL1

CurrentDb.~の行でエラー番号3075が発生しています。

もう少し考えてみます。

2014.02.24 10:30 | URL | #- [edit]
hatena says..."re:デバッグ"

> 「str2で条件を積み重ね、str1でSQL文を完成させる」つもりで
> やっています。

考え方はそれでいいと思います。

> strSQL1 = "SELECT * FROM T _販売管理" & " WHERE " & strSQL2 & ";"
>
> CurrentDb.QueryDefs("Q_フィルタダミー").SQL = strSQL1
>
> CurrentDb.~の行でエラー番号3075が発生しています。

 strSQL1 = "SELECT * FROM T _販売管理" & " WHERE " & strSQL2 & ";"
 Debug.Print strSQL1
 CurrentDb.QueryDefs("Q_フィルタダミー").SQL = strSQL1

というようにデバッグ用のコードを埋め込んで実行してみてください。
その後、Ctrl+G でイミディエイトウィンドウを表示させると、strSQL1 に格納されているSQL文が表示されているので、
それが正しいSQL文になっいてるか確認してください。
それを元に正しいSQL文になるようにコードを修正してください。

とりあえずは、

> strSQL2 = strSQL2 & "フィールド1" & " = " & Me.txtフィールド1 & ","
> (以下、フィールドが計11種類)

複数の条件分をつなぐときは、"," ではなく、" AND " か " OR " になります。

AND条件かOR条件かは仕様に合わせてください。

2014.02.24 12:33 | URL | #5uE6dEgY [edit]
zenzen says...""

hatena様

コメントありがとうございます。
debug.printで確認してみたところ、
SELECT * FROM T_販売管理 WHERE 客先名 Like '*株式会社○○*'AND;

と表示されてエラー番号3075です。
ANDの部分だけコメントアウトするとエクスポートに成功したので、
ここまではOKと考えて良いと思います。
フィルタ条件が1個の場合と複数の場合の操作をどうするか、
という問題ですが、サンプルデータベースのコードを見ると
なんとなくイメージが出来てきました。
もうちょっと考えさせて下さい。

2014.02.24 19:41 | URL | #- [edit]
hatena says..."re:"

> フィルタ条件が1個の場合と複数の場合の操作をどうするか、
> という問題ですが、サンプルデータベースのコードを見ると
> なんとなくイメージが出来てきました。
> もうちょっと考えさせて下さい。

下記のコードの方が理解しやすいかもしれません。参考にしてください。

複数条件の抽出フォームの設計 その1 - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-129.html

2014.02.25 14:05 | URL | #5uE6dEgY [edit]
zenzen says...""

hatena様
お陰様で無事動くようになりました。
他のコードを見ていた時にはsplit,Ubound,BuildCriteriaあたり
の関数が初出だったのでかなり戸惑っていた部分がありますが、
今回冷静に観察することで理解できたと思います。
ANDは頭に出しておいてMid関数で処理すれば良かったのですね。

毎度お手数をおかけしておりますが、
今後とも宜しくお願いします。

2014.02.27 10:23 | URL | #- [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/130-1811c5ea
該当の記事は見つかりませんでした。