かなり大きなクエリがあり、1ダース以上のテーブルに参加しているので、idフィールドに基づいてレコードをプルバックしたい(e.g。:between nStartID and nEndID
)。
2つのパラメーターを作成し、基準としてテストしましたが、正常に機能します。
問題は、このメインクエリから挿入クエリを実行する必要があり、メインクエリ内のパラメータが必要なことです。そのため、プログラムでパラメーターを渡す必要があります。
誰がこれを行うことができるかについての手がかりがありますか?
ありがとう。
これをテストしたところ、Access 2010で動作します。
パラメーターを持つSELECTクエリがあるとします。
PARAMETERS startID Long, endID Long;
SELECT Members.*
FROM Members
WHERE (((Members.memberID) Between [startID] And [endID]));
そのクエリをインタラクティブに実行すると、[startID]と[endID]の入力を求められます。それが機能するので、そのクエリを[MemberSubset]として保存します。
次に、そのクエリに基づいてUPDATEクエリを作成します。
UPDATE Members SET Members.age = [age]+1
WHERE (((Members.memberID) In (SELECT memberID FROM [MemberSubset])));
そのクエリを対話形式で実行すると、[startID]と[endID]のプロンプトが再度表示され、正常に機能するため、[MemberSubsetUpdate]として保存します。
[MemberSubsetUpdate]のパラメーターとして[startID]および[endID]の値を指定することにより、VBAコードから[MemberSubsetUpdate]を実行できます。実際には[MemberSubset]のパラメーターです。これらのパラメーター値は必要な場所に「トリクルダウン」され、クエリは人間の介入なしで機能します。
Sub paramTest()
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.QueryDefs("MemberSubsetUpdate")
qdf!startID = 1 ' specify
qdf!endID = 2 ' parameters
qdf.Execute
Set qdf = Nothing
End Sub
QueryDefsを使用してみてください。パラメータを使用してクエリを作成します。次に、次のようなものを使用します。
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("Your Query Name")
qdf.Parameters("Parameter 1").Value = "Parameter Value"
qdf.Parameters("Parameter 2").Value = "Parameter Value"
qdf.Execute
qdf.Close
Set qdf = Nothing
Set dbs = Nothing
QueryDefsコレクションの使用に関する情報に感謝します。私はしばらくこれについて疑問に思っていました。
クエリパラメータを含むテーブルを使用して、VBAを使用せずに別の方法で実行しました。
例:SELECT a_table.a_field FROM QueryParameters、a_table WHERE a_table.a_field BETWEEN QueryParameters.a_field_min AND QueryParameters.a_field_max
QueryParametersは、a_field_minとa_field_maxの2つのフィールドを持つテーブルです。
GROUP BY句にクエリパラメータフィールドを含め、HAVING句のパラメータフィールドにFIRST演算子を含めると、GROUP BYでも使用できます。
TempVarsを使用することもできます-「!」に注意してください構文は不可欠です
既に多くの回答がありますが、これを使用できます:
Sub runQry(qDefName)
Dim db As DAO.Database, qd As QueryDef, par As Parameter
Set db = CurrentDb
Set qd = db.QueryDefs(qDefName)
On Error Resume Next
For Each par In qd.Parameters
Err.Clear
par.Value = Eval(par.Name) 'try evaluating param
If Err.Number <> 0 Then 'failed ?
par.Value = InputBox(par.Name) 'ask for value
End If
Next par
On Error GoTo 0
qd.Execute dbFailOnError
End Sub
Sub runQry_test()
runQry "test" 'qryDef name
End Sub