在没有运行 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 发送 SQL 查询时停止运行

Access VBA 中的运行时 3464。尝试使用 SQL 选择语句打开记录集

在文件夹中的所有 Access 文件中运行 Access VBA

有没有办法用 vba 在 MS-Access 中截屏?

如何在当前打开的数据库上通过 excel VBA 运行访问宏?

Access vba:如何打开系统消息或提示?