Search code examples
excelvbams-accessimport-from-excel

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


I am using an Excel macro to define a data range in Excel and then call "objAccess.DoCmd.TransferSpreadsheet" to import the data from this range into an Access table. This import does not work all of the time.

I have come to the conclusion that the macro works fine when there is only one instance of Excel open. However, the data import fails when another instance is already open. In the latter case the Access database opens up and the Excel file from which I run the macro is being reopened (in read-only mode) in the other Excel instance. There is no actual error but the desired import is not being carried out. Why does this happen?

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

As the macro is fairly short I have included the entire code for your reference. However, I don't think the way the range is specified or names are provided is really relevant to the question.

The desired outcome would be to have an Excel macro in place that carries out the transfer from Excel to Access no matter if there are other instances of Excel open or not.

Is there such a thing as the primary instance of Excel (the first one that was opened) which has a special status? Is there a way to provide the specific Excel instance the workbook is in when calling the Access function from Excel? Or is there a more reliable way to transfer the data which generally avoids this problem with multiple instances?


Solution

  • I tested approach that opens Access db and runs TransferSreadsheet. Don't need to set a workbook object (your code sets but then doesn't even utilize). It ran without error every time. I tried setting the Access object Visible but the database appears and immediately closes anyway, although the data import does happen. Set reference libarary: 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
    

    Example Excel VBA code that exports all rows of worksheet to existing table in Access without opening Access file. Setting an ADODB connection makes the Execute method available. This approach runs faster. Set reference library: 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