簡體   English   中英

使用 DoCmd.TransferSpreadsheet 將數據添加到 MS Access 時如何過濾列?

[英]How to filter columns when adding data into MS Access using DoCmd.TransferSpreadsheet?

我有一個帶有兩張紙的 excel 文件。 第一個我想將整個工作表添加到 MS Access 表中 - 到目前為止,這段代碼正在實現這一點。 但是對於第二張表(sheet2),我希望能夠過濾列並從該表創建兩個表。 所以我想從列 A1:B1,E1:F1 中創建第一個表范圍,並包括它下面行中的任何數據。 然后對於另一個表,我希望列是 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。

我試圖做的是通過將 A1:B1,E1:F1 添加到 Range 區域(Sheet2: 所在的位置)來過濾它,如下所示:

    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet2", _
        Me.txtFileName, True, "A1:B1,E1:F1"

但是當我運行該代碼時,它告訴我:“Microsoft Access 引擎找不到 object "A1:B1,E1:F1" - 我認為它不允許像這樣的多范圍。

另一個問題是,當我只使用“A1:B1”時,它只會返回列,而它下面的行中沒有任何數據。

如何從 Sheet2 創建兩個表,第一個表是 A1:B1,E1:F1,第二個表是 C1:D1?

謝謝

編輯:在 June7 的幫助下,解決方案是添加一個 currentDb(),然后從中執行刪除特定字段名稱的 SQL 查詢:

If FSO.FileExists(Nz(Me.txtFileName, "")) Then
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet2", _
        Me.txtFileName, True, "Sheet2!"
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Sheet3", _
        Me.txtFileName, True, "Sheet3!"

Set dbs = CurrentDb()
dbs.Execute "ALTER TABLE Sheet3 DROP COLUMN a_field_name"

Else
    MsgBox "File not found"
End If

結束子

導入完整的工作表,然后修改表格。 選項:

  1. 如果結果字段名稱已知,則將完整范圍導入 Table1,然后使用 SQL 操作語句:
CurrentDb.Execute "SELECT Field3, Field4 INTO Table2 FROM Table1"`  
CurrentDb.Execute "ALTER TABLE Table1 DROP COLUMN Field3, Field4"
  1. 如果字段名稱未知,則將完整范圍導入表 1,將范圍 C:D 導入表 2。 然后使用 DAO TableDefs 從 Table1 中刪除不需要的字段。
For x = 2 to 3
CurrentDb.TableDefs("Table1").Fields.Delete CurrentDb.TableDefs("Table1").Fields(x).Name
Next

但是,由於您似乎真的想對同一個表執行多個導入,建議將完整范圍導入“臨時”表,然后使用 SQL INSERT SELECT 操作將記錄“移動”到永久表。 臨時表可以是永久的,並且在每個導入過程之前刪除記錄,也可以刪除和創建表。 也許遍歷所有 1,000 個工作簿以導入每個然后在外部循環執行 INSERT SELECT 操作以拆分為永久表並刪除臨時表。 取決於涉及多少條記錄,以及 memory 是否可以處理 SQL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM