VBA - Почему VBA UDF такие медленные по сравнению с собственными функциями Excel? - PullRequest
0 голосов
/ 08 октября 2019

давайте предположим, что я пишу следующий VBA UDF:

Function TestFunction()
    TestFunction = 0
End Function

, а затем использую его для первых 100000 строк в моем листе. Выполнение занимает несколько минут.

Вместо этого, если я использую TODAY () для того же числа строк, это займет всего 3-4 секунды.

Может кто-нибудь сказать мне, почему и еслиЕсть ли способ ускорить UDFs?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Несколько причин.

Функции VBA должны запускаться последовательно, вне пользовательского интерфейса / основного потока, а скомпилированный p-код должен интерпретироваться средой выполнения VBA.

Собственные функции родной . Они (предположительно - AFAIK написаны на C ++) уже скомпилированы в машинный код, который легко выполняется и не нуждается в перекомпиляции и / или интерпретации. Некоторые нативные функции могут также использовать многопоточные и «фоновые» вычисления.

Что касается ускорения ваших пользовательских функций, для этого нам нужно увидеть ваши пользовательские функции. Функция, которая не делает ничего, кроме присваивания литерального возвращаемого значения, не имеет много места для оптимизации, не так ли?

UDF - это здорово. Но они не серебряная пуля. Если бы я хотел записать значение 0 в A1:A1000000, я бы сделал Sheet1.Range("A1:A1000000").Value = 0, и это было бы почти мгновенно.

Если вы собираетесь иметь дело с макрокомандой, рассмотрите возможность просмотра макросов, а не UDF. сотни тысяч их рассчитать.

0 голосов
/ 09 октября 2019

Для этого есть ряд различных причин.

Для одного VBA UDF интерпретируются, тогда как собственные функции листа Excel компилируются. Вы получите значительное увеличение скорости, если, например, скомпилируете свой код VBA как VB6. Код VBA и VB6 либо одинаковые, либо почти одинаковые. Таким образом, причиной большого увеличения скорости может быть просто то, что код VB6 скомпилирован, а не интерпретирован, как код VBA.

Код VBA также не производит тот же тип функций листа, что и Excel. UDF VBA, например, не имеют intellisense листа. Вы не можете получить это каким-либо образом через VBA. Однако вы можете получить его с помощью внешних надстроек в других местах (например, Excel DNA).

Другая причина заключается в том, что VBA - не лучший API для написания функциональных пользовательских функций. Это было бы C API. Но в API C сложнее писать UDF, чем в VBA.

Существует также ряд других факторов, которые могут повлиять на скорость, например, базовое оборудование или алгоритм, который вы используете в UDF. Трудно дать вам полезные советы, не видя ваш код.

Вы уверены, что вам нужны UDF? Единственное преимущество UDF по сравнению с макросами (о чем я знаю в любом случае) заключается в том, что они не удаляют откатку после их вызова, тогда как большинство макросов делают. И они могут динамически пересчитывать, тогда как вам постоянно приходится повторно запускать макросы после их вызова (если вы не используете событие рабочего листа или что-то в этом роде).

Если вы выполняете тонну вычислений для диапазона ячеек, вероятно, лучше просто записать диапазон в массив, манипулировать им в VBA, а затем просто записать его обратно в диапазон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...