Vba 定义Querydef参数时出现问题,运行时错误13类型不匹配

Vba 定义Querydef参数时出现问题,运行时错误13类型不匹配,vba,ms-access,parameters,Vba,Ms Access,Parameters,我想打开一个基于查询的记录集。该查询有10个与表单匹配的参数。这些参数有点复杂,因为它们正在搜索部分字符串匹配 我遇到了多个问题,access似乎不允许我打开基于从表单中提取参数的查询的记录集。相反,我现在尝试打开一个querydef并将其传递给一个记录集。当我现在尝试运行函数时,出现运行时错误13类型不匹配。有没有更好的方法来做我想做的事情?是否有人对修复此错误有任何见解?错误是突出显示了第一个参数(出口国),但如果这是一个问题,我相信他们都是。谢谢 *修改为尝试通过记录集传递条件参数 Fun

我想打开一个基于查询的记录集。该查询有10个与表单匹配的参数。这些参数有点复杂,因为它们正在搜索部分字符串匹配

我遇到了多个问题,access似乎不允许我打开基于从表单中提取参数的查询的记录集。相反,我现在尝试打开一个querydef并将其传递给一个记录集。当我现在尝试运行函数时,出现运行时错误13类型不匹配。有没有更好的方法来做我想做的事情?是否有人对修复此错误有任何见解?错误是突出显示了第一个参数(出口国),但如果这是一个问题,我相信他们都是。谢谢

*修改为尝试通过记录集传递条件参数

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)