在没有运行 VBA 代码的情况下打开 Access Db
Posted
技术标签:
【中文标题】在没有运行 VBA 代码的情况下打开 Access Db【英文标题】:Opening Access Db without VBA code running 【发布时间】:2014-10-28 22:30:31 【问题描述】:我正在构建一个工具,用于提取和比较同一数据库的 2 个版本之间的 VBA 代码模块。该工具正在 Excel VBA 中构建。
不幸的是,这些数据库在打开时往往会在屏幕上显示消息框,并且通常会在关闭时提示压缩数据库。这意味着当我尝试打开数据库以获取 VBA 代码时,Excel VBA 代码会挂起,直到 Access 消息框得到响应。
但是,奇怪的是,我发现当我逐步通过 Excel VBA 代码打开数据库时,不会出现打开和关闭消息,并且我能够毫无问题地提取所有 VBA 代码模块。
有没有什么方法可以像这样打开 Access 数据库而无需触发 Access VBA 代码,但无需我在 Excel 中单步执行代码?我用来连接数据库的代码是:
Set dbLatest = New Access.Application
dbLatest.OpenCurrentDatabase LatestDatabasePath
Set projLatest = dbLatest.VBE.ActiveVBProject
Set dbPrevious = New Access.Application
dbPrevious.OpenCurrentDatabase PreviousDatabasePath
Set projPrevious = dbLatest.VBE.ActiveVBProject
【问题讨论】:
【参考方案1】:感谢 dmc2005 在this thread 上的回答,我设法通过在DAO DBEngine
上调用OpenDatabase
来解决这个问题,这不会触发任何打开事件,但允许我通过@ 暂时禁用启动表单987654324@ 财产。然后我提取我的 VBA 代码并重新应用启动表单。
禁用启动表单:
' Disable start up forms, but store names so they can be re-applied
Set dbe = New DBEngine
Set db = dbe.OpenDatabase(LatestDatabasePath)
On Error Resume Next
strStartUpFormLatest = db.Properties("StartUpForm")
On Error GoTo ErrorTrap
If Not strStartUpFormLatest = "" Then _
db.Properties("StartUpForm") = "(None)"
db.Close
Set db = dbe.OpenDatabase(PreviousDatabasePath)
On Error Resume Next
strStartUpFormPrevious = db.Properties("StartUpForm")
On Error GoTo ErrorTrap
If Not strStartUpFormPrevious = "" Then _
db.Properties("StartUpForm") = "(None)"
db.Close
完成后重新应用它们:
' Reapply StartUpForms
If Not strStartUpFormLatest = "" Then
Set db = dbe.OpenDatabase(LatestDatabasePath)
db.Properties("StartUpForm") = strStartUpFormLatest
db.Close
End If
If Not strStartUpFormPrevious = "" Then
Set db = dbe.OpenDatabase(PreviousDatabasePath)
db.Properties("StartUpForm") = strStartUpFormPrevious
db.Close
End If
幸运的是,我无需担心任何 AutoExec 宏,但似乎通过更多努力也可以使用这些宏完成类似的操作。
【讨论】:
【参考方案2】: Dim Suffix As String
Dim MyFileName As String
MyConn2 = MyDBPath & "CompactDB.accdb"
MyFileName = Left(MyDBFile, Len(MyDBFile) - 6)
Suffix = ".laccdb"
strLckFile = MyFileName & Suffix
'this is to compact the database
Set objEngine = CreateObject("DAO.DBEngine.120")
Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not (objFSO.FileExists(strLckFile)) Then
' If (objFSO.FileExists(strBackup)) Then
' objFSO.DeleteFile strBackup
' End If
If (objFSO.FileExists(MyConn2)) Then
objFSO.DeleteFile MyConn2
End If
'objFSO.CopyFile strSrcName, strBackup
''dbVersion120 = 128
objEngine.CompactDatabase MyConn, MyConn2, , 128
objFSO.DeleteFile MyConn
objFSO.MoveFile MyConn2, MyConn
End If 'LckFile
【讨论】:
以上是关于在没有运行 VBA 代码的情况下打开 Access Db的主要内容,如果未能解决你的问题,请参考以下文章
Access VBA 中的运行时 3464。尝试使用 SQL 选择语句打开记录集
在文件夹中的所有 Access 文件中运行 Access VBA