Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 将Excel Listobject导入Access表_Ms Access_Vba_Ms Access 2007_Listobject - Fatal编程技术网

Ms access 将Excel Listobject导入Access表

Ms access 将Excel Listobject导入Access表,ms-access,vba,ms-access-2007,listobject,Ms Access,Vba,Ms Access 2007,Listobject,我有一个Access数据库,其表名为InventoryAvail。我想按下Access中的一个按钮,从特定的Excel文件导入特定的Listobject,以填充InventoryAvail表 我需要在按钮的事件中添加什么vba代码 Docmd.Transferspreadsheet将不起作用,因为我不需要电子表格中的所有数据,我只需要特定Listobject中的数据 Excel文件名为库存,位于我的桌面上。工作表名为库存。 Listobject名为Available,有两列:部分,数量 Inve

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

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

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

Excel文件名为库存,位于我的桌面上。工作表名为库存。 Listobject名为Available,有两列:
部分,数量

InventoryAvail表有两列:
PartNumber
Quantity


我需要将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

如果您只知道ListObject名称,则除了打开Excel文件(如@dbmitch答案中所述)之外,没有其他方法,但是如果您知道ListObject范围,则可以仅将此范围内的数据传输到表中,而无需使用
Excel。应用程序
对象,只需使用如下选择:

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];
这将比通过对象的速度快得多

更新

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

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

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

需要更多详细信息-tabledef、Listobject snapshot和何处去的描述?这些都不在你的问题中,所以很难形成一个答案。我补充了一些细节。请告诉我是否还有其他帮助。工作表的名称是什么?很好-因此,在不打开Excel的情况下,绝对无法获取区域名称?有可能,只需按名称指定命名区域
[$RangeName]
。更新了答案。很好-这是一个很好的答案-谢谢分享我会使用DoCmd.RunSQL来尝试吗?现在我得到了:
sqlUpdate=“INSERT INTO InventoryAvail(PartNumber,Quantity)在'C:\Users\AHaws\Desktop\Inventory.xlsx'[Excel 12.0;HDR=YES;IMEX=0];“DoCmd.RunSQL sqlUpdate
它给了我一个关于找不到对象[$Available]的错误,这可能是因为我不正确地使用了引号?在VBA中使用SQL之前,请在query Bulider(SQL模式)中尝试此查询。如果它给出了错误,则说明语法有问题