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

Open Access 97 MDB in Excel 2016 VBA - Trouble with my script

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

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

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")). _
        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 本身。

我找到了解决我自己问题的方法,所以我发帖可能会帮助处于类似情况的其他人。

A​​ccess 97 MDB 确实可以在 Office 2016 中使用,首先您需要下载 Microsoft Access Database Engine 2010。安装完成后,打开 MDB 文件,将弹出数据 Link 属性 window。 Select Microsoft OLEDB Jet 4.0 从 Provider 列表然后在连接选项卡下输入路径和安全信息。点击确定,即可成功打开。

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

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}

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