我正在尝试使用Excel 2007 VBA将大型Excel报表中的数据导入到新文件中并对其进行排序。到目前为止,我已经想出了两种方法来实现这一点:
1.让Excel实际打开文件(下面的代码),将所有数据收集到数组中,并将数组输出到同一文件中的新工作表上,然后保存/关闭它。
Public Sub GetData()
Dim FilePath As String
FilePath = "D:\File_Test.xlsx"
Workbooks.OpenText Filename:=FilePath, FieldInfo:=Array(Array(2, 2))
ActiveWorkbook.Sheets(1).Select
End Sub
1.使用ADO从关闭的工作簿中取出所有数据,将整个数据表导入到一个数组(下面的代码)中,并对其中的数据进行排序,然后将数据输出到一个新的工作簿中,并保存/关闭该工作簿。
Private Sub PopArray() 'Uses ADO to populate an array that will be used to sort data
Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset
Dim Getvalue, SourceRange, SourceFile, dbConnectionString As String
SourceFile = "D:\File_Test.xlsx"
SourceRange = "B1:Z180000"
dbConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0 Xml;HDR=No"";"
Set dbConnection = New ADODB.Connection
dbConnection.Open dbConnectionString 'open the database connection
Set rs = dbConnection.Execute("SELECT * FROM [" & SourceRange & "]")
Arr = rs.GetRows
UpBound = UBound(Arr, 2)
rs.Close
End Sub
使用的测试文件有大约65000条记录需要排序(大约是我最终使用它的三分之一)。当ADO版本的性能只比打开的工作表略好时,我有点失望(~44秒vs ~40秒运行时间)。我想知道是否有一些方法可以改进ADO导入方法(或者一个完全不同的方法-也许是ExecuteExcel 4 Macro?-如果有的话),这会提高我的速度。我能想到的唯一一件事是,我使用"B1:Z180000"
作为最大范围,然后通过设置Arr = rs.GetRows
来截断,以准确反映记录的总数。如果这就是导致速度变慢的原因,我不确定如何才能找到工作表中有多少行。
编辑-我正在使用Range(“A1:A”& i)=(Array)将数据插入新工作表。
2条答案
按热度按时间bf1o4zei1#
这个答案可能不是你想要的,但我仍然觉得有必要根据你的侧记[...]或完全不同的方法[...]发布它。
在这里,我正在处理200MB(或更大)的文件,每个文件都只是包含分隔符的文本文件。我不再将它们加载到Excel中。我还遇到了Excel太慢的问题,需要加载整个文件。然而,Excel使用
Open
方法打开这些文件的速度非常快:在这种情况下,Excel不会加载整个文件,而只是逐行阅读。因此,Excel已经可以处理数据(转发),然后获取下一行数据。这样,Excel不需要内存来加载200MB。
使用这种方法,我将数据加载到本地安装的SQL中,该SQL将数据直接传输到我们的DWH(也称为SQL)。为了使用上述方法加快传输速度,并将数据快速传输到SQL服务器中,我将数据以1000行为一组进行传输。Excel中的字符串变量可以容纳多达20亿个字符。因此,没有问题。
有人可能会问,如果我已经在使用SQL的本地安装,为什么不简单地使用SSIS。然而,问题是我不再是加载所有这些文件的人。使用Excel生成这个“导入工具”允许我将这些工具转发给其他人,他们正在帮我上传这些文件。让他们都访问SSIS不是一个选项,也不可能使用一个指定的网络驱动器,在那里可以放置这些文件,SSIS将自动加载它们(每10+分钟左右)。
最后我的代码看起来像这样。
tez616oj2#
我认为@Mr. Mascaro是对的将数据从
Recordset
传递到电子表格的最简单方法是:但是如果您仍然希望使用
Arrays
,可以尝试以下方法: