Как экспортировать данные из Excel в Access через Excel Macro, когда открыто несколько экземпляров Excel

Я использую макрос 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 в Access, независимо от того, открыты ли другие экземпляры Excel или нет.

Существует ли такая вещь, как основной экземпляр Excel (первый, который был открыт), который имеет особый статус? Есть ли способ предоставить конкретный экземпляр Excel, в котором находится книга, при вызове функции Access из Excel? Или есть более надежный способ передачи данных, который обычно позволяет избежать этой проблемы в нескольких случаях?

1 ответ

Решение

Я протестировал подход, который открывает Access db и запускает TransferSreadsheet. Не нужно устанавливать объект рабочей книги (ваш набор кодов, но даже не использует). Он работал без ошибок каждый раз. Я попытался установить объект Access Visible, но база данных появляется и сразу же закрывается, хотя импорт данных происходит. Установить справочную библиотеку: Microsoft Access xx 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

Пример кода Excel VBA, который экспортирует все строки листа в существующую таблицу в Access без открытия файла Access. Установка соединения ADODB делает доступным метод Execute. Этот подход работает быстрее. Установить справочную библиотеку: Microsoft ActiveX Data Objects xx 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
Другие вопросы по тегам