• ベストアンサー

ACCESSクエリ抽出条件について

フォーム画面のリストボックスで複数選択が出来るよう設定し、その結果をクエリの抽出条件で forms![フォーム名].[リストボックス名] としたのですが全く反映されません。 複数選択が出来ないようにしたら問題なく表示されるのですが、上記の記述以外に入力しないといけないのでしょうか?

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

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.10

>(pidsyk.bri_cd)=[forms]![入力フォーム].[物品分類]で悩んでいます。 リストボックスのあるフォーム上にリストボックスで選択された条件を吐き出すテキストボックスを作り=[forms]![入力フォーム].[物品分類]ではなくそのテキストボックスの値を代入してはどうですか。 リストボックスをリスト1として吐き出すテキストボックスをText1として リストボックスの更新後処理に Private Sub リスト1_AfterUpdate() Dim Var条件 As Variant Dim varItm As Variant Var条件 = Null For Each varItm In Me.リスト1.ItemsSelected Var条件 = Var条件 & IIf(Not IsNull(Var条件), " or (pidsyk.bri_cd)=", "") & Me.リスト1.Column(1, varItm) Next Me!Text1 = Var条件 End Sub でText1に複数選択しても吐き出すようにしてWHERE条件の AND ((pidsyk.bri_cd)=[forms]![入力フォーム].[物品分類])) を AND ((pidsyk.bri_cd)=[forms]![入力フォーム].[Text1])) とすれば行けると思います。 Text1はOKなら可視を[いいえ]にして非可視にして見えなくしておけば良いと思いますが。

fujiyan2
質問者

補足

遅くなりました。確かにいい感じになりました。有り難う御座います。 ただ、一つ選択ではうまくいきますが二つ以上選択した場合は数式に複雑な要素が・・・と出て出来なくなります。 クエリを2行程に分けたり Var条件 = Var条件 & IIf(Not IsNull(Var条件), " or (pidsyk.bri_cd)=", "") を Var条件 = Var条件 & IIf(Not IsNull(Var条件), " or ", "")にしてみたのですがうまくいきません。 クエリに直接1 or 2のように入力すればうまくいくのですが。

その他の回答 (11)

noname#22222
noname#22222
回答No.12

s_husky です。 検証結果は、CreateWhere関数は2重の誤りをしていることが判明しました。 第一に、クエリーと関数の関係を理解していないミスであった。 第二に、IN キーワードを使うべきであった。 No.1の回答を不用意に翻したことを反省しお詫びします。 なお、Formロード時にSQL文を作成しレコードソースにセットするように工夫し、CreateWhere関数をINキーワードに書き換えると成功しました。 *重ね重ねのミス、重々にお詫びしておきます。

fujiyan2
質問者

補足

別件がありましたので検証が遅くなりすみませんでした。 下の件と同時にしてみましたが まず、文字列を置き換えてテストしてみたのですが、なりました!! また、Inキーワードの意味がわかりませんでした。 やはりCreateWhereが未定義関数と表示されます。 モジュールには Public Function CreateWhere(ByVal frm As String, _ ByVal lst As String, _ ByVal fld As String) As String Dim I As Integer Dim N As Integer Dim strWhere As String Dim ctl As Control Set ctl = Forms(frm).Controls(lst) N = ctl.ListCount - 1 For I = 0 To N If ctl.Selected(I) Then If Len(strWhere & "") > 0 Then strWhere = strWhere & " Or " End If strWhere = strWhere & fld & "='" & ctl.ItemData(I) & "'" End If Next I CreateWhere = strWhere >= CreateWhere = "(" & strWhere & ")" End Function と登録したのですが。

noname#22222
noname#22222
回答No.11

s_husky です。 No.7 の回答を補足に沿って説明し直します。 <SQLビューでの手作業確認> (pidsyk.bri_cd)=[forms]![入力フォーム].[物品分類] ここを、 (pidsykbri_cd = '物品分類1' Or pidsykbri_cd = '物品分類2') という文字列に置き換えてテストするということです。 これでOKであれば、次のステップに進みます。 <CreateWhere関数の組み込み方> 検索終了日],9,2)) AND ((pidsyk.bri_cd)=[forms]![入力フォーム].[物品分類])) ORDER BY の部分を 検索終了日],9,2)) AND CreateWhere("入力フォーム","物品分類","pidsyk.bri_cd") ORDER BY というように変えます。 ただし、この場合、 CreateWhere = strWhere => CreateWhere = "(" & strWhere & ")" と戻り値を工夫する必要がありそうです。 SELECT テーブル1.ID, テーブル1.Item FROM テーブル1 WHERE CreateWhere("Form1","ListBox","Items"); が動作していますので、問題ないとは思いますが... ※まあ、これだけ複雑だと、何らかの制限に引っかかる可能性もありますから、一応、こちらでも検証してみます。

noname#22222
noname#22222
回答No.9

 質問者は、クエリの抽出条件でフォーム名とリストボックス名を指示したら、複数選択されているリストの値に合致するデータを抽出したいみたいですね。ところが、複数選択するとヌル値が返ってくるので困っています。問題は、やはり、クエリの抽出条件でフォーム名、リストボックス名を指定すればデータの抽出に成功することではないでしょうか?  要点は、当初の目的を達成することです。ただし、フォーム名、リストボックス名だけではWhere節は完成しません。列名も必要ということです。  フォーム名、リストボックス名、列名さえ判れば、条件文を作成し文字列で戻す関数を作成することが可能です。  質問者は、「モジュールに登録して下さい」のくだりを読み違えて失敗しているものと推察されます。そこをサポートすれば、成功するものと考えます。

fujiyan2
質問者

補足

親切にありがとうございます。 フォーム名:入力フォーム リスト名:物品分類 リストボックスの値集合ソース:SELECT pimbri.bpn_bri_nm, pimbri.bpn_bri_cd FROM pimbri; 連結列:2 クエリは現状SQLビューで SELECT pidsyk.syk_h, pidsyk.bri_cd, pidsyk.syh_cd, pidsyk.syk_su, IIf(forms!入力フォーム.価格区分リスト="購入価",pidsyk.gen_kn_ka,IIf(forms!入力フォーム.価格区分リスト="薬価/請求価",pidsyk.gen_tei_ka,IIf(forms!入力フォーム.価格区分リスト="マスタ価",pimsyh.gen_kn_ka))) AS 1本包装価格, IIf(forms!入力フォーム.価格区分リスト="購入価",pidsyk.gen_kn_ka/pidsyk.iri_su,IIf(forms!入力フォーム.価格区分リスト="薬価/請求価",pidsyk.gen_tei_ka/pidsyk.iri_su,IIf(forms!入力フォーム.価格区分リスト="マスタ価",pimsyh.gen_kn_ka/pimsyh.iri_su))) AS 1本価格 FROM pidsyk LEFT JOIN pimsyh ON pidsyk.syh_cd = pimsyh.syh_cd WHERE (((pidsyk.syk_h)>=Mid([forms]![入力フォーム].[検索開始日],1,4) & Mid([forms]![入力フォーム].[検索開始日],6,2) & Mid([forms]![入力フォーム].[検索開始日],9,2) And (pidsyk.syk_h)<=Mid([forms]![入力フォーム].[検索終了日],1,4) & Mid([forms]![入力フォーム].[検索終了日],6,2) & Mid([forms]![入力フォーム].[検索終了日],9,2)) AND ((pidsyk.bri_cd)=[forms]![入力フォーム].[物品分類])) ORDER BY pidsyk.syk_h; となっています。 このうち(pidsyk.bri_cd)=[forms]![入力フォーム].[物品分類]で悩んでいます。 これでわかっていただけるでしょうか。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.8

>そこで標準か拡張を選択した場合に1行でなく複数行選択出来るようになる方法です 上記補足は分かりますが リストの複数選択プロパティに標準または拡張を設定するとリストボックスコントロールの値は常にNull値になりますのでforms![フォーム名].[リストボックス名]では取得できません。 なので[リストボックスは選択した値をひとつしか返しませんが複数とは?ちょっと不明ですが。]となりました。 複数選択した場合はItemsSelectedなど使い Dim Var条件 As Variant Dim varItm As Variant strSQL = "Select * From テーブル名" 'SQLを作っておきます For Each varItm In Me.リストボックス名.ItemsSelected Var条件 = 'ここにリストボックスで複数選択された値を代入します。 Next DoCmd.RunSQL strSQL & " WHERE テーブル名.フィールド名 In ( " & Var条件 & " );" '作っておいたSQLに条件を追加して抽出する こんな感じでやらないと抽出できません。

noname#22222
noname#22222
回答No.7

s_husky です。 ・未定義関数と出る---作業をミスしています。 ・CreateWhere()は動作します。 まず、CreateWhere()の働きを手作業で確認して下さい。 SQLビューでSQL文を表示して WHERE 列名=値1 OR 列名=値2 ・・・・ OR 列名=値N で、目的の行が抽出されることを確認します。 Nは、リストボックスで選択されている個数です。 CreateWhere関数の作成手順 1、データベースメニューのオブジェクトでモジュールを選択し新規作成をクリック。 2、VBエディターで[挿入]-[プロシージャ]で CreateWhereと名前、Function、Publicを選択します。以下は、回答を参照して引数、戻り値、関数コードを書いて下さい。 CreateWhere関数は、手作業での条件文の入力を肩代わり関数です。当然に組み込み関数ではありませんので自作しなければなりません。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.6

>リストボックスで複数選択が出来るよう設定し・・ >複数選択が出来ないようにしたら問題なく表示・・ リストボックスは選択した値をひとつしか返しませんが複数とは?ちょっと不明ですが。 >クエリの抽出条件でforms![フォーム名].[リストボックス名]としたのですが全く反映されません。 クエリの抽出条件でforms![フォーム名]![リストボックス名]でもforms![フォーム名].[リストボックス名]でも抽出できるはずです。 抽出条件を記述したフィールドとリストボックスのプロパティのデータにある連結列が合っているか確認してください。 抽出条件を記述したフィールドとリストボックスの連結列が違っていて抽出できないのではないでしょうか。 リストボックスで選択したものがクエリに反映しないのはこれが原因であると思います。その辺を見てください。

fujiyan2
質問者

補足

リストボックスのプロパティに複数選択ってありますよね。 そこで標準か拡張を選択した場合に1行でなく複数行選択出来るようになる方法です。 しないにすると問題なく表示されますが、下にアドバイスしていただいたとおりの結果だと思います。

noname#22222
noname#22222
回答No.5

s_husky です。 補足を拝見しました。 そこで、再度の補足です。 (1)SQL 文は、クエリーをSQLビューで表示して編集します。 ・'Form1'、'ListBox'、'Item'は、実際のフォーム名、リストボックス名、列名に変えて下さい。 ・クエリーを軽くするために文字列で参照情報を渡しています。 (2)CreateWhere関数は、モジュールに登録して下さい。 ※テスト済みですので動作します。 ※Stop文は外して下さい。

fujiyan2
質問者

補足

早速してみたのですが、未定義関数と表示されてしまうんですが。

noname#22222
noname#22222
回答No.4

CreateWhere関数は、ちょっと敷居が高いのかなと思いました。 そこで、ソースの雛形を示しておきます。 SELECT テーブル1.ID, テーブル1.Item FROM テーブル1 WHERE CreateWhere("Form1","ListBox","Items"); Public Function CreateWhere(ByVal frm As String, _               ByVal lst As String, _               ByVal fld As String) As String   Dim I    As Integer   Dim N    As Integer   Dim strWhere As String   Dim ctl   As Control      Set ctl = Forms(frm).Controls(lst)   N = ctl.ListCount - 1   Stop   For I = 0 To N     If ctl.Selected(I) Then       If Len(strWhere & "") > 0 Then         strWhere = strWhere & " Or "       End If       strWhere = strWhere & fld & "='" & ctl.ItemData(I) & "'"     End If   Next I   CreateWhere = strWhere End Function

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

リストボックスに表示するテーブルを テーブル:生徒 ID 県 学校 学年 性別 1 東京 南小学校 6 男 2 埼玉 北小学校 2 女 3 埼玉 北第2小学校 1 女 4 千葉 中央小学校 3 男 5 神奈川 東小学校 1 男 とする」。 ---- 生徒フォームをつくり、リストボックスを貼り付ける。 リストボックス:リスト12 (私の場合の名)のプロパティで 値集合タイプ テーブル 値集合ソース 生徒 (上記テーブル) 列数  3     (上記学校フィールドまで3列) 連結列 3     (上記の3番目・学校フィールドが採られる) 複数選択 標準   (複数選択する) ---- コマンドボタンを1つ貼り付け(たとえばキャプションを「検索」) コマンドボタン:コマンド14 (私の場合の名) (データをリストボックスから採るきっかけを与えるため設置) ---- コマンドボタンのクリックイベントとして Private Sub コマンド14_Click()  Dim frm As Form, ctl As Control Dim varItm As Variant Set frm = Forms!生徒 Set ctl = frm!リスト12 For Each varItm In ctl.ItemsSelected MsgBox ctl.ItemData(varItm)  Next varItm End Sub を作る。 ---- フォームで表示-フォームビュー リストボックスで、たとえば、南小学校、中央小学校の2つの行をクリック フォームの検索ボタンをクリック 順次、南小学校、中央小学校がメッセージボックスに現れる。 これを変数に保存しておく。 ---- これで検索条件が、変数値にはいって、複数決まるから、SQL文などに使う。

fujiyan2
質問者

補足

ありがとうございます。 期待していた内容とは違っていましたが、以前からしたいと思っていたことでしたので逆に非常に感謝しています。そちらの方で使わせてもらいます。

noname#22222
noname#22222
回答No.2

s_husky です。 定かでない部分を確認しました。 次のような関数を作成してテストした結果はOKでした。 SELECT テーブル1.ID, テーブル1.Item FROM テーブル1 WHERE CreateWhere(); CreateWhere()の類を作成して下さい。 要領は先の回答を手掛かりにヘルプ分を参照すればいいでしょう!

fujiyan2
質問者

補足

早速の返答ありがとうございます。 ただ、SQL初心者な私には理解し難いです。 もう少し詳しく解説していただけないでしょうか。

関連するQ&A

  • クエリの抽出条件

    クエリの抽出条件を手入力では無く、コンボボックス方式で プルダウンでリストを選びたいと思い下記の抽出条件を入力 [Forms]![フォーム名]![コンボ名] しかし、パラメータ入力時の名前が、Forms!フォーム名!コンボ名と変わるのみで プルダウンになりません クエリを過去のデータ検索のみで使用したいと思ってます。 ネットをくぐると、メインフォームを開いてとありますが、それでも駄目です。 また、クエリー検索だけで、メインフォームを開かないでプルダウン方式には 出来ないものでしょうか よろしくお願い致します

  • ACCESS 選択クエリーの抽出条件について

    既出でしたら、大変申し訳ありません。 選択クエリーの抽出条件をフォーム上テキストボックスに入力した 値で行いたいと思います。 対象の項目は商品コードであり、テキスト型です。 フォーム上のテキストボックスに、1111 と入力し、 クエリーの実行をしたところ、正常に抽出。 しかし、フォーム上のテキストボックスに、"1111" or "2222"と 複数の商品を抽出したいので入力した場合、結果が出ませんでした。 おそらく、"1111" or "2222"の記述に問題があるのだと思い、 何パタンか挑戦しましたが、結果バツ。 どなたかお分かりになる方いらっしゃいますか? つたない文章で申し訳ありません。

  • Accessクエリの抽出条件にフォームから挿入する方法

    Accessフォームのテキストボックスに入力されたデータを、クエリの抽出条件に挿入したいのですが、その際部分一致で検索したいため、抽出条件にLike "*[Forms]![フォーム名]![テキストボックス名]*"と記述したのですがうまく行きません。 どのように記述すれば部分一致で検索できるのかお教えください。

  • 選択クエリでの複数抽出条件の記述について

    フォーム上に「テキストボックス」、「コンボボックス」、「チェックボックス」の項目があって、それぞれの条件に合致した、データを抽出する選択クエリを書いてるのですが、うまく抽出してくれません。 「テキストボックス」、「コンボボックス」には、[Forms]![テーブル名]![入力するボックスの名前] or 、[Forms]![テーブル名]![入力するボックスの名前] is nullと記述しています。 「チェックボックス」には、、[Forms]![テーブル名]![チェックボックスの名前] = True or [Forms]![テーブル名]![チェックボックスの名前] = Falseと記述しています。 しかしながら、任意のコンボボックスからテキストを選択し、チェックボックスにレのついたデータを抽出したくても正しいデータを表示してくれません。 どなたか、クエリに詳しい方よろしくお願いいたします。

  • Accessクエリの抽出条件にフォームから挿入する方法(2)

    フォームにいくつかの抽出条件を指定するためのテキストボックスをセットし、そこに入力されたデータをクエリの抽出条件に挿入しデータ抽出を行っておりますが、たとえば販売期間でデータを抽出するために、クエリの抽出条件に Between [Forms]![フォーム名]![売上日FROM] And [Forms]![フォーム名]![売上日TO]と入力しているのですが、テキストボックスに指定日付が入っていれば問題なく抽出できるのですが、販売期間の指定なしの場合、売上日from及び売上日TOがNULLとなるためか抽出結果がゼロ件になってしまいます。 期間指定なしの場合でも抽出ができるようにするためにはどのように記述すればよいか教えてください。よろしくお願いいたします。

  • Accessのクエリ

    初めまして。Accessのクエリについての質問です。 Access2003を使っています。 検索フォームを作り、その検索フォームにテキストボックスを2つ作り、そのテキストボックスに検索したい言葉を入力し、コマンドボタンで作った検索ボタンを押すとマクロでフィルタの実行がされデータを抽出できるというものを作りました。フィルタには選択クエリを使用しています。抽出したい2つのフィールドの抽出条件にあいまい条件のLike "*" & [Forms]![フォーム名]![テキストボックス名] & "*"を入れています。 今はテキストボックスが2つですが、もっと増やしていろんな条件で検索出来るようにしたいので、3つ目のテキストボックスを作り、抽出条件も同じように入れました。ですが、そうすると今までちゃんとできていた最初の2つのテキストボックスによる抽出が違った結果となりでてきました。このとき、新しく作った3つ目のテキストボックスは空欄なので最初と同じ結果が出ると思ったのですが、これは抽出条件が3つはできないということでしょうか?どなたか教えてください。

  • クエリの抽出条件

    クエリの抽出条件に [担当者を選んでください] クエリを開いた際に、担当者をドロップダウン一覧から選べるようにしたいのですが [Forms]![フォーム名]![コンボ名]は分かるのですが・・・ フォーム名とは、何を入力すれば良いのでしょうか? コンボ名はコンボボックスを作成した担当者名だと思いますが・・・? 基本的に1つのテーブルに全部の項目を入力し、クエリーを作成しています フォームは作成していました。 しかし、フォーム名を入力しても、コンボボックス名を入力しても[担当者を選んでください] の場所の名前が変わるだけなんです?? ご回答の程、よろしくお願い致します。

  • サブフォームを利用したクエリーの抽出条件について

    環境:ACCESS2003&XP Pro メインフォーム&サブフォームのフォームを作成しています。 このサブフォームにテキストボックスをつけ、このテキストボックスの値を抽出条件にしたクエリーを作成しましたが、抽出条件がうまくいかないようで クエリー実行時にパラメータを聞いてきます。 クエリーの抽出条件は forms![メインフォーム名].[サブフォーム名].[テキストボックス名] です。 上記の書き方がおかしいのだと思います。 よろしくお願いします。

  • AccessでBetween条件を含むクエリーで、Between条件を

    AccessでBetween条件を含むクエリーで、Between条件を入力しなくてもデータを抽出するには? Access97でデータの抽出を行いたいと思います。 「顧客名」「商品名」「出荷日」という項目を含むクエリーから、希望のデータを抽出するフォーム(名:検索フォーム)を作成しています。 検索フォームにそれぞれ「顧客名」「商品名」「出荷開始」「出荷終了」という名前の非連結のテキストボックスを作り(規定値を"*"にしています)、それに値を入力すると、これらのテキストボックスの下に配置したサブフォームに抽出されたデータが抽出される様にしたいのです。 現在、クエリーの「顧客名」項目の抽出条件に「[forms]![検索フォーム]![顧客名]」という様に入力し、同じ様な記述を「商品名」項目にも行い(条件は[商品名]としています)、出荷日に「Between[forms]![検索フォーム]![出荷開始]And[forms]![検索フォーム]![出荷終了]」と記述しています。(これらは全てAnd条件にしています) さて、この検索フォームの値入力項目で、全てのテキストボックスに入力しなくても(1つ以上値が入力されていれば)データをサブフォームに抽出できるようにしたいのです。 現在、「出荷開始」&「出荷終了」に値を入力すれば、その他の値(「顧客名」と「商品名」)を入力してもしなくてもデータが抽出できますが、「出荷開始」&「出荷終了」を入力しない限りデータが抽出されません。 この「出荷開始」&「出荷終了」を入力しないケースでもデータが抽出できる様なフォームを作成したいのですが、 どの様に記述を変えたらよいでしょうか?

  • クエリの条件にての"*"の使い方

    いつもお世話になっております。 Access2000にてクエリの抽出条件で悩んでいます。フォームにて入力があったときはそれで抽出・入力が無かった時は全て抽出したいと思い Like forms![フォーム名]![コントロール名]&"*" をクエリの抽出条件にセットしました。入力があったときはOKなのですが、入力が無かった時はテーブルにデータがあるレコードのみを抽出してしまいます。データが入ってないレコードも抽出したいのですがどのように記述すればいいのでしょうか? 宜しくお願い致します。

専門家に質問してみよう