使用 VBA 访问更新查询

Posted

技术标签:

【中文标题】使用 VBA 访问更新查询【英文标题】:Access Update Query using VBA 【发布时间】:2017-06-22 19:38:14 【问题描述】:

我有一张这样的桌子

SNo Block   SAP SAG BAP BAG DEP DEG
1   600403  1   3   5   4       
2   600405  1   3   1   3   1   1
3   600407  3   1           2   4
4   600409                  3   1
5   600410  1   3   2   5   1   3
6   600413  1   4           1   3

我想将 SAP = 1 和 SAG = 3 的 SAP 和 SAG 的单元清空,并将 BAP = 1 和 BAG = 3 的 BAP 和 BAG 的单元清空,对于 DEP 和 DEG 同样明智,我期待结果像下面这样

SNo Block   SAP SAG BAP BAG DEP DEG
1   600403          5   4       
2   600405                  1   1
3   600407  3   1           2   4
4   600409                  3   1
5   600410          2   5       
6   600413  1   4               

谷歌搜索后,我为此编写了一个代码,代码成功运行,没有任何错误,但只有 SAP 列被 NULL 化,SAG 列没有被 NULL 化(SAG docmd 的第二个查询不起作用)!

下面是我的 VBA,对不起,我是 Access VBA 的新手!

Private Sub VbaModule()

Dim db As DAO.Database
Dim rs As Recordset
Dim sSQL As String
Dim sSQL1 As String

Set db = CurrentDb()
Set rs = db.OpenRecordset("T05_Pr2_Null_Not_In_Rem")

sSQL = "UPDATE T05_Pr2_Null_Not_In_Rem SET SAP = NULL " & _
     " WHERE (SAP = 1 AND SAG = 3)"
     DoCmd.RunSQL sSQL

sSQL = "UPDATE T05_Pr2_Null_Not_In_Rem SET SAG = NULL " & _
     " WHERE (SAP = 1 AND SAG = 3)"
     DoCmd.RunSQL sSQL

rs.Close
Set rs = Nothing
db.Close

End Sub

有什么建议吗?

【问题讨论】:

建议不要更改原始数据。只需在查询中进行计算即可。 第二个查询没有按预期工作,因为您已经使用第一个 UPDATE 更改了 SAP 字段中的数据 哦!没错……可惜……有没有可能通过其他方式达到预期的结果?有什么想法吗? 输出到另一个表。仍然建议您只在 SELECT 查询中进行计算。 【参考方案1】:
  Dim strSQL As String

  strSQL = "UPDATE T05_Pr2_Null_Not_In_Rem " & _
           "SET " & _
           "  SAP = NULL, " & 
           "  SAG = NULL " & _
           "WHERE SAP = 1 AND SAG = 3;"
  CurrentDb.Execute strSQL, dbFailOnError

  strSQL = "UPDATE T05_Pr2_Null_Not_In_Rem " & _
           "SET " & _
           "  BAP = NULL, " & 
           "  BAG = NULL " & _
           "WHERE BAP = 1 AND BAG = 3;"
  CurrentDb.Execute strSQL, dbFailOnError

  strSQL = "UPDATE T05_Pr2_Null_Not_In_Rem " & _
           "SET " & _
           "  DEP = NULL, " & 
           "  DEG = NULL " & _
           "WHERE DEP = 1 AND DEG = 3;"
  CurrentDb.Execute strSQL, dbFailOnError

【讨论】:

更新每个 SQL 语句中的两个字段。不要费心打开记录集 - 因为您正在使用操作查询,所以这里没有做任何事情。使用 CurrentDb.Execute() 而不是 DoCmd.RunSQL() - 它不会提示用户记录将被更新,但如果发生错误会回滚。 太棒了!请为答案投票,以便其他有类似问题的人找到它。 我无法投票,因为我是 *** 的新成员,我没有足够的理由这样做....如果你可以投票这个问题,我也许可以投票给答案....谢谢

以上是关于使用 VBA 访问更新查询的主要内容,如果未能解决你的问题,请参考以下文章

访问 SQL Server 的 VBA 查询

使用 VBA 未打开表单时在访问中更新表单

访问VBA代码不将变量设置为查询值

访问 VBA:如何在表单中获取输入并在查询中使用它们

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

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