【会員アンケートご協力のお願い】抽選で計5名様に役立つ書籍をプレゼント!

Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Pro : Microsoft 365)
クエリの抽出条件をテキストボックスに
投稿日時: 24/11/13 17:55:23
投稿者: 滝沢

クエリで下記のような抽出をしたいです。
 
◎クエリQ_000の中に「商品cd」という項目があります。
◎フォームF_000の中に以下のオブジェクトがあります。
・オプショングループop_000
・テキストボックスtxt_000
・コマンドボタンcmd_000(Q_000が実行される)
 
「商品cd」について、op_000が、
・「0」だったら抽出条件欄に「not in("123","234","345")」を入力した時と同じ結果
・「1」だったら中手条件欄が空欄の時と同じ結果
となるようにしたいです。
 
cmd_000をクリックしたら、op_000の値によって、txt_000の値を変えて
その値を利用して上記のクエリを成立させたいです。
どのようにすればよいでしょうか?
 
※当初はtxt_000など使わずに、抽出条件欄にiif文を書いてみたんですが
「複雑云々」のメッセージが表示されてうまくいきませんでした。
 
よろしくお願い致します。

回答
投稿日時: 24/11/14 08:49:36
投稿者: Suzu

引用:
「商品cd」について、op_000が、
・「0」だったら抽出条件欄に「not in("123","234","345")」を入力した時と同じ結果
・「1」だったら中手条件欄が空欄の時と同じ結果
となるようにしたいです。
  
cmd_000をクリックしたら、op_000の値によって、txt_000の値を変えて
その値を利用して上記のクエリを成立させたいです。

「txt_000」 に 必要性があるでしょうか?
「txt_000」 に ユーザーが直接入力は行わなないですよね?
「op_000」 を ユーザーがが選択するのですよね?
 
 
引用:
※当初はtxt_000など使わずに、抽出条件欄にiif文を書いてみたんですが
「複雑云々」のメッセージが表示されてうまくいきませんでした。

具体的には どのような 抽出条件 にしたのでしょうか?
 
フォームのテキストボックスに入力された値をクエリの抽出条件に設定する
https://www.moug.net/tech/acopr/0040014.html
 
抽出条件 としてではなく、
演算フィールド に 数式を入れ、抽出条件に 「True」 を入れるとどうでしょう?
 
IIF(Forms![F_000]![op_000]=0, [テーブル名].[商品CD] Not In ("123", "234", "345"), True)

投稿日時: 24/11/14 11:10:24
投稿者: 滝沢

Suzu様
ご教授ありがとうございます。
以下の方法で希望通りに動きました。

引用:
抽出条件 としてではなく、
演算フィールド に 数式を入れ、抽出条件に 「True」 を入れるとどうでしょう?
IIF(Forms![F_000]![op_000]=0, [テーブル名].[商品CD] Not In ("123", "234", "345"), True)

 
ちなみに、参考までご回答します。
引用:
「txt_000」 に 必要性があるでしょうか?
「txt_000」 に ユーザーが直接入力は行わなないですよね?
「op_000」 を ユーザーがが選択するのですよね?
はい、入力は行いませんので特に必要というわけではないです。
今回のような条件式ではなく、複数のクエリに対して同じ値を条件にする時に
自分がよくやる手法だったので同様にできないかなと思っただけです。
 
引用:
具体的には どのような 抽出条件 にしたのでしょうか?
削除してしまって正確ではありませんが、以下のような感じです。
IIF(Forms![F_000]![op_000]=0, [テーブル名].[商品CD] Not In ('123', '234', '345'), '*')
いま改めて上記で試したところ、Forms![F_000]![op_000]の値が何であっても0件になってしまいます。
条件の書き方として適切じゃないのかと調べていて、Evalだとかそういうのを足したりしていたら
「複雑」というエラーになってしまいました。

回答
投稿日時: 24/11/14 12:22:29
投稿者: Suzu

引用:
IIF(Forms![F_000]![op_000]=0, [テーブル名].[商品CD] Not In ('123', '234', '345'), '*')
いま改めて上記で試したところ、Forms![F_000]![op_000]の値が何であっても0件になってしまいます。

 
上記を数式として、評価したとき
 
Forms![F_000]![op_000]=0 の とき → [テーブル名].[商品CD] Not In ('123', '234', '345')
          それ以外のとき → '*'
 
となります。
 
抽出条件に、
  [テーブル名].[商品CD] Not In ('123', '234', '345')
   または
  '*'
    が入る事になります。
 
多分、[商品CD]の 抽出条件 に 数式を入れているのでしょうから、
それぞれを入れてクエリを実行してみましょう。
どっちでも レコードは抽出されないでしょう。
 
[商品CD]の 抽出条件に入れているという事は
 [商品CD] = (抽出条件) です。
 
前者なら
  [商品CD] = ([テーブル名].[商品CD] Not In ('123', '234', '345'))
 
  [テーブル名].[商品CD] Not In ('123', '234', '345') が先に評価され True/Falseが返ります
 
 つまり
  [商品CD] = (True)   または   [商品CD] = (False) となり
  抽出条件 に True または False を入れたのと一緒 であり、対象件数は 0件
 
 
後者なら、
  [商品CD] = ('*') となり、これも 対象件数 0件
 
本来、抽出条件に入れたいのは、
 前者なら、Not In ('123', '234', '345')
 後者なら、Like "*"
でしょうかね。
 
その辺りを理解した上で数式を組み立てましょう。
 
 
抽出条件 に 数式を直接入力する前に
その数式を 演算フィールド と して 入力、 クエリを実行し、数式の結果を確認すると
理解しやすいです。

回答
投稿日時: 24/11/16 09:57:05
投稿者: hatena
投稿者のウェブサイトに移動

滝沢 さんの引用:

「商品cd」について、op_000が、
・「0」だったら抽出条件欄に「not in("123","234","345")」を入力した時と同じ結果
・「1」だったら中手条件欄が空欄の時と同じ結果
となるようにしたいです。

 
クエリのデザインビューで下記のように設定すればいいでしょう。
 
フィールド | 商品コード         | Forms![F_000]![op_000]
抽出条件  | Not In ("123","234","345") | 0
または   |               | 1

回答
投稿日時: 24/11/16 16:03:16
投稿者: hatena
投稿者のウェブサイトに移動

ちみなにVBA板なので、VBAをつかってやるなら、
抽出条件なしのクエリをレコードソースとするデータシート表示のフォームを作成しておいて、
OpenFormの引数で抽出条件を設定するという設計にします。
 

Private Sub cmd_000_Click()
    Dim stFilter As String
    If Me.op_000 = 0 Then
        stFilter = "商品cd Not In('123','234','345')"
    End If
    DoCmd.OpenForm "DS_000", , , stFilter
End Sub

 
クエリを直接開いてユーザーに操作させるのは危険なので、通常はそのような設計にはしないです。
フォームで開けばプロパティやイベントなどで危険性をさける設計にできます。

投稿日時: 24/11/25 15:07:29
投稿者: 滝沢

Suzu様
コメントありがとうございます。

引用:
抽出条件に、
  [テーブル名].[商品CD] Not In ('123', '234', '345')
   または
  '*'
    が入る事になります。
多分、[商品CD]の 抽出条件 に 数式を入れているのでしょうから、
おっしゃる通り[商品CD]に入れています。
私も仕様を全然理解していないんですが
抽出条件欄は下記のどちらで処理しても、同じ結果(期待通りの結果)になりました。
Not In ('123', '234', '345')
[テーブル名].[商品CD] Not In ('123', '234', '345')
 
ただ、テキストボックスにそのまま(""や''で囲ったり囲わなかったり)入れてもダメでした。
(結果が0件になる)
 
hatena様
コメントありがとうございます。
引用:
クエリのデザインビューで下記のように設定すればいいでしょう。
  
フィールド | 商品コード         | Forms![F_000]![op_000]
抽出条件  | Not In ("123","234","345") | 0
または   |               | 1
なるほど確かにと思って試して正しく動作しました。
ただ、なぜか Forms![F_000]![op_000]が「0」のクエリ結果は謎のでかいスペース
(エクセルにコピペしてみたらcode=1になった)で「0以外」はnullみたいな見た目になってしまい
不安なのでこの方法はやめておこうと思います。
 
引用:
クエリを直接開いてユーザーに操作させるのは危険なので、通常はそのような設計にはしないです。
フォームで開けばプロパティやイベントなどで危険性をさける設計にできます。
これも確かにそうですね。
今は作成途中だからクエリですが、最終的にはフォームにするので、その際はOpenFormで条件を書けば良いですね。
こちらも問題なく動作しました。
これが見た目にもわかりやすいので、これにしようと思います。
 
ありがとうございました。