2016-09-28 52 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