Для этого есть ряд различных причин.
Для одного 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, а затем просто записать его обратно в диапазон.