Одна из возможностей - сделать это двухэтапным процессом, но это зависит от того, где находится узкое место.
Если это Excel, просто превратите строки набора записей в файл типа CSV, а затем, когда это будет сделано, создайте объект Excel и импортируйте весь файл в фиксированное место.
Это, вероятно, будет быстрее, чем операция за ячейкой.
Если вы не можете импортировать CSV в фиксированное местоположение на листе (если ячейки не находятся в последовательных строках или столбцах), я импортирую CSV на новый лист, а затем делаю массовые копии оттуда в шаблон лист.
Диапазоны перемещения также должны быть быстрее, чем операции по ячейкам.
Это массовый импорт и массовое копирование, которые должны дать вам хорошее улучшение. У меня были листы, которые обрабатывали отдельные ячейки, которые ускорились по многим показателям в 10 раз, когда вы используете более сложную функциональность Excel (подумайте, используя = sum (a1..a999) вместо добавления каждой отдельной ячейки в VBA и размещения этого значения где-то ).
Что касается того, как выполнить импорт из 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