You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:00:38