Неопределенный вопрос: лучше ли передать именованный диапазон функции или просто переопределить именованный диапазон в функции? - PullRequest
0 голосов
/ 19 сентября 2019

Не совсем уверен, как спросить это:

У меня есть именованный диапазон, который я использую в подпрограмме, и я буду использовать тот же именованный диапазон в функции.

Должен ли я передать именованный диапазон в качестве аргумента функции или просто переопределить именованный диапазон в функции?

Мне не нужно немедленно манипулировать именованным диапазоном в функции - просто нужно использоватьименованный диапазон в функции (см. фрагмент кода)

Неопределенный вопрос, поэтому я попытаюсь определить некоторые критерии, по которым можно судить, что "лучше":

  • Читаемость кода
  • Скорость выполнения
  • Безопасность кода?(например, если вы не хотите, чтобы люди могли «видеть» ваш скрытый код)
  • Другие критерии?

Опция 1: передать диапазон в качестве аргумента

Dim rRng as Range
Set rRng = Sheet3.Range ("aNamedRange")

Call TestFunction (rRng)

'Here's what the function "TestFunction" would look like
Function TestFunction (rRange as Range)

rRange (1,1) = "blah"
End Function

Опция 2: переопределить диапазон в функции

Dim rRng as Range
Set rRng = Sheet3.Range ("aNamedRange")

Call TestFunction

'Here's what the function "TestFunction" would look like
Function TestFunction ()

Dim rRange as Range
Set rRange = Sheet3.Range ("aNamedRange")

rRange (1,1) = "blah"
End Function

1 Ответ

3 голосов
/ 19 сентября 2019

Как и во многих других вещах в программировании, ответ довольно разочаровывающий, «это зависит».

Вы хотите, чтобы Function процедура принимала свои зависимости в виде (ByVal) параметров, изатем используйте их для вычисления и возврата результата вызывающей стороне.И если функция делает это без каких-либо побочных эффектов на глобальное состояние, вы можете назвать ее pure function!В процедуре Sub вы также примете как можно больше ваших зависимостей в качестве параметров. Не нужно ключевое слово Call , хотя:

foo = GetFoo(42)
MsgBox "hello"

... с другой стороны, допустим, у вас есть процедура, которая создает лист и автоматизирует определенные вещи на страницеверхний и нижний колонтитулы: вы порождаете объект (wb.Worksheets.Add) и записываете его в локальную переменную - Set sheet = wb.Worksheets.Add, ... где wb также может быть параметром.Или, возможно, вы пишете какую-то функцию поиска или усреднения, и вам нужны локальные переменные для улучшения читабельности и общего уровня абстракции вашего кода.Нижняя строка может быть, используйте localals для подробностей реализации вашей процедуры , параметры для ваших зависимостей .Местные жители добрые, глобалы злые =)

Что касается пули "безопасности" ... Нет .Напишите код для чтения - код выполняется, но вы пишете не для компьютера;Вы пишете код для себя, чтобы иметь возможность читать, понимать, поддерживать и расширять - существуют хорошие (коммерческие) обфускаторы для VBA, но это касается распространения вашего кода, и он не должен иметь никакого вмешательства вкак вы собираетесь его написать, и как в будущем вы (или ваш преемник?) будете работать с этим кодом.

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

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