Pull to refresh

Comments 26

так
стоп
то есть эксель из коробки не ускоряется gpu? тогда на кой чёрт он иногда сильно загружает видюху даже при работе с простенькими табличками? или некрософт туды майнер вшила?

Не знаю чем он загружает видюху, но в Офис365 у Экселя нужно отключать аппаратное ускорение, иначе начинаются жуткие тормоза.

Аппаратное торможение 😆

При работе с VBA в Excel отключайте обновление экрана.

 Application.ScreenUpdating = False

Как уже ответил @MAXXL есть опция отключения аппаратного ускорения. И для ускорения Экселя советуют её отключать. В общем, у меня она всегда отключена.

Чтобы дополнительно ускорить VBA лучше ещё отключить (дополнительно к совету @Sdvnkhp) пересчёт формул и отключить ивенты:

Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Да мне собственно мало интересно, у меня Либра хотя бы потому что мс офиса нет на линь, а начальнику у которого была проблема я поставил freeoffice и Wps на выбор, не помню что он выбрал но назад на мс не хотел после этого.

Чего-то я не понял.

Почему включённое ускорение замедляет, а выключенное ускоряет?

Это Майкрософт. Мы тоже не понимаем.

начали делать ускорение, но не получилось, а настройка осталась и кто-то отчитался о реализованной фиче

Я в экселе профан конечно, но эту штука на скрипты работает или на теже формулы тоже?

Не проверял, но должна работать.

Пользовательские формулы ведь тоже задаются через скипты.

Проще всего запихнуть все инициализации в "Workbook_Open" и там загружать весь Cl-код и компилировать.

Короткая, конечно, статья, но однозначно плюс. Это не перевод же?
Речь о любой версии Excel?
Инсталлятор работает по принципу «раз запустил и оно подключено»?

Нет, это не перевод, автор я. А статья получилась такой короткой потому что писать особо и не о чем. Типа подключил Эксель через библиотеку (ClooWrepperVBA) к OpenCl-библиотеке через другую библиотеку (Cloo). Ура, заработало! Теперь мой VBA на CPU в 8 раз быстрее ваших программ на C#! Вот вам и пересказ статьи в трёх предложениях :-)

В принципе должно работать на любой версии Экселя. У меня 2007. Тестировал также и на Экселе x64 (2019). Конфигурация распечаталась. Дальше не тестировал.

Да, инсталлятор для того и был думан, чтобы запустить и всё работало. Приложенный архив содержит всё тоже самое, просто для регистрации библиотеки надо запустить приложенный bat-файл.

Если такие результаты достигнуты, это надо продавать за деньги, а не раздавать всем подряд даром.

А оно мне надо?

Доходов практически не принесёт (нишевый продукт, нужен очень немногим), а вот расходов будет много: сайт (это ведь не Андроид, под Windows нет ГуглПлея), всякое СЕО, ответы на письма...

К тому же тут уже вопрос морали: Cloo - библиотека открытая, а я всего лишь сделал доступными её основные функции.

На самом деле, я свои доходы уже получил:

  • Сделал нужную мне вещь.

  • Рассказал о ней сообществу.

  • Сам узнал немного нового (OpenCl, как работать с двумя аккаунтами GitHub).

  • Ну и развлёк господ технарей в пятницу.

Это не просто нишевая штука, а какая-то очень нишевая) Тоесть реально пригодится, когда переписывание существующего VBA не рентабельно.. ну и не стоит забывать, что в случае чего стоимость поддержки тоже увеличивается.

Мне бы на моей прошлой работе это решение очень бы пригодилось. У меня там столько вcего было на Excel VBA. Медленный пересчет многое усложнял. В общем, мы тогда бы купили с удовольствием :) Но ваш подход к вопросу, как говорится, highly appreciated

UFO just landed and posted this here

В принципе да. Используется COM-интерфейс и ему всё равно из чего его вызывают. Вон, в конце заметки даже из VBscript удалось вызвать.

В моей версии офиса Access не поставлялся, так что проверить не смогу.

Вот бы мне все это реализовать, с чего начать, коллеги))

В смысле "все это реализовать"?

Берите и пробуйте. Код вроде как рабочий (пока никто не жаловался что что-то не работает).

Коротенький туториал по OpenCl лежит здесь.

Если будут вопросы, обращайтесь. Можно в личку. Ответить в тот же день не обещаю, но постараюсь.

Добавлю свои 5 копеек. Иногда тормоза в макросах могут быть не из-за того что тяжёлые вычисления очень долго выполняются, а из-за того что в ходе этих вычислений Вы многократно читаете или записываете данные в ячейки на листе. В ходе таких вызовов происходит дорогостоящая операция обращения к объектной модели книги или листа. Вместо этого можно однократно прочитать весь диапазон значений в двумерный массив, также можно и записать из такого массива значения обратно на лист после всех преобразований. Тогда вычисления будут происходить только в оперативной памяти самого макроса. Под спойлером пример такой оптимизации

Пример оптимизации чтения с листа в цикле

Таки да!

Более того, само чтение из ячеек занимает больше времени, чем чтение из файла!

Ваш способ, через UsedRange, не пробовал (знаю, что Range можно сразу копировать в массив, но пользуюсь этим редко), но чтение из csv файла с последующим парсингом в 4(!) раза (проверял лично) быстрее чтения из ячеек.

Пример:

Пример:

Open strFilename For Input As #iFile strFileContent = Input(LOF(iFile), iFile)
Close #iFile Dim tmpStrings$()
tmpStrings = Split(strFileContent, vbCrLf)
For i = 1 To nAssets
    tmpDoubles = Split(tmpStrings(i), ";")
Next i

Конечно, необязательно использовать UsedRange, особенно если книга заполнялась пользователем, и нет уверенности что он ее не заполнил по-своему :)

Можно написать отдельный код на то, чтобы определить начало-конец диапазона с данными, и копировать явно, примерно так:

arr = ws.Range(ws.Cells(rowStart, 1), ws.Cells(rowEnd, 3)).Value
Sign up to leave a comment.

Articles