Как и во многих других вещах в программировании, ответ довольно разочаровывающий, «это зависит».
Вы хотите, чтобы Function
процедура принимала свои зависимости в виде (ByVal
) параметров, изатем используйте их для вычисления и возврата результата вызывающей стороне.И если функция делает это без каких-либо побочных эффектов на глобальное состояние, вы можете назвать ее pure function!В процедуре Sub
вы также примете как можно больше ваших зависимостей в качестве параметров. Не нужно ключевое слово Call
, хотя:
foo = GetFoo(42)
MsgBox "hello"
... с другой стороны, допустим, у вас есть процедура, которая создает лист и автоматизирует определенные вещи на страницеверхний и нижний колонтитулы: вы порождаете объект (wb.Worksheets.Add
) и записываете его в локальную переменную - Set sheet = wb.Worksheets.Add
, ... где wb
также может быть параметром.Или, возможно, вы пишете какую-то функцию поиска или усреднения, и вам нужны локальные переменные для улучшения читабельности и общего уровня абстракции вашего кода.Нижняя строка может быть, используйте localals для подробностей реализации вашей процедуры , параметры для ваших зависимостей .Местные жители добрые, глобалы злые =)
Что касается пули "безопасности" ... Нет .Напишите код для чтения - код выполняется, но вы пишете не для компьютера;Вы пишете код для себя, чтобы иметь возможность читать, понимать, поддерживать и расширять - существуют хорошие (коммерческие) обфускаторы для VBA, но это касается распространения вашего кода, и он не должен иметь никакого вмешательства вкак вы собираетесь его написать, и как в будущем вы (или ваш преемник?) будете работать с этим кодом.
Производительность на этом уровне не имеет значения;если есть узкое место, очень вероятно, что не будет , потому что вы передаете аргумент.