2016-09-28 75 views
0

我有一個龐大的數據集,我需要從Excel導入Access(〜800k行)。但是,我可以忽略具有特定列值的行,這些值與實際數據集的90%相同。所以實際上,我只需要輸入10%的線。將大數據集導入Excel中通過VBA訪問

在過去,我已經導入Excel文件一行一行地以下列方式(僞代碼):

For i = 1 To EOF 
    sql = "Insert Into [Table] (Column1, Column2) VALUES ('" & _ 
    xlSheet.Cells(i, 1).Value & " ', '" & _ 
    xlSheet.Cells(i, 2).Value & "');"  
Next i 
DoCmd.RunSQL sql 

隨着〜800K線這需要waaay到只要爲每一個線查詢將被創建並運行。

考慮到我也可以忽略90%的線的事實,從Excel導入數據集到Access的最快方法是什麼?

我想創建一個激活過濾器的臨時excel文件。然後我只導入過濾的excel。

但是有沒有比這更好/更快的方法?另外,什麼是通過vba訪問導入excel的最快方法?

在此先感謝。

+0

VB.NET不是vba。在標籤上說得很對。 – Plutonix

+0

1.)你能刪除90%的行來減少你處理的數據嗎? 2.)這是一次性操作,還是你會重複這樣做?這改變了您的解決方案需要的強大程度。通常,RDBMS允許從Excel,CSV,XML等導入到數據庫表中。這是一個手動步驟,但如果這是您一次性需要的,它可能是最快和最簡單的... –

+0

您可以使用ADO查詢Excel表並使用ADO和SQL執行此操作。 –

回答

1

考慮爲導入運行特殊的Access查詢。將以下SQL添加到Access查詢窗口中或作爲DAO/ADO連接中的SQL查詢。包括任何WHERE條款這就需要命名的列標題,現在設置爲HDR:No

INSERT INTO [Table] (Column1, Column2) 
SELECT * 
FROM [Excel 12.0 Xml;HDR=No;Database=C:\Path\To\Workbook.xlsx].[SHEET1$]; 

或者,運行的情況下,你需要一個臨時的臨時表一表查詢(除去90%的行)之前的最後表,但做的注意,如果存在此查詢替換表:

SELECT * INTO [NewTable] 
FROM [Excel 12.0 Xml;HDR=No;Database=C:\Path\To\Workbook.xlsx].[SHEET1$]; 
+0

使用道逐行方法大大提高了速度,非常感謝! – CoffeeCups

+0

太棒了!事實上,SQL一次處理工作,而不是迭代。很高興我能幫上忙。 – Parfait

0

代碼中的微小變化會做過濾爲您提供:

Dim strTest As String 
For i = 1 To EOF 
    strTest=xlSheet.Cells(i, 1).Value 
    if Nz(strTest)<>"" Then 
     sql = "Insert Into [Table] (Column1, Column2) VALUES ('" & _ 
     strTest & " ', '" & _ 
     xlSheet.Cells(i, 2).Value & "');" 
      DoCmd.RunSQL sql 
     End If 
Next i 

我ASSU我在循環外部運行RunSQL只是你的僞代碼中的一個錯誤。這將測試第一列中的單元格爲空,但您可以用任何適合您情況的條件進行替換。

+0

感謝您的意見,不幸的是,這種方法仍然比用dao慢得多 – CoffeeCups