У меня есть макрос VBA, который записывает данные в очищенный рабочий лист, но он очень медленный!Slow VBA macro writing in cells
Я создаю Excel из Project Professional.
Set xlApp = New Excel.Application
xlApp.ScreenUpdating = False
Dim NewBook As Excel.WorkBook
Dim ws As Excel.Worksheet
Set NewBook = xlApp.Workbooks.Add()
With NewBook
.Title = "SomeData"
Set ws = NewBook.Worksheets.Add()
ws.Name = "SomeData"
End With
xlApp.Calculation = xlCalculationManual 'I am setting this to manual here
RowNumber=2
Some random foreach cycle
ws.Cells(RowNumber, 1).Value = some value
ws.Cells(RowNumber, 2).Value = some value
ws.Cells(RowNumber, 3).Value = some value
...............
ws.Cells(RowNumber, 12).Value = some value
RowNumber=RowNumber+1
Next
Моя проблема в том, что цикл foreach является большим. В конце я заберу 29000 строк. Это занимает более 25 минут, чтобы сделать это на довольно хорошем компьютере.
Есть ли уловки, чтобы ускорить запись в ячейки? Я сделал следующее:
xlApp.ScreenUpdating = False
xlApp.Calculation = xlCalculationManual
ли я ссылки на ячейки в неправильном направлении? Можно ли написать целую строку, а не отдельные ячейки?
Будет ли это быстрее?
Я проверил свой код, цикл foreach проходит довольно быстро (я написал значения в некоторые случайные величины), поэтому я знаю, что запись в ячейки - это то, что занимает все это время.
Если вам нужна дополнительная информация, сниппеты кода, пожалуйста, дайте мне знать.
Спасибо за ваше время.
сделать это так 'ws.Range (клетки (1, RowNumber), клетки (12, Number)) = arr' где' arr' представляет собой массив значений 'некоторых value' например, 'Dim arr (от 1 до 100) как Long'. Или, если возможно, 'ws.Range (Cells (firstRow, RowNumber), Cells (lastRow, Number)) = twoDimensionalArray' –
Не стоит думать о реализации индикатора выполнения. Слушайте немного, но дайте уверенность пользователя в том, что рутина прогрессирует. –
Я не знаю, относится ли это к вам, но для меня я устанавливал '.Значение = "" ". Каждый звонок ел 30-40 мс (маленький, но поставил это в петлю из сотен предметов!). Я изменил его на '.ClearContents', и вызов теперь занимает 0 мс. –