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

Posted

技术标签:

【中文标题】打开多个 Excel 实例时如何通过 Excel 宏将数据从 Excel 导出到 Access【英文标题】:How to export data from Excel to Access via Excel Macro when multiple instances of Excel are open 【发布时间】:2019-01-04 16:01:47 【问题描述】:

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

我得出的结论是,当只有一个 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 宏执行从 Excel 到 Access 的传输。

是否存在具有特殊状态的 Excel 的主实例(打开的第一个实例)?从 Excel 调用 Access 函数时,有没有办法提供工作簿所在的特定 Excel 实例?或者有没有更可靠的方法来传输数据,通常可以避免多个实例的这个问题?

【问题讨论】:

更简单的解决方案是查看ADO 做同样的事情,大约3/4行代码就可以完成,无需打开访问对象。 ***.com/questions/38268657/… 尝试使用宏记录器记录您的步骤,看看 Excel 是如何做到的。 您声明它有时会起作用,除非打开多个实例......完全限定您的对象。避免使用 Activeworkbook,因为您无法保证 Activeworkbook 是正确的。如果数据来自运行宏的同一工作簿,则使用 ThisWorkbook。 exceltip.com/import-and-export-in-vba/… 和 askeygeek.com/vba-code-to-export-excel-data-to-access 【参考方案1】:

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

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

将所有工作表行导出到 Access 中的现有表而不打开 Access 文件的示例 Excel VBA 代码。设置 ADODB 连接使 Execute 方法可用。这种方法运行速度更快。设置参考库:Microsoft ActiveX Data Objects x.x Library。

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

【讨论】:

为了使建议的 ADODB 选项起作用,我必须激活相应的 VBA 引用,如下所述: 在 VBA 窗口中选择工具 - 引用...并激活“Microsoft ActiveX 数据对象 2.8 库”和“Microsoft ActiveX 数据对象记录集 2.8 库”。 其实只需要第一个即可。或者在代码中使用后期绑定。

以上是关于打开多个 Excel 实例时如何通过 Excel 宏将数据从 Excel 导出到 Access的主要内容,如果未能解决你的问题,请参考以下文章

打开excel时,提示更新链接

启动了多个 Excel 实例后,如何获取所有这些实例的应用程序对象?

启动了多个 Excel 实例后,如何获取所有这些实例的应用程序对象?

打开多个excel文件,如何显示在前端

excel表格打开不能读取数据的解决教程

excel中使用vba以只读方式打开工作薄的操作方法