将 Excel 列表对象导入 Access table

Importing an Excel Listobject into an Access table

我有一个 Access 数据库,其中 table 名为 InventoryAvail。我想在 Access 中按下一个按钮并从特定的 Excel 文件导入特定的 Listobject 以填充 InventoryAvail table.

我需要在按钮的事件中添加什么 vba 代码?

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

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

InventoryAvail table 有两列:PartNumberQuantity

我需要将来自 Excel Listobject Available 的数据导入到 Access table InventoryAvail

您是对的,由于某些原因 DoCmd.TransferSpreadsheet 不适用于命名范围。我能够通过从中提取地址来破解它一次,但我必须打开工作簿。

无论如何我都找不到打开工作簿的方法

这应该适合你。

步骤:

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

这是代码

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

如果您只知道 ListObject 名称,除了打开 Excel 文件外别无他法,如 @dbmitch 回答中所述,但如果您知道 ListObject 范围,您可以将此范围内的数据仅传输到您的 table,而无需使用 Excel.Application 对象,只需像这样使用 SELECT:

INSERT INTO InventoryAvail (PartNumber, Quantity) 
SELECT *
  FROM [Inventory$D3:E24] 
    IN "C:\Users\YourName\Desktop\Inventory.xlsx" [Excel 12.0;HDR=YES;IMEX=0];

这将比通过对象更快地工作

更新

刚刚发现,可以按名称查询命名范围。语法如下:

INSERT INTO InventoryAvail (PartNumber, Quantity) 
SELECT *
  FROM [Available] 
    IN "C:\Users\YourName\Desktop\Inventory.xlsx" [Excel 12.0;HDR=YES;IMEX=0];

请注意,此语法适用于命名范围,对于 tables 此类数据选择不起作用。如果将命名范围分配给与 table 相同的范围,则命名范围也将不起作用。但是可以定义命名范围,其中包括table范围,但不完全相同