Vba 定义Querydef参数时出现问题,运行时错误13类型不匹配
我想打开一个基于查询的记录集。该查询有10个与表单匹配的参数。这些参数有点复杂,因为它们正在搜索部分字符串匹配 我遇到了多个问题,access似乎不允许我打开基于从表单中提取参数的查询的记录集。相反,我现在尝试打开一个querydef并将其传递给一个记录集。当我现在尝试运行函数时,出现运行时错误13类型不匹配。有没有更好的方法来做我想做的事情?是否有人对修复此错误有任何见解?错误是突出显示了第一个参数(出口国),但如果这是一个问题,我相信他们都是。谢谢 *修改为尝试通过记录集传递条件参数Vba 定义Querydef参数时出现问题,运行时错误13类型不匹配,vba,ms-access,parameters,Vba,Ms Access,Parameters,我想打开一个基于查询的记录集。该查询有10个与表单匹配的参数。这些参数有点复杂,因为它们正在搜索部分字符串匹配 我遇到了多个问题,access似乎不允许我打开基于从表单中提取参数的查询的记录集。相反,我现在尝试打开一个querydef并将其传递给一个记录集。当我现在尝试运行函数时,出现运行时错误13类型不匹配。有没有更好的方法来做我想做的事情?是否有人对修复此错误有任何见解?错误是突出显示了第一个参数(出口国),但如果这是一个问题,我相信他们都是。谢谢 *修改为尝试通过记录集传递条件参数 Fun
Function StatementUpdate()
Dim dbs As DAO.Database
Dim rstStatements As DAO.Recordset
Dim rstCBG As DAO.Recordset
Dim concStatement As String
Dim strSQL As Variant
Set dbs = CurrentDb()
strSQL = "SELECT [Statement] FROM [St_Gen_Qry] WHERE" _
& " (([Statement Category]='General Information')" _
& " And ([Export Country] Like '*" & Forms!New_Shipment_Home_frm.[Export Country] & "*'" _
& " Or [Export Country]='All')" _
& " And ([Export State] Like '*" & Forms!New_Shipment_Home_frm.[Export State] & "*'" _
& " Or [Export State]='All')" _
& " And ([Import Country] Like '*" & Forms!New_Shipment_Home_frm.[Import Country] & "*'" _
& " Or [Import Country]='All')" _
& " And ([Import State] Like '*" & Forms!New_Shipment_Home_frm.[Import State] & "*'" _
& " Or [Import State]='All')" _
& " And ([Shipment Type] Like '*" & Forms!New_Shipment_Home_frm.[Shipment Type] & "*'" _
& " Or [Shipment Type]='All')" _
& " And ([Material Category] Like '*" & Forms!New_Shipment_Home_frm.[Material Category] & "*'" _
& " Or [Material Category]='All')" _
& " And ([Sub Category] Like '*" & Forms!New_Shipment_Home_frm.[Sub Category] & "*'" _
& " Or [Sub Category]='All')" _
& " And ([Transgenic/ Conventional] Like '*" & Forms!New_Shipment_Home_frm.RegCode & "*'" _
& " Or [Transgenic/ Conventional]='All')" _
& " And ([Intended Use] Like '*" & Forms!New_Shipment_Home_frm.[Intended Use] & "*'" _
& " Or [Intended Use]='All')" _
& " And ([Permit] Like '*" & Forms!New_Shipment_Home_frm.[Permit Required] & "*'" _
& " Or [Permit]='All')" _
& " And ([Active]='Yes'));"
Set rstStatements = dbs.OpenRecordset(strSQL, dbOpenDynaset)
Set rstCBG = dbs.OpenRecordset("SELECT Cross_Border_Grid_Table.ID, Cross_Border_Grid_Table.St_General FROM Cross_Border_Grid_Table WHERE (Cross_Border_Grid_Table.ID)= " & [Forms]![New_Shipment_Home_frm]![Text105])
rstCBG.MoveFirst
'loop through each record in the CBG that matches select query
Do Until rstCBG.EOF
concStatement = ""
rstStatements.MoveFirst
Do Until rstStatements.EOF
concStatement = concStatement & vbCrLf & rstStatements(0) & vbCrLf
rstStatements.MoveNext
Loop
rstCBG.Edit
rstCBG![St_General] = concStatement
rstCBG.Update
rstCBG.MoveNext
Loop
rstCBG.Close
rstStatements.Close
Set rstStatements = Nothing
Set rstCBG = Nothing
Set dbs = Nothing
Debug.Print "Done"
End Function
您的主要问题是试图在querydef参数中传递条件表达式。所以,每个参数语句中的第一个
或
必须是字符串的一部分,您可以将它作为VBA运算符放在字符串外部。其次,需要LIKE*
子句按字符串模式进行搜索。然后,您可能需要将表单值用单引号括起来。也许这是可能的,但querydef参数在布局时通常采用单个值,而不是条件表达式
也就是说,您完全可以在VBA记录集中使用动态条件表达式传递表单值(与其他记录集类似):
谢谢你的建议!我仍然在strSQL上遇到类型不匹配的问题。这是代码的修改部分。不要像语句那样用括号括起来,必须在表单值和通配符星号(
*
)周围加上单引号。另外,请确保在VBA字符串中打断行时,在WHERE
、和
、以及或
之后添加空格。看我的编辑…谢谢!我想我很接近。我仍然收到一个运行时3075错误,说strSQL中某处缺少运算符,但我会仔细检查,看看是否能找到它。我说得太快,我发现了运算符问题,但我现在收到一个运行时3061错误,参数太少。预期2。我显然有两个以上的参数。当我debug.print时,记录集似乎正在将参数拉入ok。有什么想法吗?听起来好像一个领域不存在。消息框strSQL
并在弹出到屏幕时读取查询,检查字段、语法和标点是否正确。如果没有问题,请将选择查询复制到Access'查询设计器(去掉VBA引号、符号和下划线),然后在那里运行查询,将显示更详细的错误消息。
strSQL = "SELECT [Statement] FROM [St_Gen_Qry] WHERE" _
& " (([Statement Category]='General Information')" _
& " And ([Export Country] Like '*" & Forms!New_Shipment_Home_frm.[Export Country] & "*'" _
& " Or [Export Country]='All')" _
& " And ([Export State] Like '*" & Forms!New_Shipment_Home_frm.[Export State] & "*'" _
& " Or [Export State]='All')" _
& " And ([Import Country] Like '*" & Forms!New_Shipment_Home_frm.[Import Country] & "*'" _
& " Or [Import Country]='All')" _
& " And ([Import State] Like '*" & Forms!New_Shipment_Home_frm.[Import State] & "*'" _
& " Or [Import State]='All')" _
& " And ([Shipment Type] Like '*" & Forms!New_Shipment_Home_frm.[Shipment Type] & "'*" _
& " Or [Shipment Type]='All')" _
& " And ([Material Category] Like '*" & Forms!New_Shipment_Home_frm.[Material Category] & "*'" _
& " Or [Material Category]='All')" _
& " And ([Sub Category] Like '*" & Forms!New_Shipment_Home_frm.[Sub Category] & "*'" _
& " Or [Sub Category]='All')" _
& " And ([Transgenic/ Conventional] Like '*" & Forms!New_Shipment_Home_frm.RegCode & "*'" _
& " Or [Transgenic/ Conventional] ='All')" _
& " And ([Intended Use] Like '*" & Forms!New_Shipment_Home_frm.[Intended Use] & "*'" _
& " Or [Intended Use]='All')" _
& " And ([Permit Like '*" & Forms!New_Shipment_Home_frm.[Permit Required] & "*'" _
& " Or Permit='All') And (Active='Yes'))"
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)