我在使用某个vba脚本时遇到了一些麻烦,我试图从表单上的按钮运行。
通过链接的MDB文件,我编写了一串Make Table查询,帮助某些其他查询工作。我没有让用户逐个重新运行每个Make Table查询,而是将查询放在VBA脚本中(使用 DoCmd.RunSQL ),然后将该脚本分配给按钮在表格上。
我正在使用的数据源还有一个文件信息表,其中包含数据的文件名和文件日期。
当用户点击按钮时,我希望他们知道在运行Make Tables查询字符串时使用了什么数据源;这样他们就知道脚本运行的是什么数据。
我的方法是使用文件信息表创建一个最终的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',因为它是 已被其他人或过程使用
我认为发生的事情是我添加到表单中的字段(FileName和FileDate)在表单打开时锁定FileInfoStamp表,因此当脚本尝试重新创建FileInfoStamp时,它无法像表那样执行此操作被锁定了。
我认为只需在上述脚本的开头添加 DoCmd.Close ,然后在脚本末尾添加 DoCmd.OpenForm 即可解决此问题。 (基本上在运行Make Table命令时关闭表单,然后在结束时重新打开表单)。
所有这些确实关闭了表单并显示相同的错误消息。所以我猜即使表单“关闭”,表单上字段的连接仍然以某种方式保持活动状态(...?)
任何有关我如何解决这个问题的帮助都将非常感激。谢谢。
答案 0 :(得分:0)
每次都不要重新创建FileInfoStamp
。改为使用以下两个步骤:
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
是不明智的,因为它会抑制诊断问题所需的信息。