将 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 有两列:PartNumber
和 Quantity
。
我需要将来自 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范围,但不完全相同
我有一个 Access 数据库,其中 table 名为 InventoryAvail。我想在 Access 中按下一个按钮并从特定的 Excel 文件导入特定的 Listobject 以填充 InventoryAvail table.
我需要在按钮的事件中添加什么 vba 代码?
Docmd.Transferspreadsheet
将不起作用,因为我不想要电子表格中的所有数据,我只想要特定 Listobject 中的内容。
Excel 文件名为 Inventory,位于我的桌面上。该工作表名为 Inventory。
Listobject 名为 Available 并且有两列:Part, Qty
.
InventoryAvail table 有两列:PartNumber
和 Quantity
。
我需要将来自 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范围,但不完全相同