У вас уже есть большая экономия (отключение автоматического расчета во время записи), но есть еще несколько маленьких хитростей, которые следует учитывать в будущем.
Во-первых, каждый раз, когда вы пишете ячейку из VBA, возникает дополнительная нагрузка, вызванная переходом VBA на адрес рабочей книги / рабочего листа / ячейки и выполнением записи. Запись множества ячеек в одном вызове приводит к накладным расходам только один раз. Таким образом, упаковка нескольких значений в массив и запись этого массива в несколько ячеек выигрывает время. Не стоит нескольких строк, но стоит сотен.
Кроме того, для каждой "точки" есть еще один маленький заголовок. Термины в выражении «пунктир», такие как Sheets("Terminal Summary").Cells(rowNumber, colNumber + 2)
, требуют, чтобы Excel / VBA определял, какие объекты участвуют в каждом вызове. В некоторых случаях (особенно при обращении к удаленным объектам) эти издержки могут быть значительными. VB дает нам конструкцию With...End With
, чтобы уменьшить необходимость продолжать разрешать эти ссылки: каждое выражение, начинающееся с точки, автоматически ссылается на объект в следующем внешнем With
.
Так что мы можем получить что-то вроде этого:
With Sheets("Terminal Summary")
.Cells(rowNumber, colNumber + 2).Resize(1, 8) = terminal.InfoArray
.Cells(rowNumber, colNumber + 10).FormulaR1C1 = "=IFERROR(RC[-4]/RC[-8],0)"
.Cells(rowNumber, colNumber + 11).FormulaR1C1 = "=IFERROR(RC[-4]/RC[-8],0)"
.Cells(rowNumber, colNumber + 12).FormulaR1C1 = "=IFERROR(RC[-8]/RC[-10],0)"
.Cells(rowNumber, colNumber + 13).FormulaR1C1 = "=IFERROR(RC[-8]/RC[-10],0)"
.Cells(rowNumber, colNumber + 14).FormulaR1C1 = "=IFERROR(RC[-10]/(RC[-8] / 100),0)"
.Cells(rowNumber, colNumber + 15).FormulaR1C1 = "=IFERROR(RC[-10]/(RC[-8] / 100),0)"
.Cells(rowNumber, colNumber + 16).FormulaR1C1 = "=IFERROR(RC[-12]/RC[-8],0)"
.Cells(rowNumber, colNumber + 17).FormulaR1C1 = "=IFERROR(RC[-12]/RC[-8],0)"
End With
Я бы поместил массив в класс Terminal, примерно так:
Public Property Get InfoArray() As Variant
InfoArray = Array(iBShipments, oBShipments, iBNetRevenue, oBNetRevenue, iBWeight, oBWeight, iBMileage, oBMileage)
End Property
Формулы могут выводиться более эффективно, если их записать один раз в столбец после того, как вся информация о Терминале завершена.
Некоторые вещи, которые нужно учитывать, по крайней мере ...