代码之家  ›  专栏  ›  技术社区  ›  Hawsidog

将Excel Listobject导入Access表

  •  4
  • Hawsidog  · 技术社区  · 6 年前

    我有一个Access数据库和一个名为 资源清册 .我想按下Access中的按钮,从特定Excel文件中导入特定的Listobject来填充 资源清册 桌子

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

    Docmd.Transferspreadsheet 不会工作,因为我不需要电子表格中的所有数据,我只需要特定Listobject中的数据。

    Excel文件名为 库存 并驻留在我的桌面上。工作表名为 库存 . Listobject被命名为 可获得的 有两列: Part, Qty .

    这个 资源清册 表有两列: PartNumber Quantity .

    我需要Excel列表对象中的数据 可获得的 要导入到Access表中 资源清册

    2 回复  |  直到 6 年前
        1
  •  4
  •   dbmitch    6 年前

    出于某种原因,你是对的 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
    
        2
  •  1
  •   Sergey S.    6 年前

    如果您只知道ListObject名称,那么除了打开Excel文件之外,没有其他方法,如中所述 @巴米奇 答案是,但是如果您知道ListObject范围,那么您可以只将该范围内的数据传输到表中,而不使用 Excel.Application 对象,只需使用如下选择:

    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];
    

    请注意,这种语法适用于命名范围,对于表,这种类型的数据选择不起作用。如果指定给与表相同的范围,则命名范围也不起作用。但可以定义命名范围,其中包括表范围,但不完全相同

    推荐文章