向 VBA 代码添加条件并重新查询

Posted

技术标签:

【中文标题】向 VBA 代码添加条件并重新查询【英文标题】:Add Criteria To VBA Code and Requery 【发布时间】:2013-01-30 18:47:54 【问题描述】:

因此,我拥有的以下 VBA 代码将根据等于一月的 Combo1 值重新查询表单。最终,我将在 Combo 值中有 X 年,并且只想显示基于每年的所有记录。

是否可以添加额外的 VBA 代码来使用查询中的条件,而不是有 X 数量的查询并根据年份重新查询它们。

Private Sub Combo1_AfterUpdate()

If Combo1.Value = "2013" Then
[Form_Main Form].RecordSource = "Main_Form_Query"
[Form_Main Form].Requery
End If

End Sub

【问题讨论】:

不想在RecordSource属性中写入查询的名称,您可以在运行时创建SQL语句,并将其传递给该属性 可以在 VBA 中完成吗?我问的唯一原因是我对您所引用的建议不太熟悉。 我已经发布了一个答案来说明我的建议。希望对你有帮助。 【参考方案1】:

您可以在运行时构造查询(记住:访问中的查询对象只是一条sql语句)

因此,假设您的数据存储在名为 tblMyData 的表中,其中包含名为 month(字符串、月份名称)和 year(数字、整数)的列(只是示例)。您可以通过这种方式在 VBA 中生成 SQL 查询:

...
Dim strSQL as String
...
strSQL = "SELECT * FROM tblMyData " & _
         "WHERE month='" & ComboMonth.Value & "' " & _
         "  AND year=" & ComboYear.Value ";"
...
[Form_Main Form].RecordSource = strSQL
[Form_Main Form].Requery
...

希望对你有所帮助。

【讨论】:

注意更改 RecordSource 属性会自动触发重新查询。您无需再次致电.Requery @HansUp 不记得了 :-) 谢谢【参考方案2】:

Open the form 以不同的方式。

 DoCmd.OpenForm "MyForm",,,"MyYear=2013"

或者

 DoCmd.OpenForm "MyForm",,,"MyYear=" & Me.MyCombo

假设表或查询中的 MyYear 是数字。如果不是,可以使用单引号。

一般的想法是您使用包含所有记录的表单,并使用 OpenForm 的 Where 参数指定应显示的记录。您可以对报告执行相同的操作。

【讨论】:

【参考方案3】:

对于您要完成的工作,我只有一个模糊的概念。向我们展示来自Main_Form_Query 的 SQL 可能会有所帮助。同时,考虑您是否可以使用表单的.Filter 属性来做您需要的事情。

如果表单的记录源包含名为 fiscal_year 的文本字段,您可以根据组合框中选择的年份过滤显示的行。

Private Sub Combo1_AfterUpdate()
    ' .Value is the default property, so not required after Me.Combo
    Me.Filter = "fiscal_year = '" & Me.Combo1 &  "'"
    Me.FilterOn = True
End Sub

另一种方法是引用Main_Form_Query 中的组合值。

WHERE
       Forms!YourForm!Combo1 Is Null
    OR some_field = Forms!YourForm!Combo1 

然后在组合的更新后事件中执行Me.Requery

【讨论】:

您是否建议 OP 阻止在表单上使用任何用户过滤器?如果有,怎么做?

以上是关于向 VBA 代码添加条件并重新查询的主要内容,如果未能解决你的问题,请参考以下文章

VBA访问从级联列表框传递和编辑记录并重新查询列表框

在基于非绑定列重新查询后访问 VBA 还原列表框选择

在VBA(Access)中独立地重新查询多个表单实例

使用 VBA 在 Access 中重新查询子表

更改数据库数据或重新查询后访问 2007 VBA 列表框滞后

每天使用新数据刷新/更新/重新查询访问报告