【问题标题】:Opening Access Db without VBA code running在没有运行 VBA 代码的情况下打开 Access Db
【发布时间】: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

【问题讨论】:

    标签: vba excel ms-access


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        相关资源
        最近更新 更多