一种可能性是使其成为一个两阶段的过程,但这取决于瓶颈在哪里。
如果是 Excel,则只需将记录集行转换为 CSV 类型的文件,然后在完成后创建 Excel 对象并将整个文件导入到固定位置。
这可能会比逐个单元的操作更快。
如果您无法将 CSV 导入工作表上的固定位置(单元格不在连续的行或列中),我会将 CSV 导入新工作表,然后从那里大量复制到您的模板工作表。
移动范围也应该比逐个单元格的操作更快。
批量导入和批量复制应该会给您带来一些不错的改进。当您使用更复杂的 Excel 功能(想想使用 =sum(a1..a999) 而不是在 VBA 中添加每个单独的单元格并将该值放在某处时,我有处理单个单元格的工作表,这些单元格的速度提高了 10 倍)。
至于如何从 VBA 导入,我总是依靠该"Record Macro"
功能来获得可以修改的基线(对于那些我不熟悉的人)。这一个导入c:\x.csv
到当前工作表中C7
:
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\x.csv", _
Destination:= Range("C7"))
.Name = "x"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
现在我确信那里的大部分垃圾都可以删除,但明智的做法是一次删除一个,以确保不会出现任何问题。
您还可以使用以下内容对其进行修改以使用不同的工作表。
dim ws as worksheet
dim savealert as boolean
set ws = Sheets.Add
ws.select
' Put all that other code above in here. '
' Move all that data just loaded into a real sheet. '
savealert = Application.DisplayAlerts
Application.DisplayAlerts = False
ws.delete
Application.DisplayAlerts = savealert