我有一个名为InventoryAvail的表的Access数据库。我想按Access中的一个按钮,然后从特定的Excel文件导入特定的Listobject来填充InventoryAvail表。

我需要在按钮的事件上添加哪些VBA代码?

Docmd.Transferspreadsheet将不起作用,因为我不想要电子表格中的所有数据,我只想要特定ListObject中的数据。

Excel文件称为Inventory,位于我的桌面上。该工作表名为清单。
Listobject的名称为Available,有两列:Part, Qty

InventoryAvail表具有两列:PartNumberQuantity

我需要将Excel Listobject中的数据可用导入到Access表InventoryAvail中

最佳答案

没错,由于某些原因,DoCmd.TransferSpreadsheet不适用于命名范围。我曾经能够通过从地址中提取地址来对其进行破解,但是我不得不打开工作簿。

无论如何,我看不到打开工作簿的方法

这应该为您工作。

脚步:


打开电子表格
将列表框数据读入数组
使用表打开记录集
使用AddNew方法将每行数据传递到表中
清理


这是代码

Public Sub AddInventory()

On Error GoTo Err_Handler

    Const IMPORT_TABLE  As String = "InventoryAvail"

    Const IMPORT_FILE   As String = "yourspreadsheetfullpathname"
    Const SHEET_NAME    As String = "Sheet1"
    Const LISTBOX_NAME  As String = "List1"

    Dim xlApp       As Object
    Dim xlBook      As Object
    Dim rs          As DAO.Recordset

    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.WorkBooks.Open(IMPORT_FILE, , True) ' open as readonly

    Dim xlList      As Variant
    Dim intRow      As Integer

    ' creates an array from ListObject values
    xlList = xlBook.Worksheets(SHEET_NAME).ListObjects(LISTBOX_NAME).DataBodyRange.Value

    xlBook.Close
    xlApp.Quit
    Set xlApp = Nothing

    Set rs = CurrentDb.OpenRecordset(IMPORT_TABLE)
    With rs
        For intRow = LBound(xlList) To UBound(xlList)
            Debug.Print xlList(intRow, 1) & ": " & xlList(intRow, 2)
            .AddNew
            .Fields(0).Value = xlList(intRow, 1)
            .Fields(1).Value = xlList(intRow, 2)
            .Update
        Next intRow
        .Close
    End With

    Set rs = Nothing
    Exit Sub

Err_Handler:
    MsgBox Err.Description

End Sub

07-26 02:07