Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access DoCmd.RunSQL中的VBA变量_Ms Access_Vba - Fatal编程技术网

Ms access DoCmd.RunSQL中的VBA变量

Ms access DoCmd.RunSQL中的VBA变量,ms-access,vba,Ms Access,Vba,只是个问题。情况如下: 我有15个make table查询,这些查询为索赔中使用的不同提交澄清代码提取数据;i、 e.提交澄清代码为5的所有索赔。到目前为止,我有一个宏将运行所有15个查询,但每次我都需要键入要筛选的区域,因为我在“条件”字段中输入了[What region?]提示 我的问题是: 是否可以使用VBA使用DoCmd.RunSQL运行所有15个查询,其中我只需键入一次区域号,它将应用于所有查询 我最初的想法是让VBA提示我过滤的区域,将其存储在变量中,然后在SQL语句中使用该变量。但

只是个问题。情况如下:

我有15个make table查询,这些查询为索赔中使用的不同提交澄清代码提取数据;i、 e.提交澄清代码为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,所以感谢您的耐心。

简短的回答是肯定的,这是可能的。您需要熟悉的一些关键字是“参数”,即带有提示的变量和“Querydef”或查询定义

有相当多的文章详细介绍了如何以编程方式将参数值传递给查询。查看页面,了解如何完成此任务的详细概述。最值得注意的是,最后一个示例使用inputbox提示用户提供参数值,这将使您接近所需的值。(即,
cmd.Parameters(0).Value=InputBox(“输入国家名称”)

根据您的设计,最好先创建一个字符串变量并请求参数,然后在单独声明参数时使用该变量,这将允许将单个参数提交应用于所有查询

编辑

我已经调整了你的代码,告诉你怎么做。您必须为每个查询重复该块

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

没有vba的一个简单解决方法是创建一个具有一行的表,将筛选条件放入该表中,并在查询中包含具有内部联接的筛选条件。换桌子是手动的,但很简单。嗯,我会试试看。非常感谢你抽出时间,我真的很感激。我确信,在我坐了一分钟之后,我会有一些后续问题。请记住,您的每个查询都需要一个querydef对象,但您只需要一个inputbox和一个变量来传递提交的参数。嘿,Christopher-想知道您是否有时间看看上面的更新?感谢下面的后续问题:我注意到参数(0)。值在那里有一个0。如果我有多个参数,我会假设下一个是参数(1)。值正确吗?问题是access如何知道参数(0)应用于一个字段,参数(1)应用于另一个字段?@N.Ha这些参数是按照它们在sql语句中出现的顺序编号的。我已经编辑了我的答案。