Мои два цента:
Я согласен, что выходные параметры относятся к практике. VBA часто поддерживают люди, плохо знакомые с программированием, и если кто-то, обслуживающий ваш код, не заметит, что параметром является ByRef, он может привести к серьезным логическим ошибкам. Также он имеет тенденцию нарушать парадигму Свойство / Функция / Суб.
Другая причина, по которой использование параметров является плохой практикой, заключается в том, что если вам действительно do необходимо возвращать более одного значения, есть вероятность, что эти значения должны быть в структуре данных, такой как класс или определенный пользователем. Тип.
Однако они могут решить некоторые проблемы. VB5 (и, следовательно, VBA для Office 97) не позволяли функции возвращать массив. Это означало, что все, что возвращало или изменяло массив, должно было бы делать это через параметр «out». В VB6 эта возможность была добавлена, но VB6 по-прежнему заставляет параметры массива ссылаться (для предотвращения чрезмерного копирования в памяти). Теперь вы можете вернуть значение из функции, которая изменяет массив. Но это будет просто медленная стрижка (из-за акробатики, которая происходит за кулисами); это также может сбить новичков с мысли, что входные данные массива не будут изменены (что будет верно только в том случае, если кто-то специально структурирует его таким образом). Поэтому я обнаружил, что если у меня есть функция, которая изменяет массив, это уменьшает путаницу, если просто использовать подпрограмму вместо функции (и это тоже будет немного быстрее).
Другой возможный сценарий: если вы поддерживаете код и хотите добавить значение out, не нарушая интерфейс, вы можете добавить необязательный параметр out и быть уверенным, что старый код не будет нарушен. Это не очень хорошая практика, но если кто-то хочет что-то исправить прямо сейчас и у вас нет времени, чтобы сделать это «правильным образом» и реструктурировать все, это может быть удобным дополнением к вашему ящику для инструментов. < br />
Однако, если вы разрабатываете вещи с нуля и вам нужно возвращать несколько значений, вам следует учесть следующее:
1. Разбить функцию.
2. Возвращение UDT.
3. Возвращение класса.