如何通过DoCmd.TransferSpreadsheet在Access导入数据时筛选列
问题:拆分Excel工作表导入为多个Access表
我有一个包含两个工作表的Excel文件,其中第一个工作表已能通过代码完整导入到MS Access表,但需要对第二个工作表(Sheet2)做列筛选,拆分生成两个Access表:
- 表1:包含A1:B1、E1:F1列及下方所有数据
- 表2:包含C1:D1列及下方所有数据
当前实现的导入代码
嵌入在Access窗体导入按钮中的代码如下:
Private Sub btnImportSpreadsheet_Click() Dim FSO As New FileSystemObject If FSO.FileExists(Nz(Me.txtFileName, "")) Then DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet1", _ Me.txtFileName, True, "Sheet1!" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet2", _ Me.txtFileName, True, "Sheet2!" Else MsgBox "File not found" End If End Sub
点击导入按钮后,Access中会生成Sheet1和Sheet2两个完整表。
尝试过的无效方法
我曾尝试在Range参数中填写"A1:B1,E1:F1"来筛选列,代码如下:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet2", _ Me.txtFileName, True, "A1:B1,E1:F1"
但运行时提示**"Microsoft Access引擎无法找到对象"A1:B1,E1:F1""**,推测TransferSpreadsheet不支持多区域选择。另外仅使用"A1:B1"时,只会导入列标题,不会导入下方数据。
解决方案(基于June7的帮助)
思路是先完整导入Sheet2两次到不同的Access表,再通过SQL语句删除每个表中不需要的列。修正后的代码如下:
Private Sub btnImportSpreadsheet_Click() Dim FSO As New FileSystemObject Dim dbs As DAO.Database If FSO.FileExists(Nz(Me.txtFileName, "")) Then ' 完整导入Sheet1 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet1", _ Me.txtFileName, True, "Sheet1!" ' 完整导入Sheet2到两个目标表 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet2_Table1", _ Me.txtFileName, True, "Sheet2!" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet2_Table2", _ Me.txtFileName, True, "Sheet2!" ' 清理第一个表:删除C、D列(替换为实际字段名) Set dbs = CurrentDb() dbs.Execute "ALTER TABLE Sheet2_Table1 DROP COLUMN C列对应字段名" dbs.Execute "ALTER TABLE Sheet2_Table1 DROP COLUMN D列对应字段名" ' 清理第二个表:删除A、B、E、F列(替换为实际字段名) dbs.Execute "ALTER TABLE Sheet2_Table2 DROP COLUMN A列对应字段名" dbs.Execute "ALTER TABLE Sheet2_Table2 DROP COLUMN B列对应字段名" dbs.Execute "ALTER TABLE Sheet2_Table2 DROP COLUMN E列对应字段名" dbs.Execute "ALTER TABLE Sheet2_Table2 DROP COLUMN F列对应字段名" Set dbs = Nothing Else MsgBox "File not found" End If End Sub
注意:需要将代码中的
C列对应字段名等占位符替换为Sheet2导入后实际生成的字段名称(通常是Excel列标题或默认的Field1、Field2等)。
内容的提问来源于stack exchange,提问作者joelion2
相关产品推荐
相关产品推荐

