当 Excel 的多个实例打开时,如何通过 Excel 宏将数据从 Excel 导出到 Access

How to export data from Excel to Access via Excel Macro when multiple instances of Excel are open

我正在使用 Excel 宏定义 Excel 中的数据范围,然后调用 "objAccess.DoCmd.TransferSpreadsheet" 将该范围内的数据导入 Access table。此导入并非始终有效。

我得出的结论是,当只有一个 Excel 打开时,宏可以正常工作。但是,当另一个实例已打开时,数据导入失败。在后一种情况下,Access 数据库打开,Excel 文件,我从中 运行 宏在另一个 Excel 实例中重新打开(以只读模式)。没有实际错误,但没有执行所需的导入。为什么会这样?

Sub Excel_2_Access()

    Dim strPath As String
    Dim strwbPath As String
    Dim strRange As String
    Dim objAccess As Access.Application
    Dim wbActive As Workbook

'get database path
    strPath = Worksheets("error").Range("Access_DB_Path").Value & "\" & Worksheets("error").Range("Access_DB").Value

'open database
    Set objAccess = New Access.Application
    Call objAccess.OpenCurrentDatabase(strPath)
    objAccess.Visible = True

'access import
    Worksheets("error").Columns("P:P").Calculate
    Set wbActive = ActiveWorkbook
    strwbPath = Application.ActiveWorkbook.FullName
    strRange = "error!M2:M" & (Worksheets("error").Range("WKN_count").Value + 2)
    Call objAccess.DoCmd.TransferSpreadsheet(acImport, 8, "WKN_Mapping", strwbPath, True, strRange)
    objAccess.Forms("MX_Import").Refresh

End Sub

由于宏相当短,我已经包含了完整的代码供您参考。但是,我认为指定范围或提供名称的方式与问题无关。

期望的结果是有一个 Excel 宏来执行从 Excel 到 Access 的传输,无论 Excel 的其他实例是否打开.

有没有Excel的主实例(第一个打开的)这种东西有特殊的地位?从 Excel 调用 Access 函数时,有没有办法提供工作簿所在的特定 Excel 实例?或者是否有更可靠的数据传输方式,通常可以避免多个实例出现此问题?

我测试了打开 Access 数据库并运行 T运行sferSreadsheet 的方法。不需要设置工作簿对象(您的代码集但随后甚至不使用)。它 运行 每次都没有错误。我尝试将 Access 对象设置为可见,但数据库出现并立即关闭,尽管确实发生了数据导入。设置参考库:Microsoft Access x.x 对象库。

Sub test()
Dim ac As Access.Application, strRange As String
Set ac = New Access.Application
strRange = "Sheet1!A1:E3"
ac.OpenCurrentDatabase "C:\Users\June\LL\Umpires.accdb"
ac.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Rates", ThisWorkbook.FullName, True, strRange
End Sub

示例 Excel VBA 无需打开 Access 文件即可将工作表的所有行导出到 Access 中现有 table 的代码。设置 ADODB 连接使 Execute 方法可用。这种方法运行得更快。设置参考库:Microsoft ActiveX 数据对象 x.x 库。

Sub test()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 8.0"
cn.Execute "INSERT INTO Rates(RateLevel, Rate, Pos, EffDate) IN 'C:\Users\June\LL\Umpires.accdb' " & _
           "SELECT RateLevel,Rate,Pos,EffDate FROM [Sheet1$];"
cn.Close
Set cn = Nothing
End Sub