
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なら可視を[いいえ]にして非可視にして見えなくしておけば良いと思いますが。
この回答への補足
遅くなりました。確かにいい感じになりました。有り難う御座います。
ただ、一つ選択ではうまくいきますが二つ以上選択した場合は数式に複雑な要素が・・・と出て出来なくなります。
クエリを2行程に分けたり
Var条件 = Var条件 & IIf(Not IsNull(Var条件), " or (pidsyk.bri_cd)=", "")
を
Var条件 = Var条件 & IIf(Not IsNull(Var条件), " or ", "")にしてみたのですがうまくいきません。
クエリに直接1 or 2のように入力すればうまくいくのですが。
No.12
- 回答日時:
s_husky です。
検証結果は、CreateWhere関数は2重の誤りをしていることが判明しました。
第一に、クエリーと関数の関係を理解していないミスであった。
第二に、IN キーワードを使うべきであった。
No.1の回答を不用意に翻したことを反省しお詫びします。
なお、Formロード時にSQL文を作成しレコードソースにセットするように工夫し、CreateWhere関数をINキーワードに書き換えると成功しました。
*重ね重ねのミス、重々にお詫びしておきます。
この回答への補足
別件がありましたので検証が遅くなりすみませんでした。
下の件と同時にしてみましたが
まず、文字列を置き換えてテストしてみたのですが、なりました!!
また、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
と登録したのですが。
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");
が動作していますので、問題ないとは思いますが...
※まあ、これだけ複雑だと、何らかの制限に引っかかる可能性もありますから、一応、こちらでも検証してみます。
No.9
- 回答日時:
質問者は、クエリの抽出条件でフォーム名とリストボックス名を指示したら、複数選択されているリストの値に合致するデータを抽出したいみたいですね。
ところが、複数選択するとヌル値が返ってくるので困っています。問題は、やはり、クエリの抽出条件でフォーム名、リストボックス名を指定すればデータの抽出に成功することではないでしょうか?要点は、当初の目的を達成することです。ただし、フォーム名、リストボックス名だけではWhere節は完成しません。列名も必要ということです。
フォーム名、リストボックス名、列名さえ判れば、条件文を作成し文字列で戻す関数を作成することが可能です。
質問者は、「モジュールに登録して下さい」のくだりを読み違えて失敗しているものと推察されます。そこをサポートすれば、成功するものと考えます。
この回答への補足
親切にありがとうございます。
フォーム名:入力フォーム
リスト名:物品分類
リストボックスの値集合ソース: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]![入力フォーム].[物品分類]で悩んでいます。
これでわかっていただけるでしょうか。
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に条件を追加して抽出する
こんな感じでやらないと抽出できません。
No.7
- 回答日時:
s_husky です。
・未定義関数と出る---作業をミスしています。
・CreateWhere()は動作します。
まず、CreateWhere()の働きを手作業で確認して下さい。
SQLビューでSQL文を表示して
WHERE 列名=値1 OR 列名=値2 ・・・・ OR 列名=値N
で、目的の行が抽出されることを確認します。
Nは、リストボックスで選択されている個数です。
CreateWhere関数の作成手順
1、データベースメニューのオブジェクトでモジュールを選択し新規作成をクリック。
2、VBエディターで[挿入]-[プロシージャ]で
CreateWhereと名前、Function、Publicを選択します。以下は、回答を参照して引数、戻り値、関数コードを書いて下さい。
CreateWhere関数は、手作業での条件文の入力を肩代わり関数です。当然に組み込み関数ではありませんので自作しなければなりません。
No.6
- 回答日時:
>リストボックスで複数選択が出来るよう設定し・・
>複数選択が出来ないようにしたら問題なく表示・・
リストボックスは選択した値をひとつしか返しませんが複数とは?ちょっと不明ですが。
>クエリの抽出条件でforms![フォーム名].[リストボックス名]としたのですが全く反映されません。
クエリの抽出条件でforms![フォーム名]![リストボックス名]でもforms![フォーム名].[リストボックス名]でも抽出できるはずです。
抽出条件を記述したフィールドとリストボックスのプロパティのデータにある連結列が合っているか確認してください。
抽出条件を記述したフィールドとリストボックスの連結列が違っていて抽出できないのではないでしょうか。
リストボックスで選択したものがクエリに反映しないのはこれが原因であると思います。その辺を見てください。
この回答への補足
リストボックスのプロパティに複数選択ってありますよね。
そこで標準か拡張を選択した場合に1行でなく複数行選択出来るようになる方法です。
しないにすると問題なく表示されますが、下にアドバイスしていただいたとおりの結果だと思います。
No.5
- 回答日時:
s_husky です。
補足を拝見しました。
そこで、再度の補足です。
(1)SQL 文は、クエリーをSQLビューで表示して編集します。
・'Form1'、'ListBox'、'Item'は、実際のフォーム名、リストボックス名、列名に変えて下さい。
・クエリーを軽くするために文字列で参照情報を渡しています。
(2)CreateWhere関数は、モジュールに登録して下さい。
※テスト済みですので動作します。
※Stop文は外して下さい。
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
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文などに使う。
この回答への補足
ありがとうございます。
期待していた内容とは違っていましたが、以前からしたいと思っていたことでしたので逆に非常に感謝しています。そちらの方で使わせてもらいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
アクセスのクエリ、リストボックスで複数選択をしたい
Access(アクセス)
-
ACCESSのリストボックスで複数選択した値をテーブルに保存するには?
Access(アクセス)
-
Access2016 リストボックスに検索結果を表示させたい
Access(アクセス)
-
-
4
Access 更新キャンセルするには?
Access(アクセス)
-
5
Accessの更新後処理で特定の条件を満たしている場合、フォーカスを移動させない方法
PowerPoint(パワーポイント)
-
6
リストボックスのプロパティ「複数選択」の「標準」「拡張」の違い
Access(アクセス)
-
7
Access コンボボックスの複数選択
Access(アクセス)
-
8
ACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ
Access(アクセス)
-
9
フォームの値をクエリーに反映したい
その他(Microsoft Office)
-
10
【ACCESS/必須条件とOR条件を組み合わせる】
その他(Microsoft Office)
-
11
フォームで複数のチェックボックスからの抽出をしたい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
帳票フォームでのあるコンボボ...
-
Accessのコンボボックスでリス...
-
ACCESSクエリ抽出条件について
-
Accessのフォーム(コンボボッ...
-
リストボックスの時はリンク先...
-
.flex-direction プロパティは...
-
Access 帳票フォームのコンボボ...
-
accessのルックアップを階層表...
-
ACCESSでコンボボックスにSQLで...
-
コンボボックスのリスト外入力...
-
Accessのコンボボックスの値が...
-
accessでオートコンプリート機...
-
ACCESS2000でのActiveXのコンボ...
-
[Access2003]コンボボックスと...
-
動画編集アプリvllo抽出エラー
-
エクセルで、抽出したデータだ...
-
(ACCESS)条件に応じて、テキ...
-
ACCESSのクエリー抽出条件にIIF...
-
Accessでデータを更新したらそ...
-
2回目に画面のレコードセットの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのコンボボックスでリス...
-
Accessのコンボボックスの値が...
-
ACCESS リストボックスの字の色...
-
帳票フォームでのあるコンボボ...
-
ACCESSクエリ抽出条件について
-
Oracleで文字列型の時間を引き...
-
accessのルックアップを階層表...
-
ACCESS コンボボックス 抽出 ...
-
accessでオートコンプリート機...
-
Access 帳票フォームのコンボボ...
-
リストボックスの時はリンク先...
-
コンボボックスのボタンの大き...
-
Accessフォーム 大分類→小分類...
-
アクセス:フォーム入力:【大...
-
パススルークエリのデータ件数...
-
アクセスで大分類・中分類・小...
-
ACCESSでコンボボックスにSQLで...
-
Accessのコンボボックスのデフ...
-
Accessのフォーム(コンボボッ...
-
同一値集合ソースの複数コンボ...
おすすめ情報