将Excel Listobject导入Access表

时间:2018-06-01 21:22:45

标签: vba ms-access access-vba ms-access-2007 listobject

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

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

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

Excel文件名为广告资源,位于我的桌面上。工作表名为广告资源。 Listobject名为可用,有两列:Part, Qty

InventoryAvail 表格有两列:PartNumberQuantity

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

2 个答案:

答案 0 :(得分:4)

你是对的,由于某种原因,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

答案 1 :(得分:1)

如果您只知道ListObject名称,除了打开Excel文件之外没有其他方法,如 @dbmitch 答案中所述,但如果您知道ListObject范围,则只能将此范围内的数据传输到你的表没有使用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];

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