Я пытаюсь выполнить форматирование данных для экспорта QuickBooks, и один шаг очень медленный. У меня есть лист под названием «Выход», в котором есть каждая запись, выложенная в нужном формате, но я хочу, чтобы полностью заполненные были использованы на другом листе под названием «Карта».Excel VBA: заполнение ячеек со значениями массива очень медленное
Все до этого момента выполняется с помощью формул, и эта часть работает нормально. Я написал небольшой сценарий, чтобы перебрать все записи и вывести соответствующую информацию из «Вывод» в пять разных массивов. Затем он возвращается назад по этим массивам и заполняет ячейки в соответствующих столбцах в «Карта».
Мой скрипт быстро заполняет массивы, но заполнение ячеек занимает очень много времени. Я использую цикл for для итерации по массивам, и каждая итерация занимает около трех секунд, что очень длительное время, когда вы имеете дело с тысячами записей.
Sub Prettify()
Dim numbers()
Dim catagories()
Dim classes()
Dim subclasses()
Dim values()
Dim count As Integer
count = 2
' The upper bounds of the loop is a calculation of the number of entries we will access
For i = 2 To (Sheets("Data").Cells(7, 8).Value * Sheets("Data").Cells(4, 3).Value + 2)
If (Sheets("Output").Cells(i, 1).Value = "") Then
' Do Nothing
Else
ReDim Preserve numbers(count)
ReDim Preserve catagories(count)
ReDim Preserve classes(count)
ReDim Preserve subclasses(count)
ReDim Preserve values(count)
count = count + 1
numbers(count - 2) = Val((Sheets("Output").Cells(i, 1).Value))
catagories(count - 2) = Sheets("Output").Cells(i, 2).Value
If (Sheets("Output").Cells(i, 3).Value = 0) Then
classes(count - 2) = Sheets("Output").Cells(i, 4).Value
subclasses(count - 2) = ""
Else
classes(count - 2) = Sheets("Output").Cells(i, 3).Value
subclasses(count - 2) = Sheets("Output").Cells(i, 4).Value
End If
values(count - 2) = Sheets("Output").Cells(i, 5).Value
End If
Next
MsgBox (numbers(0))
MsgBox (catagories(0))
Sheets("Map").Activate
' This next part is slow
For j = 2 To count
Sheets("Map").Cells(j, 1).Value = numbers(j - 2)
Sheets("Map").Cells(j, 2).Value = catagories(j - 2)
Sheets("Map").Cells(j, 3).Value = classes(j - 2)
Sheets("Map").Cells(j, 4).Value = subclasses(j - 2)
Sheets("Map").Cells(j, 5).Value = values(j - 2)
Next
End Sub
Был аналогичный вопрос помоему в должности около трех лет назад, но исправления, которые они использовали не были применимы к моему примеру. Я тестировал код в разных точках, используя окна сообщений, и каждый из пяти этапов назначения в последнем цикле был одинаково медленным. Мысли?
У вас есть ссылка на вопрос, который вы упомянули? Сколько ценностей мы говорим? – arcadeprecinct
Что происходит, когда вы делаете 'Таблицы (« Карта »). Диапазон (« A2: A »& count) .Value = numbers' вместо цикла? – arcadeprecinct
http://stackoverflow.com/questions/13626001/excel-vba-writing-an-array-to-cells-is-very-slow –