Comments 9
Спасибо за статью. Было бы интересно узнать ваш совет насчет работы с встраиванием формул при большом количестве строк (300К) и столбцов (20K) yна одном листе, например когда необходимо в последнюю колонку вставить формулу до конца строк с расчетом значений из предыдущих колонок.
Есть малоизвестный способ писать макросы для Excel на javascript, оптимизация которого неплохо изучена. Код на javascript заворачивается в Windows Scripting Component (.wsc) и подтягивается в VBA-макрос через GetObject. Такой подход открывает некоторые интересные перспективы, в первую очередь за счёт большей мощности Javascript как языка по сравнению с VBA.
Можно пойти дальше, и написать компонент на .NET, но прелесть .wsc на javascript в том, что не нужно никаких допольнительных средств разработки кроме Notepad.
Можно пойти дальше, и написать компонент на .NET, но прелесть .wsc на javascript в том, что не нужно никаких допольнительных средств разработки кроме Notepad.
Хочется добавит, по своему опыту, что проблема работы скриптов часто бывает связана с выводом большого объема данных, а именно с постоянной перерисовкой элементов на активной странице. Решением в моем случае было скрытие листа на время обработки и вывода данных, что дало огромный прирост производительности.
оригинальный способ вывода данных (Sheet1_WS.Range(Sheet1_WS.Cells(1, 1), Sheet1_WS.Cells(FinalRow, 50)) = R_new()
)
Спасибо. Теперь есть на что заменить циклы ws.cells(x,y)=array(x,y).
)
Спасибо. Теперь есть на что заменить циклы ws.cells(x,y)=array(x,y).
Подскажите, есть скрипт на 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
}
}
# Собираем таблицу значений
$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
}
}
Sign up to leave a comment.
Ускоряем работу VBA в Excel