Ms access 将Excel Listobject导入Access表
我有一个Access数据库,其表名为InventoryAvail。我想按下Access中的一个按钮,从特定的Excel文件导入特定的Listobject,以填充InventoryAvail表 我需要在按钮的事件中添加什么vba代码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
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模式)中尝试此查询。如果它给出了错误,则说明语法有问题