• ベストアンサー

アクセスのテキストボックスでOR条件の設定をしたい

抽出用のフォームを作成し、非連結でテキストボックスを設定し、[抽出]ボタンを押すと別のフォームに抽出出来る様にしています。これを、空白区切りで複数のキーワードを入力するとOR条件で抽出出来る様にしたいと思っています。 F_抽出←抽出用フォーム syurui←非連結のテキストボックス名 抽出←コマンドボタン T_データ 番号(主キー)、氏名、住所、性別、種類(テキスト型)、・・・ F_結果←抽出条件を反映するフォームで、T_データの項目をすべてリスト形式で表示出来る様にしています。 色々調べてみて、下記の設定をしてみました。 Private Sub 抽出_Click() Dim strFilter As String strFilter = "*" & Replace(Me.syurui, " ", "* Or *") & "*" strFilter = BuildCriteria("種類", dbText, strFilter) DoCmd.OpenForm "F_結果", , , strFilter End Sub 実行してみると、実行時エラー 2431 指定した式の構文が正しくありません。と表示されてしまいます。 4行目を下記に書換えてみたのですが、 strFilter = BuildCriteria([T_データ]![種類], dbText, strFilter) 実行してみると、実行時エラー 2465 指定した式で参照されている'|'フィールドがみつかりません。 と表示され、希望通りの結果が得られません。 アクセス初心者の為、説明がわかりづらかったり情報が足りないかもしれませんが、すぐに補足致しますのでどうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

おじゃまします。 > 空白区切りで複数のキーワードを入力するとOR条件 この条件なら、エラーが無くなったとしてもこの方法は使わない方が良いと思います。 空白区切り、これは何文字の空白を想定されていますか。 エラーが無くなったとして、 あ(スペース)い なら、種類 Like "*あ*" Or 種類 Like "*い*" あ(スペース)(スペース)い なら、種類 Like "*あ*" Or 種類 Like "**" Or 種類 Like "*い*" 条件間が AND であれば、途中の 種類 Like "**" は無視できると思いますが、 OR なら、NULL でないものすべてが抽出されます。 今回の場合は、 素直に Split を使って有効なもののみで条件を生成した方が良いと思います。 以下例)   Dim sWhere As String   Dim vTmp As Variant   Dim i As Integer   Const KouName As String = "種類" ' 条件となる項目名   Const MOJI As String = "あ  い" ' テスト用文字列   sWhere = ""   vTmp = Split(MOJI, " ") ' ★   For i = LBound(vTmp) To UBound(vTmp)     If (Len(vTmp(i)) > 0) Then       sWhere = sWhere & " OR ([" & KouName & "] Like '*" & vTmp(i) & "*')"     End If   Next   If (Len(sWhere) > 0) Then sWhere = Mid(sWhere, 5) 最終的に生成される sWhere は、 ([種類] Like '*あ*') OR ([種類] Like '*い*') の様になります。 念のため、各条件を ( ) で、また項目名を [ ] で囲ってます。 最後の   If (Len(sWhere) > 0) Then sWhere = Mid(sWhere, 5) は、文字列が作られていれば OR (・・・) OR (・・・) となっているので、(・・・) OR (・・・) に作り直しています。 ★部分、カンマ区切りに変更する場合は、vTmp = Split(MOJI, ",") になります。  MOJI はテスト用なので、ここにテキストボックスの値を指定します。 空白区切りの場合、スペースが続くと "" に展開されるので、有効なものなのかは 文字数で判別します。 > 4行目を下記に書換えてみたのですが、 > strFilter = BuildCriteria([T_データ]![種類], dbText, strFilter) ↓ strFilter = BuildCriteria("[T_データ]![種類]", dbText, strFilter) 初めのパラメータはフィールド名になるので、文字列として指定します。 > F_結果←抽出条件を反映するフォームで、T_データの項目をすべて ということなので、テーブル修飾は必要ないと思います。 strFilter = BuildCriteria("[種類]", dbText, strFilter) > strFilter = BuildCriteria("種類", dbText, strFilter) の後で > debug.print strFilterをすると何も表示されませんでした この結果に対して、わかりません。 BuildCriteria は、テーブルとか確認するわけではない(と思う)ので、 指定されたもので条件を作り出すものになります。 ということで、 > したがって、"種類"が間違っている様に思うのですが にはなりません。 間違うとすると、OpenForm 時に指定する条件記述が間違っていることになります。 そのフォームで指定できる条件の項目名は、 フォームをデザインビューで開き、連結したテキストボックスのプロパティを見てみます。 「コントロールソース」部分に表示されるものになります。 (Alt + ↓ で一覧で見ることができます)

goo_goo_38
質問者

お礼

30246kiku様 時間がかかってしまいましたが、教えて頂いた方法で設定が出来ました。 色々とありがとうございました。

goo_goo_38
質問者

補足

前回の質問に続きご回答頂きありがとうございます。 空白の区切りは1文字と考えていましたが、入力する人が必ず空白1文字にしてくれるかはわからないので、色々と想定しないといけないのですね。お恥ずかしながら気が付いていませんでした。 また、BuildCriteriaについても解説を頂き、わかっていなかった事が理解できました。 現在、質問させて頂いたものが希望通りに動作する様になったのですが、30246kiku様が教えて下さった方法が理解できたら書き替えたいと思います。 ご丁寧に教えて頂きありがとうございました。

その他の回答 (3)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#2です。当方の試験したコードと結果(コード中コメント)です。ご参考まで。 Private Sub コマンド2_Click() Dim strFilter As String テキスト0.SetFocus strFilter = Replace(Me.テキスト0.Text, " ", " ") strFilter = "*" & Replace(strFilter, " ", "* Or *") & "*" Debug.Print strFilter '*あ* Or *い* strFilter = BuildCriteria("種類", dbtext, strFilter) Debug.Print strFilter '種類 Like "*あ*" Or 種類 Like "*い*" DoCmd.OpenForm "F_Table5", , , strFilter End Sub イミディエイトウィンドウで下記を実行したらどうなりますか? ?buildcriteria("種類",10,"'*あ*' Or '*い*'")

goo_goo_38
質問者

補足

ご丁寧にありがとうございます。 もう一度最初から設定しなおしたら希望どおりの動作になりました。 色々とお手数をおかけしました。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

BuildCriteriaというのは使った事がなかったので、ご呈示のコードを試してみましたが、問題なく動きました。ただ、ご呈示のコードで言うと、Me.syuri.SetFocusを追加しないと実行時エラー2185が出たのと、当方、Access2000のため、dbTextを使うには、DAOに参照設定する必要がありましたが。 debug.print strFilter で中味を確認されましたか?

goo_goo_38
質問者

補足

早速の回答ありがとうございました。 Private Sub 抽出_Click() Dim strFilter As String strFilter = "*" & Replace(Me.syurui, " ", "* Or *") & "*" debug.print strFilter テキストボックス内で[あ い]と入力し、確認しましたが、 *あ* Or *い* と確認出来ました。 ただ、 strFilter = BuildCriteria("種類", dbText, strFilter) の後でdebug.print strFilterをすると何も表示されませんでした。 したがって、"種類"が間違っている様に思うのですが、よくわからない状態です。 遅くなりましたが、Access2003を利用しております。 よろしくお願い致します。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

Filterで出来るのだろうが、 http://accessclub.jp/bbs/0068/beginers25857.html 参考 色んな場合に統一的にできるところの、 テキストボックスの文字列をコマンドボタン等クリックされた機会に捉えて、スペースでその文字列をSplitし、その配列要素の文字列を&とORで結合して、SQLのWhere条件(Where句)にする、でいかがですか。

goo_goo_38
質問者

補足

早速の回答ありがとうございました。 参考に教えて頂いたところや、Split、Where条件などを調べているのですが、初心者の為まだ理解できるところまでいきません。 もしよろしければ、もう少し詳しく教えて頂けると幸いです。 どうぞよろしくお願い致します。