Access VBA创建查询时Variant作为Where条件被识别为参数问题
问题原因与解决方案
1. GetRows数组索引取值错误
DAO的GetRows方法返回的二维数组索引规则为varRecords(字段索引, 行索引),你的查询SQL字段顺序是Email, ID:
- 索引0对应Email字段,索引1才对应ID字段
- 你当前取的
varRecords(0,0)实际是第一行的邮箱值,不是需要的ID值
2. SQL拼接缺少文本值引号包裹
如果tbl2的id字段是文本类型,拼接SQL时必须把值用单引号包裹,否则Access会把无引号的字符串识别为查询参数,而非字面量值。如果是数值类型ID则不需要引号,可根据你的实际字段类型调整。
3. 代码语法笔误
SetqdfTemp中间缺少空格,正确写法为Set qdfTemp,否则会触发编译错误。
修正后的代码示例
Dim dbsEmails As DAO.Database Dim rstEmails As DAO.Recordset Dim varRecords As Variant Dim RecordCounter As Long Dim qdfTemp As QueryDef Dim strSQL As String Dim strSQL2 As String Set dbsEmails = CurrentDb strSQL = "Select Email, ID from tbl_Email" Set rstEmails = dbsEmails.OpenRecordset(strSQL, dbOpenSnapshot) rstEmails.MoveLast RecordCounter = rstEmails.RecordCount rstEmails.MoveFirst varRecords = rstEmails.GetRows(RecordCounter) ' 调整索引取ID字段,文本类型加单引号,数值类型去掉单引号即可 strSQL2 = "Select ID, Stuff from tbl2 Where id ='" & varRecords(1,0) & "'" ' 补全Set和变量之间的空格 Set qdfTemp = CurrentDb.CreateQueryDef("Pending Report", strSQL2) End Function
校验方法
拼接完strSQL2后可添加一行Debug.Print strSQL2,在立即窗口(按Ctrl+G调出)查看实际生成的SQL语句,和手动可运行的正常SQL对比就能快速发现引号或取值错误。
内容的提问来源于stack exchange,提问作者Augen
相关产品推荐
相关产品推荐

