• ベストアンサー

アクセスのテキストボックスで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/17068)
回答No.1

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

goo_goo_38
質問者

補足

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

関連するQ&A

  • アクセスでのテキストボックスの複数条件での抽出

    Private Sub 検索_Click() Dim strFilter1 As String Dim strFilter2 As String Dim strFilter3 As String strFilter1 = "学校名 = '" & 学校名1 & "'" strFilter2 = "学校区分 = '" & 学校区分1 & "'" strFilter3 = "キャンパス = '" & キャンパス1 & "'" Me.Filter = strFilter1 & " or " & strFilter2 & " or " & strFilter3 Me.FilterOn = True End Sub (1)学校名・(2)学校区分・(3)キャンパスと3つのテキストボックスがあり 3つの抽出条件を満たすレコードをフォームに表示させたいのですが 学校名を仮に早稲田大学といれ絞れるのですが次に学校区分を大学 と入れるとほか大学も抽出されてしまいます。 学校名を抽出させたら、その範囲で学校区分の大学を抽出させたいのですが どのようにすればいいのでしょうか? (1)のみの抽出の場合や(1)と(2)のみの 場合があるのでandの完全一致ではありません。

  • Access2003 テキストボックスの値によるクエリの抽出条件

    コマンドボタンによるクエリの実行と、直接クエリを実行する(マウスでクリック) するのとで、動作が変わってしまいます。 F_メインメニュー(フォーム)内の非連結のテキストボックスtext1に文字列を入力し、 その隣に配置した検索ボタンを押すことで、テキストボックスの値を含む住所を 抽出するよう、Q_顧客を作成したのですが、F_メインメニュー内にある テキストボックスに文字列を入れ、F_メインメニューを開いたまま 直接、Q_顧客をマウスクリックにより実行すると、 確かに該当する値を含む住所をもつレコードのみがヒットします。 しかし、テキストボックスの横に配置した、コマンドボタンによる クエリの実行をすると、条件抽出されず、全件ヒットしてしまいます。 直接、Q_顧客をマウスによってクリック実行するとできるのに、 なぜコマンドボタンにコマンドボタンがクリックされたらQ_顧客を実行するよう ウィザードで作ると同じ動作にならないんでしょうか? コマンドボタンにはクリックされたらQ_顧客を実行するようにウィザードで 作成しています。 ご教授よろしくお願いします。 **以下作成状況** 「フォーム名」: F_メインメニュー ※このF_メインメニュー内に非連結のテキストボックスtext1を作成。 テキストボックスの横に検索ボタン(コマンドボタン)を作成し、 検索ボタンをクリックしたら、以下のQ_顧客を実行するよう、 コマンドボタンをウィザードで作成。 「テーブル名」: T_顧客 ※フィールドに「住所」あり。 「クエリ名」: Q_顧客 ※ ウィザードでT_顧客からクエリを作成(この時点では抽出条件設定なし) クエリの抽出条件で フィールド:住所 の抽出条件に以下を設定 Like "*" & [Forms]![F_メインメニュー]![text1].[Text] & "*"

  • Accessのテキストボックスとコンボボックスの違い

    フォームにテキストボックスを3ケ用意し、テキストボックス名をtxt1,txt2,txt3としました。これにコマンドスイッチを作成し、機能を再クエリと設定しました。 フォームのサブフォームに再クエリの結果を表示するようにしました。 クエリのテキストボックス1の抽出条件は 条件  [Forms]![フォーム名]![txt1] または [Forms]![フォーム名]![txt1] Is Null    [Forms]![フォーム名]![txt1] Is Null テキストボックス2の抽出条件は 条件  [Forms]![フォーム名]![txt2] Is Null または [Forms]![フォーム名]![txt2]  [Forms]![フォーム名]![txt2] Is Null テキストボックス3の抽出条件は 条件  [Forms]![フォーム名]![txt3] Is Null または [Forms]![フォーム名]![txt3] Is Null [Forms]![フォーム名]![txt3] と設定し、テキストボックスにデータを入力し実行すると 正しい結果が得られるのですが、テキストボックスをコンボボックスに変更し、コンボボックス名をtxt1,txt2,txt3 とすると、抽出されません。 コンボボックスをテキストボックスのように扱うのには どうするのでしょうか。教えてください。

  • フォーム上にある1つのテキストボックスで複数フィールドの値を抽出する

    フォーム上に配置している非連結のテキストボックスに任意の値を入力して,同じフォーム上に抽出結果を表示させる方法について,1つのフィールドのみを抽出対象にする場合, Private Sub 抽出_Click() 'フィルタを設定 Me.Filter = "担当 ='" & Me!所員抽出 & "'" 'フィルタを実行 Me.FilterOn = True End Sub で可能ですが,抽出したいフィールドが担当フィールドだけでなく,担当2…担当8まである場合,どのように条件をつなげていったら良いでしょうか。 担当…担当8の各フィールドにはデータが入っていたり,いなかったりします。

  • コンボボックスの抽出条件のLikeについて

    フォーム内のコンボボックス処理について 現在ACCESS2002でDBを構築しております。 初心者です。 フォーム内でテキストボックスから値【a】をもらい、その【a】を抽出条件として抽出結果を コンボボックスに表示したいと考えております。 ※like関数を使用 Private Sub テキスト1_AfterUpdate() DoCmd.Requery "コンボ1" Me!テキスト1.Requery End Sub コンボボックスの値集合ソースの抽出条件で ((テーブル.カラム) like "'*" & Forms!フォーム!テキスト1 & "*'") 上記で指定したのですが、何も抽出されません。 イコールで下記を実行すると値は抽出されます。 ((テーブル.カラム) = Forms!フォーム!テキスト1 ) LIKE関数の使い方が悪いのでしょうか。 お手数ですが、ご教授願います。

  • Access テキストボックスとコンボボックス

    Access初心者で、勉強がてらデータ登録フォームを作成しています。 フォーム上にコンボボックスを設置し、 テーブルに保存されているデータを検索できるようにしたのち、 テキストボックスのコントロールソースには簡単に 「=[コンボボックス].[column](2)」としています。(それぞれの名前は仮称です) 後から、テキストボックスひとつで 「コンボボックスからの検索結果を表示させる」と 「テキスト入力も可能とする」 を共存させたいと思い始めたのですが、可能になりますでしょうか。 ただし「コンボボックスからの検索結果表示」をしたテキストボックスに対し、 その情報をフォーム上で書き換えたとしても、テーブル側のデータ書き換えは行いたくありません。 よろしくお願いいたします。

  • 検索結果を非連結のテキストボックスに表示させるには

    accessでシステム開発しています。初心者です。 検索結果を非連結のテキストボックスに表示させる方法を教えてください。 条件(1) フォームのレコードはどのテーブルとも紐づいていない 条件(2) 2つのテーブルから1つの検索ボタンで検索できるようにしたい テーブルA;案件マスタ テーブルB:リソースマスタ ・検索テキストボックス(1つ) ・検索ボタン(1つ) 条件(3) 案件ID、リソースIDはともに数値型です。 検索結果表示テキストボックス(非連結) ・案件IDテキストボックス:案件マスタより検索した案件IDを表示する ・リソースIDテキストボックス:リソースマスタより検索したリソースIDを表示する 下記のように考えていますが ・非連結のテキストボックスに検索結果を表示させる ・1つの検索ボタンで2つのテーブルから検索ができるようにする 方法がわかりません。 どのようなコードを追記したらいいのか教えていただけないでしょうか。 よろしくお願いいたします。 Private Sub btn検索ID_Click() Dim strFilter As String Me![案件マスタ].SetFocus If Me!案件IDテキスト = Me![案件マスタ]![案件ID] Then strFilter = " AND 案件ID= " & Me!案件IDテキスト End If If Me!テキストリソースID = Me![リソースマスタ]![リソースID] Then strFilter = strFilter & " AND リソースID= " & Me!リソースIDテキスト End If ’↓?いらないかも.. 'Forms!ID検索.Filter = Mid(strFilter, 6) Forms!ID検索.FilterOn = True Me.案件IDテキストボックス= Null Me.リソースIDテキストボックス = Null

  • ACCESS2010テキストボックス値を抽出条件に

    ACCESS2010にて、フォームに作ったテキストボックスの入力値(数字3桁)をクエリの抽出条件にしたいと考えています。 ただ、そのテキストボックスの数が30個の為、クエリデザイン画面の抽出条件欄にorを用いた条件式で設定することが出来ませんでした。(文字数上限超?) そこで、VBAを用いて抽出条件を設定しようと考えているのですが、初心者のため全く勝手が分かりません。VBAでの設定方法やVBA以外での抽出方法があれば教えて頂けないでしょうか。 尚、テキストボックスには商品コード(数字3桁)を入力し、売上データを集計したクエリにおいて、フォームのテキストボックスに入力された複数の商品コードを抽出条件に設定したいと考えております。 以上、どうかお願い致します。

  • Access2000のクエリー抽出条件

    Access2000で、「メインフォーム」の中に「サブフォーム」を作り、「メインフォーム」上の複数のテキストボックス(非連結)の条件により「サブフォーム」内のデータシート形式の「一覧表」にフィルタをかけて表示させたい。 「サブフォーム」のコントロールソースである「選択クエリー」の抽出条件に「メインフォーム」上のテキストボックスの内容を記入してできるかと試みていますが・・・。意図としては条件が複数になると、その分だけ絞り込んだ表示結果を得たいのですが、うまくいきません。 どなたか、教えていただけないでしょうか?

  • アクセスのテキストボックスで

    質問の仕方が適切でないかもしれませんがご了承下さい。 Access2000を使用しています。 社員テーブルには「性別」フィールドがあり、男なら1、 女なら2が登録されています。その社員テーブルを基にした フォームを作成し、そこに非連結のテキストボックスを作成、 1なら男、2なら女と表示させたいのです。 新規登録時は「性別」フィールドに連結したテキストボックス の更新後に表示させるようなVBAを記述しておいたのでうまく いくのですが、登録済みのデータを呼び出した場合は表示され ません(更新しているわけではないので当然といえば当然なの でしょうが・・・)。 何かしなければいけないのは分かっているのですが、どのイベント 時にどのようなアクションをすればよいのか教えてください。 よろしくお願いします。

専門家に質問してみよう