それがそれをする唯一の方法であるように思われるので、これが私がしたことです。
1)「zqry_PlaceHolder」という名前のクエリを作成しました。私の場合、これは使用されているデータセットです(WHEREのみが変更されます)。これにWHERE句を追加しましたが(WHERE dbo_project.projectid = "_")、メインフォームの表示を遅らせないように何も返さないようにしました。
2)サブフォームで、ソースオブジェクトを先ほど作成したクエリ「Query.zqry_PlaceHolder」に設定します。これは必須です。
3)ユーザーがメインフォームのボタンをクリックすると、VBAコードが実行されます。文字列変数sWhereFilterにWHERE句を作成し、それをSQL文字列に追加します。
'Build SQL string
sSQL = Empty 'Ensure string is empty
sSQL = "SELECT Proj_Locs.ProjectID, dbo_PROJECTS.PROJECTID, Proj_Locs.Location, Master_Scans.FileName, Proj_Locs.Title, dbo_PROJECTS.TITLE" & vbCrLf
sSQL = sSQL & "FROM (tbl_Project_Locations AS Proj_Locs" & vbCrLf
sSQL = sSQL & " LEFT JOIN dbo_PROJECT AS dbo_PROJECTS ON Proj_Locs.ProjectID = dbo_PROJECTS.PROJECTID)" & vbCrLf
sSQL = sSQL & " LEFT JOIN tblMasterScans AS Master_Scans ON Proj_Locs.ProjectID = Master_Scans.Project" & vbCrLf
sSQL = sSQL & sWhereFilter
sSQL = sSQL & "ORDER BY Proj_Locs.ProjectID ASC, dbo_PROJECTS.PROJECTID ASC;"
次に、「お待ちください」フォームをスローして、処理中であることをユーザーに通知し、サブフォームのRecordSourceをビルドされたSQL文字列に設定します。
DoCmd.OpenForm "frm_PleaseWait", acNormal
DoCmd.Hourglass True
DoCmd.RepaintObject acForm, "frm_PleaseWait" 'Needed to show everything in the form immediately, otherwise there's a delay
Me.subform_Results.Form.RecordSource = sSQL 'This updates the subform AND executes it, refreshing the results
Beep 'Let user know processing completed
Me.txt_RecordsReturned = Me.subform_Results.Form.Recordset.RecordCount 'Let user know how many records were returned with their query (if any)
これは機能し、プレースホルダークエリ「zqry_PlaceHolder」は変更されません。
私には直感的ではなかったので、これが他の人に役立つことを願っています。別の/より良い方法があれば、私はすべて新しいことを学ぶためです!