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

将 DoCmd.RunSQL 用于 INSERT 和 DELETE 时删除确认

docmd.runsql ("从 &strValue& 中删除 *")

Access-vba复制数据错误

在 VBA 代码中执行 SQL 语句