Microsoft Access 掲示板

DoCmd.OpenForm レコードソース外のクエリによる抽出条件について

10 コメント
views
4 フォロー

お世話になります。
クエリA・・・フィールド[区分]、[担当]、[金額]
クエリB・・・クエリAのグループ集計 フィールド[担当(グループ化)]、[金額(合計)]
フォームA・・・レコードソースはクエリB
フォームB・・・実行するフォーム

フォームBから DoCmd.OpenForm で、フォームAを抽出条件を指定して開きたい場合、
例えば
 DoCmd.OpenForm "フォームA"  , , , [クエリB]![担当]=[Forms]![フォームB]![担当] 

とすると、フォームBの[担当]と一致したレコードが表示されるのは分かるのですが、
クエリAの中の[区分]を抽出条件で指定してフォームAを開きたい場合、どのように書けば良いのでしょうか?
クエリBには[区分]フィールドはありません。(金額がバラけてしまうため)

クエリA[区分]フィールドの抽出条件に [Forms]![フォームB]![区分] と書けば簡単なのですが、文字数制限の絡みでVBAで処理をしたいと考えています。

もし可能であれば、ご教授お願い致します。

mae
作成: 2019/04/22 (月) 14:36:58
最終更新: 2019/04/22 (月) 14:37:56
通報 ...
1

クエリB は担当毎の集計、
欲しいのは、担当+区分毎の特定の区分の集計、
まったく別の出力なので一つのクエリで実現は不可能です。

クエリC・・・[担当、区分(グループ化)]、[金額(合計)]

というクエリを作成しておいて、フォームA を開く時に、レコードソースを書き換えるようにすればいいでしょう。

Docmd.OpenForm "フォームA", , , "抽出条件式", , , "クエリC"

というように OpemArgs引数(第7引数)にクエリ名を設定しておいて、
フォームAの開く時のイベントプロシージャに下記のように記述します。

Private Sub Form_Open(Cancel As Integer)
    If Me.OpenArgs <> "" Then
        Me.RecordSource = Me.OpenArgs
    End If
End Sub
2
mae 2019/04/22 (月) 16:23:19 修正 13630@32811 >> 1

ご回答ありがとうございます。
クエリC・・・[担当(グループ化)]、[区分(グループ化)]、[金額(合計)] ということでいいんですよね??
例えば抽出条件式に

Docmd.OpenForm "フォームA", , , "[クエリC]![区分]=[Forms]![フォームB]![区分]", , , "クエリC"

と記述しても開く時にパラメータの入力を求められてしまいます。"抽出条件式"にはフォームAに関係しているフィールドしか記述できませんか?
区分の抽出をしたい場合はクエリCの抽出条件に書き込むしかないのでしょうか?

3
hatena 2019/04/22 (月) 19:14:32 修正 >> 2

前回の回答を下記に修正します。

まず、フォームのデザインビューで「レコードソース」プロパティをは空白にしておいてください。
開く時のイベントプロシージャは下記にしてください。

Private Sub Form_Open(Cancel As Integer)
    Me.RecordSource = Me.OpenArgs
End Sub

フォームを開く時は、OpenArgs には、テーブル名かクエリ名を設定しておいてください。

4

ご回答ありがとうございます。
修正版のアドバイスでレコードソースの置き換えには成功しました。
申し訳ございません、もう1点確認したいのですが、

Docmd.OpenForm "フォームA", , , "抽出条件", , , "クエリC"

ここの"抽出条件"は、あくまでフォームAに対する抽出条件になるのでしょうか?
たとえば "[クエリC]![区分]= '" & [Forms]![フォームB]![区分] & "' " と入力しても無視されます…
クエリCの抽出条件をVBA上で行いたい場合、上記の一文で対応可能でしょうか?
不可の場合、別途構文を用いることで可能になるのでしょうか?

お手数をおかけしますがご確認よろしくお願い致します。

5

すみません。サンプル作成して動作確認してみましたが、抽出条件が無視されますね。
下記に修正してください。

開く時のイベントプロシージャ

Private Sub Form_Open(Cancel As Integer)
    Dim Args
    Args = Split(Me.OpenArgs, ";")
    Me.RecordSource = Args(0)
    Me.Filter = Args(1)
    Me.FilterOn = True
End Sub

フォームを開くコードは、下記で。

DOCmd.OpenForm "F売上集計", , , , , , "クエリC;[クエリC]![区分]='" & [Forms]![フォームB]![区分] & "'"

第7引数に、"クエリ名;抽出条件" というようにクエリ名と抽出条件を;で区切って設定してください。

6
mae 2019/04/23 (火) 19:38:29 修正 13630@32811

ご回答ありがとうございます。
無事に抽出条件が適用されたフォームを開くことができました。
意図的に抽出条件の枠を作る発想は思いつきませんでした。

申し訳ございません、さらに突っ込んだ質問をさせてください。
クエリA・・・フィールド[区分]、[担当]、[金額]、[受注日]
クエリC・・・クエリAのグループ集計 フィールド[担当(グループ化)]、[区分(グループ化)]、[金額(合計)]、[受注日(where条件)](抽出条件を書かないと保持されないですが・・・)
クエリAに[受注日]を追加して日付で範囲指定したい場合、;後の抽出条件で書くことは可能でしょうか?
クエリCには表示されないフィールドなので無理でしょうか・・・?

7
hatena 2019/04/23 (火) 19:55:28 修正 >> 6

クエリCを、クエリAのグループ集計 フィールド[担当(グループ化)]、[区分(グループ化)]、、[受注日(グループ化)]、[金額(合計)]
として、
OpenArgs引数に "受注日 between #" & Me.受注日自 & "# And #" & Me.受注日至 & "#"
ではダメですか。

あるいは、クエリは使わずに、 フォームを開く時に、RecordSource に直接 SOL文を設定してしまうという方法もあります。

8

早々のご返信ありがとうございます。
受注日はグループ化したくないのです。金額が受注日ごとにバラけるのは避けたいので…
なんとかグループ化せずに(フィールドに乗せずに)抽出条件を書けないものでしょうか?

…というか書いてて思ったのですが、これは最初に回答いただいた「別の出力なので一つのクエリで実現は不可能」に繋がりますか…?

9

クエリは使わずに、 フォームを開く時に、RecordSource に直接 SOL文を設定してしまうという方法になりますね。

10

ご回答ありがとうございます。
ひとまずRecordSource に直接 SOL文を書く方向でトライしてみます。
またどうしても分からないときは質問させていただきます。

質問に回答いただきありがとうございました。