1

我在尝试从表单上的按钮运行一些 vba 脚本时遇到了一些麻烦。

通过链接的 MDB 文件,我编写了一系列 Make Table 查询,以帮助某些其他查询工作。我没有让用户一个接一个地重新运行每个单独的 Make Table 查询,而是将查询放在 VBA 脚本中(使用DoCmd.RunSQL),然后将该脚本分配给表单上的按钮。

我正在使用的数据源还有一个文件信息表,其中包含数据的文件名和文件日期。

当用户单击按钮时,我希望他们知道运行 Make Tables 查询字符串时使用的数据源;这样他们就知道脚本在哪些数据上运行。

我的方法是使用 File Info 表创建最终的 Make Table 查询,将文件名和文件日期放在它自己的表中。

然后我会将这些字段添加到表单中,并将DoCmd.RunSQL用于这个最终的 Make Table 查询添加到按钮的 VBA 脚本的底部;一旦所有的 Make Tables 都运行了,文件信息和文件日期字段将在表单上显示/更新,告诉用户上次运行脚本时使用了哪些数据文件。

这是此代码(为简洁起见,我将在 FileInfo 之前运行的所有 Make Table 脚本总结为一些虚假的“AllOtherMakeTables”字符串)

Private Sub Command0_Click()

On Error GoTo Err_Command0_Click

DoCmd.SetWarnings False

Dim AllOtherMakeTables As String
Dim FileInfoStamp As String

AllOtherMakeTables = " SELECT SomeField INTO AnotherTable" _
& " FROM SomeTable" _

FileInfoStamp = " SELECT FileInfo.FileName, FileInfo.FileDate INTO FileInfoStamp" _
& " FROM FileInfo;" _

DoCmd.RunSQL AllOtherMakeTables
DoCmd.RunSQL FileInfoStamp

DoCmd.SetWarnings True

Exit_Command0_Click:
Exit Sub

Err_Command0_Click:
    MsgBox Err.Description
    Resume Exit_Command0_Click

End Sub

使用上面的脚本单击按钮会产生以下错误消息:

数据库引擎无法锁定表“FileInfoStamp”,因为它已被其他人或进程使用

我认为正在发生的事情是我添加到表单中的字段(文件名和文件日期)在表单打开时锁定了 FileInfoStamp 表,因此当脚本尝试重新创建 FileInfoStamp 时,由于表被锁定,因此无法执行此操作。

我认为这可以通过在上述脚本的开头添加一个DoCmd.Close然后在脚本末尾添加一个DoCmd.OpenForm来解决(本质上是在运行 Make Table 命令然后重新打开时关闭表单最后的表格)。

所有这一切都是关闭表单并显示相同的错误消息。所以我猜即使表单“关闭”了与表单上字段的连接仍然以某种方式保持活动状态(...?)

任何有关我如何解决此问题的帮助将不胜感激。谢谢你。

4

1 回答 1

0

不要FileInfoStamp每次都重新创建。请改用以下两个步骤:

  1. 丢弃现有行
  2. 追加新数据
Dim db As DAO.database
Dim FileInfoStamp As String

FileInfoStamp = "INSERT INTO FileInfoStamp(FileName, FileDate)" & vbCrLf & _
    "SELECT fi.FileName, fi.FileDate FROM FileInfo AS fi;"
Debug.Print FileInfoStamp

Set db = CurrentDb
' empty out FileInfoStamp
db.Execute "DELETE FROM FileInfoStamp;", dbFailOnError
' add new data to FileInfoStamp
db.Execute FileInfoStamp, dbFailOnError
Set db = Nothing

添加一个错误处理程序来处理从dbFailOnError.

代替DoCmd.RunSQL,对您的其他查询使用 DAO 数据库.Execute方法。使用这种方法,您将没有任何使用DoCmd.SetWarnings False. 关闭是不明智SetWarnings的,因为它会抑制诊断问题所需的信息。

于 2013-03-06T15:53:52.970 回答