非常大的ex​​cel文件 – 如何在表单之间复制数据?

我需要导入一些CSV文件到Excel 2010中,并创build一个非常简单但非常大的数据库。
整个故事将是 – 五列和数千行。
VBA也很简单 – 将数据从一张纸复制到另一张 – 反之亦然。
但我需要关心内存需求,因为可能非常大的文件大小。

Dim ws1 As Worksheet Dim ws2 As Worksheet Dim r1 As Range Dim r2 As Range Set ws1 = Sheets("01") Set ws2 = Sheets("02") Set r1 = ws1.Range("A1:B10") ' for example Set r2 = ws2.Range("C5:D14") r1.Copy Destination:=r2 'first way r2.Value = r1.Value ' second way 

这两种方法在内存/耗时的范围内是否有区别?
在和我将有超过10,000行。 文件大小是多less?

这个代码块对于我所在的项目有一些具体的内容,但是应该帮助你开始如何通过VBA导入CSV文件(有些清理):

 Public Sub ImportCSV(strPath As String, strFile As String, strExt As String, wbDestination As Workbook, Optional wsDest As Worksheet, Optional strRange As String, Optional blHeaders As Boolean = True) 'imports given CSV file into given sheet at given range _ defaults to comma separated delimiters Dim wsDestination As Worksheet Dim strFileName As String strFileName = strPath & strFile & ".csv" If wsDest Is Nothing Then Set wsDestination = wbDestination.Worksheets.Add(, wbDestination.Worksheets(wbDestination.Worksheets.Count)) Else: Set wsDestination = wsDest If strRange = "" Then strRange = "$A$1" With wsDestination.QueryTables.Add(Connection:="TEXT;" & strFileName, Destination:=wsDestination.Range(strRange)) .FieldNames = False .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = False .AdjustColumnWidth = False .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 437 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = False .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False .Delete End With If Not blHeaders Then wsDestination.Range(strRange).EntireRow.Delete End Sub 

您可以利用ADO查询文本文件,就好像它们是数据库表一样。 这使您可以编写SQL查询来从您的文本文件中提取数据。 你可以做任何文本文件甚至.xls文件,如果你想。

这样做的代码/过程非常简单。 您需要先参考Microsoft ActiveX Data Objects 2.X Library,然后使用如下所示的内容:

 Dim cn as New ADODB.Connection Dim rs as New ADODB.Recordset Dim i as Integer With cn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\SomeFolder;" & _ "Extended Properties=""text; HDR=Yes;FMT=Delimited""" .Open With rs .Open "SELECT * from fileName.txt", cn 'Loop through each row in query While Not (.EOF Or .BOF) 'Loop through each column in row For i = 0 to .Fields.Count - 1 Debug.Print .Fields(i).Value 'Print value of field to Immediate Window Next i .MoveNext Wend .Close End With .Close End With Set rs = Nothing Set cn = Nothing 

这将遍历您的文本文件,并显示VBA立即窗口中第一列的值。 它还假定你的文件有标题行。 如果没有,那么你需要改变你的ConnectionString中的HDRNo。

代码会自动尝试和推断你的types,但是如果你遇到了问题,它没有发现正确的types(如前导零),那么你可以明确定义一个模式为您的文件。 需要注意的是,如果你使用模式路由,那么你的ConnectionString参数如HDRFMT 将被忽略 。 除非在模式定义中覆盖它们,否则它们将保留registry中定义的默认设置。 有关schema.ini文件的更多信息可以在这里find: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms709353( v=vs.85) .aspx 。

这里是另一个有用的链接: http : //msdn.microsoft.com/en-us/library/ms974559.aspx 。 这是一篇由Microsoft脚本专家撰写的文章,也是我最初了解该过程的一个文章。

最后,如果你曾经用.xls文件使用这个过程,那么你应该知道你永远不应该查询一个OPEN .xls文件。 有一个令人讨厌的内存泄漏错误与OPEN .xls文件(更多信息在这里: http : //support.microsoft.com/default.aspx? scid=kb;en-us;319998&Product=xlw)。 只要你查询CLOSED .xls文件,那么你不应该有任何问题= D。 SQL FROM子句中的语法有点不同,因为您必须定位特定工作表,但IIRC脚本专家文章I linked解释了如何执行此操作。