在 Excel 2016 VBA 中打开 Access 97 MDB - 我的脚本有问题

问题描述

我公司最近将 Office 2010 升级到了 2016,这打破了前员工所做的一些自动化。我们正在运行一些使用 Access 97 的旧软件,并每天导出某些表。

我已经知道如何在 Excel 2016 中打开数据库,但是当我更新宏以匹配设置时脚本挂起,因为数据链接属性打开以选择设置而不是使用脚本中设置的设置.这是脚本,非常感谢任何帮助。

Sub WebAdsExcelMacro()

' Don't show confirmation window
Application.displayAlerts = False

'
' WebAdsExcelMacro Macro
'
' Keyboard Shortcut: Ctrl+q
'
    Workbooks.Add
    With ActiveSheet.ListObjects.Add(SourceType:=0,Source:=Array( _
        "OLEDB;Provider=Microsoft.Jet.Oledb.4.0;Data Source=X:\Database\Path\DB.mdb;Password=;User ID=Admin;Mode=Sh" _,_
        "are Deny Write;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet" _,_
        " OLEDB:Engine Type=4;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;" _,_
        "Jet OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't copy " _,_
        "Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;" _,"Jet OLEDB:Bypass UserInfo Validation=False"),Destination:=Range("$A$1")). _
        QueryTable
        .CommandType = xlCmdTable
        .CommandText = Array("Categories")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .sourceDataFile = "X:\Database\Path\DB.mdb"
        .ListObject.displayName = "Table_Web"
        .Refresh BackgroundQuery:=False
    End With
    Range("E1").Select
    ActiveCell.FormulaR1C1 = "Title"
    Range("F1").Select
    ActiveCell.FormulaR1C1 = "Desc"
    Columns("C:C").Select
    Selection.Replace What:=". ",Replacement:=",",LookAt:=xlPart,_
        SearchOrder:=xlByRows,MatchCase:=False,SearchFormat:=False,_
        ReplaceFormat:=False
    Range("E2").Select
    ActiveCell.FormulaR1C1 = "=LEFT(RC[-2],FIND("","",RC[-2])-1)"
    Range("F2").Select
    ActiveCell.FormulaR1C1 = "=RIGHT(RC[-3],LEN(RC[-3])-FIND("",RC[-3]))"
    Range("A3").Select
    Dim WebFolder As String
    WebFolder = Environ$("USERPROFILE") & "\Save\Path\"
    LatestWebFolder = Environ$("USERPROFILE") & "\Save\Path\Latest\"
    If Len(Dir(WebFolder,vbDirectory)) = 0 Then MkDir WebFolder
    If Len(Dir(LatestWebFolder,vbDirectory)) = 0 Then MkDir LatestWebFolder
    ChDir LatestWebFolder
    ActiveWorkbook.SaveAs Filename:= _
        LatestWebAdsFolder & "Web.csv",FileFormat:=xlCSV,_
        CreateBackup:=False
        
ThisWorkbook.Saved = True

For Each w In Application.Workbooks
w.Save
Next w
Application.Quit

End Sub

解决方法

Office 2013 及后续版本 (source) 中已取消对 Access 97 mdb 的支持。

要么降级回 Office 2010,要么将数据库转换为 accdb 或更现代的 mdb 文件格式。

您可以阅读here如何将 Access 97 文件转换为更现代的 mdb 格式版本,但它需要 Office 2003 的副本。使用 Access 2007 数据库引擎的副本,您还可以执行转换,但它需要一些 VBA(使用 DBEngine.CompactDatabasedbVersion40),并且不支持同时安装 Access 数据库引擎和 Access 本身。

,

我找到了解决自己问题的方法,所以我发帖是为了帮助遇到类似情况的其他人。

Access 97 MDB 在 Office 2016 中有效,首先您需要下载 Microsoft Access Database Engine 2010。安装后打开 MDB 文件,将弹出数据链接属性窗口。从提供程序列表中选择 Microsoft OLEDB Jet 4.0,然后在连接选项卡下输入路径和安全信息。点击确定,它将成功打开。

之后您可以使用自动热键脚本以编程方式自动化。

Run,EXCEL.exe,C:\Program Files (x86)\Microsoft Office\root\Office16,max,ahk_excel
WinWait ahk_pid %ahk_excel%
sleep,2000
send ^q ; This is my Excel macro hotkey for my VBA script which opens my mdb file,normally my VBA script would hang here because it wouldn't pass along the OLEDB Provider info.
sleep 1000
send +{TAB}
send {LEFT}
send {TAB}
send {UP}
send {TAB}
send {SPACE}
send X:\Database.mdb
send {TAB}
send {TAB}
send {TAB}
send {TAB}
send {TAB}
send {TAB}
send {ENTER}
sleep 5000
send {ENTER}

我不知道这是否对其他人有帮助,但它满足了我的需求。