DoCmd.RunSQL 中的 VBA 变量
Posted
技术标签:
【中文标题】DoCmd.RunSQL 中的 VBA 变量【英文标题】:VBA Variables inside DoCmd.RunSQL 【发布时间】:2016-08-29 19:48:34 【问题描述】:只是一个问题。情况如下:
我有 15 个表查询,这些查询为索赔中使用的不同提交说明代码提取数据;即在提交澄清代码 5 处提取所有声明。截至目前,我有一个宏将运行所有 15 个查询,但每次我都需要输入我正在过滤的区域,因为 [What Region?] 提示我已放入条件字段。
我的问题是:
是否可以使用 VBA 使用 DoCmd.RunSQL 运行所有 15 个查询,我只需输入一次区域编号,它将应用于所有查询?
我最初的想法是让 VBA 提示我要过滤的区域,将其存储在变量中,然后在 SQL 语句中使用该变量。但我什至不确定你是否能做到这一点?提前感谢您提供的任何建议!
更新:所以在阅读了几个线程之后,我创建了一个模拟数据库来尝试一些概念,我认为我可能走在正确的轨道上?
Private Sub btnTest_Click()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim SQLString As String
SQLString = "SELECT tblEmployees.ID, tblEmployees.Last_Name, tblEmployees.First_Name, tblEmployees.SS_ID INTO Test" _
& "FROM tblEmployees" _
& "WHERE (((tblEmployees.ID)=[What number]));"
Set qdf = CurrentDb.QueryDefs("Query1")
qdf.Parameters(0).Value = InputBox("What is the ID Number")
qdf.Execute
qdf.Close
Set db = Nothing
Set qdf = Nothing
End Sub
因此,要将其应用于 15 个查询,我只需将其他变量调暗为 DAO.QueryDef 对吗?我注意到我真的确定我需要 SQLString 部分吗?另外,我注意到在运行这个模拟代码时,它需要很长时间才能创建新表。这是正常的吗?此外,如果它正在创建的表已经存在,则代码将不会运行。有没有办法让代码用新表替换现有表?对这个 VBA 有点陌生,所以感谢您的耐心等待。
【问题讨论】:
一个没有 vba 的简单解决方法是创建一个包含一行的表,将过滤条件放在该表中,并在查询中包含内部连接。更换桌子是手动的,但很简单。 【参考方案1】:简短的回答是肯定的,这是可能的。您想熟悉的一些关键字是“参数”,它们是带有提示和“Querydef”或查询定义的变量。
有很多文章详细介绍了如何以编程方式将参数值传递给查询。查看this 页面,了解如何完成此操作的完整概述。最值得注意的是,最后一个示例使用输入框提示用户提供参数值,这使您接近所需的值。 (即cmd.Parameters(0).Value = InputBox("Enter a country name")
)
根据您的设计进行修改,最好先创建一个字符串变量并请求参数,然后在单独声明参数时使用该变量,这将允许将单个参数提交应用于所有查询。
编辑
我已经调整了您的代码,以向您展示如何去做。您必须为每个查询重复该块。
Private Sub btnTest_Click()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strParamter As String
Set db = CurrentDb
strParamter = InputBox("What is the ID Number")
Set qdf = db.QueryDefs("Query1")
qdf.Parameters(0).Value = strParameter
qdf.Execute
qdf.Close
'Now move to next query
Set qdf = db.QueryDefs("Query2")
qdf.Parameters(0).Value = strParameter
qdf.Execute
qdf.Close
'...etc.
Set qdf = Nothing
Set db = Nothing
End Sub
【讨论】:
嗯,我会尝试使用它。非常感谢您的宝贵时间,我真的很感激。我确信在我坐了一分钟之后,我会有一些后续问题。 请记住,每个查询都需要一个 querydef 对象,但您只需要一个输入框和一个变量来传递提交的参数。 嘿克里斯托弗 - 想知道你是否有时间看看上面的更新?谢谢 跟进后续问题:我注意到 Parameters(0).Value 那里有一个 0。如果我有多个参数,我会假设下一个参数是 Parameters(1).Value 是否正确?问题是访问如何知道Parameters(0) 适用于一个字段而Parameters(1) 适用于另一个字段? @N.Ha 参数按照它们在sql语句中出现的顺序编号。我已经编辑了我的答案。以上是关于DoCmd.RunSQL 中的 VBA 变量的主要内容,如果未能解决你的问题,请参考以下文章
MS Access currentdb.excute 的结果与 Docmd.RunSQL 不同
将 DoCmd.RunSQL 用于 INSERT 和 DELETE 时删除确认