Комментарии 26
так
стоп
то есть эксель из коробки не ускоряется gpu? тогда на кой чёрт он иногда сильно загружает видюху даже при работе с простенькими табличками? или некрософт туды майнер вшила?
Не знаю чем он загружает видюху, но в Офис365 у Экселя нужно отключать аппаратное ускорение, иначе начинаются жуткие тормоза.
При работе с VBA в Excel отключайте обновление экрана.
Application.ScreenUpdating = False
Как уже ответил @MAXXL есть опция отключения аппаратного ускорения. И для ускорения Экселя советуют её отключать. В общем, у меня она всегда отключена.
Чтобы дополнительно ускорить VBA лучше ещё отключить (дополнительно к совету @Sdvnkhp) пересчёт формул и отключить ивенты:
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Да мне собственно мало интересно, у меня Либра хотя бы потому что мс офиса нет на линь, а начальнику у которого была проблема я поставил freeoffice и Wps на выбор, не помню что он выбрал но назад на мс не хотел после этого.
Чего-то я не понял.
Почему включённое ускорение замедляет, а выключенное ускоряет?
Речь о любой версии Excel?
Инсталлятор работает по принципу «раз запустил и оно подключено»?
Нет, это не перевод, автор я. А статья получилась такой короткой потому что писать особо и не о чем. Типа подключил Эксель через библиотеку (ClooWrepperVBA) к OpenCl-библиотеке через другую библиотеку (Cloo). Ура, заработало! Теперь мой VBA на CPU в 8 раз быстрее ваших программ на C#! Вот вам и пересказ статьи в трёх предложениях :-)
В принципе должно работать на любой версии Экселя. У меня 2007. Тестировал также и на Экселе x64 (2019). Конфигурация распечаталась. Дальше не тестировал.
Да, инсталлятор для того и был думан, чтобы запустить и всё работало. Приложенный архив содержит всё тоже самое, просто для регистрации библиотеки надо запустить приложенный bat-файл.
Если такие результаты достигнуты, это надо продавать за деньги, а не раздавать всем подряд даром.
А оно мне надо?
Доходов практически не принесёт (нишевый продукт, нужен очень немногим), а вот расходов будет много: сайт (это ведь не Андроид, под Windows нет ГуглПлея), всякое СЕО, ответы на письма...
К тому же тут уже вопрос морали: Cloo - библиотека открытая, а я всего лишь сделал доступными её основные функции.
На самом деле, я свои доходы уже получил:
Сделал нужную мне вещь.
Рассказал о ней сообществу.
Сам узнал немного нового (OpenCl, как работать с двумя аккаунтами GitHub).
Ну и развлёк господ технарей в пятницу.
Это не просто нишевая штука, а какая-то очень нишевая) Тоесть реально пригодится, когда переписывание существующего VBA не рентабельно.. ну и не стоит забывать, что в случае чего стоимость поддержки тоже увеличивается.
Мне бы на моей прошлой работе это решение очень бы пригодилось. У меня там столько вcего было на Excel VBA. Медленный пересчет многое усложнял. В общем, мы тогда бы купили с удовольствием :) Но ваш подход к вопросу, как говорится, highly appreciated
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
Подключаем к Экселю GPU и ускоряем Эксель в 300 раз