首页 > 解决方案 > 访问查询不会在工作簿关闭时运行

问题描述

我在关闭 Excel 工作簿时尝试运行 Access 删除查询。我希望 DELETE 查询删除“ResDate”字段中今天日期之前的任何记录。下面是我写的代码。工作簿关闭,但记录仍保留在数据库(TR 表)中。

我认为这会奏效,但到目前为止我还是很成功。任何有关使其正常工作的建议将不胜感激。谢谢您的帮助...……。

Const ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=H:\MyDatabase\TRC.mdb;Persist Security Info=False"

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Set Connection = New ADODB.Connection
    Connection.ConnectionString = ConnectionString
    Connection.Open

    VSQL = "DELETE * FROM [TR] WHERE [TR].ResDate < " & Date

    Set RecSet1 = Connection.Execute(VSQL, dbrows, adCmdText)

    Connection.Close

    Set RecSet1 = Nothing

End Sub

标签: excelvbams-access

解决方案


始终使用参数!

当您这样做时VSQL = "DELETE * FROM [TR] WHERE [TR].ResDate < " & Date,根据您的语言环境,这可能会导致几个问题。

例如DELETE * FROM [TR] WHERE [TR].ResDate < 2019-11-08,, 和 2019 减去 11 减去 08 等于 2000 并且CDate(2000)是 1905-06-22,所以这是一个有效的查询,但可能不会删除您要删除的内容。

在备用语言环境中,它可能是 2019 年 8 月 11 日,而 11 除以 8 除以 2019 大约是 0 并且CDATE(0)是 1899-12-30。

相反,选择如何在 Microsoft Access 的不同上下文中使用 VBA 中的参数?, 例如:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Set Connection = New ADODB.Connection
    Connection.ConnectionString = ConnectionString
    Connection.Open

    VSQL = "DELETE * FROM [TR] WHERE [TR].ResDate < " & Date
    With CreateObject("ADODB.Command")
         Set .ActiveConnection = Connection
         .CommandText = "DELETE * FROM [TR] WHERE [TR].ResDate < ?"
         Set RecSet1 = .Execute(, Array(Date))
    End With
    Connection.Close

    Set RecSet1 = Nothing

End Sub

推荐阅读