Как стать автором
Обновить

Комментарии 9

Спасибо за статью. Было бы интересно узнать ваш совет насчет работы с встраиванием формул при большом количестве строк (300К) и столбцов (20K) yна одном листе, например когда необходимо в последнюю колонку вставить формулу до конца строк с расчетом значений из предыдущих колонок.
Когда вставляешь формулы, то нужно отключать автоматический пересчет. Тем не менее сначала надо отключить пересчет формул, потом вставить все формулы, а потом пересчитать их. И на таком большом количестве строк гораздо быстрее будет сделать все в массиве.
Есть малоизвестный способ писать макросы для Excel на javascript, оптимизация которого неплохо изучена. Код на javascript заворачивается в Windows Scripting Component (.wsc) и подтягивается в VBA-макрос через GetObject. Такой подход открывает некоторые интересные перспективы, в первую очередь за счёт большей мощности Javascript как языка по сравнению с VBA.
Можно пойти дальше, и написать компонент на .NET, но прелесть .wsc на javascript в том, что не нужно никаких допольнительных средств разработки кроме Notepad.
Хочется добавит, по своему опыту, что проблема работы скриптов часто бывает связана с выводом большого объема данных, а именно с постоянной перерисовкой элементов на активной странице. Решением в моем случае было скрытие листа на время обработки и вывода данных, что дало огромный прирост производительности.
тоже с этим постоянно сталкиваюсь, поэтому почти все макросы начинаю с
Application.ScreenUpdating = False
а дальше, по необходимости
Application.EnableEvents = False
и
Application.Calculation = xlCalculationManual
ну и в конце кода и на error handler возвращаем все обратно.
оригинальный способ вывода данных (Sheet1_WS.Range(Sheet1_WS.Cells(1, 1), Sheet1_WS.Cells(FinalRow, 50)) = R_new()
)
Спасибо. Теперь есть на что заменить циклы ws.cells(x,y)=array(x,y).
Да не очень-то и оригинальный, все это описано в канонических трудах Уокенбаха в разделах о работе с диапазонами. Просто имейте в виду, что такой способ работает только для массивов Variant.
Подскажите, есть скрипт на PowerShell, в том числе получающий данные из Excel-файла, — этот кусок кода является узким горлышком — обрабатывается очень долго. Можно ли как-то массово, за одно-два действия, без цикла, получить все данные (значения ячеек) из диапазона во внешнюю систему (переменную в PowerShell)?

# Собираем таблицу значений
$Range = $Sheet.Range($Sheet.Cells.Item($Row,1), $Sheet.Cells.Item($rows, $columns))
$Table = @()
$Record = @()

$i = 1
$Range | % {
if ($i -lt $columns) {
$Record +=, [string]$_.Value2
$i++
} else {
$Table +=, $Record
$Record = @()
$i=1
}
}
Всё, разобрался

$Table = @()
$Table = [array]$Range.Value2

А потом уже разбираем этот одномерный массив в таблицу, по аналогии с кодом выше. Скорость обработки уменьшилась с 2-3 минут до секунд 10. Спасибо за наводку про Range.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории