Передача параметров по ссылке

Передача параметров по значению

Типы данных параметров

Механизмы передачи параметров.

Вызов процедур Function

Если функция не имеет аргументов, скобки после имени функции можно не ставить:

'Все эти операторы вызывают не имеющую аргументов процедуру Function ToDec.

Debug.Print 10 * ToDec X = ToDec If ToDec =10 Then Debug. Print "Out of Range" X = AnotherFunction(10 * ToDec)

Обычно вызов пользовательской функции (нестандартной функции, написанной программистом) аналогичен вызову встроенной (стандартной) функции VBA, например Abs.

Функцию можно вызывать так же, как и процедуру sub.

'Следующие операторы вызывают одну и ту же функцию:

Call Year(Now)

Year Now

Значение функции при ее вызове подобным образом игнорируется.

Обычно процедуре для выполнения требуются некоторые исходные данные. Эти данные могут передаваться процедуре при помощи параметров процедуры. При этом различают формальные параметры, то есть описанные в заголовке процедуры и используемые в ее теле, и фактические - те, что были указаны при ее вызове. Заметим, что имена формальных и фактических параметров не обязаны совпадать.

По умолчанию параметры процедур имеют тип variant. Можно объявлять для параметров и другие типы данных. Заметим, что если типы фактически передаваемых в функцию значений отличаются от типа формальных параметров, то происходит неявное преобразование типов, Поэтому рекомендуется описывать в заголовке функции типы ее формальных параметров, а при вызове функции проверять соответствие типов фактических и формальных параметров.

При передаче параметра по значению (by value) процедуре передается копия переменной, выступающей в качестве параметра процедуры. Если процедура изменяет значение параметра, это затрагивает только копию переменной, а не саму переменную. Значение переменной- оригинала в вызывающей процедуру программе сохраняется прежним.

Для передачи параметров по значению используется ключевое слово ByVal,. например:

Sub PostAccounts(ByVal intAcctNum as Integer) <операторы тела процедуры> End Sub

Фактические параметры, заданные константами, всегда передаются по значению.

Передача процедуре параметров по ссылке (by reference) открывает ей доступ к области памяти, где хранится содержимое переменной. В результате процедура может изменять значение переменной, являющейся ее параметром. По умолчанию в VBA все параметры передаются по ссылке.

Если задается тип данных параметра, передаваемого по ссылке, то передаваемый параметр должен содержать значение специфицированного типа данных. Можно обойти это правило, передавая процедуре в качестве параметра выражение. В этом случае VBA вычислит выражение и передаст его значение процедуре, преобразовав его в нужный тип, если это окажется возможным.

Проще всего представить переменную как выражение, заключив ее в круглые скобки. Например, чтобы передать процедуре целое число через строковый параметр, можно использовать следующий код:

Private Sub Form_Load()Dim intX As IntegerintX = 12 * 3ВызываемаяПроцедура(intX)End SubSub ВызываемаяПроцедура (Bar As String)MsgBox Bar 'Значение переменной Bar - строка "36"End SubНеобязательные параметрыС помощью ключевого слова Optional в списке параметров можно задавать необязательные параметры (optional arguments) процедуры. Если какой-то аргумент задан как необязательный, то и все последующие аргументы в списке аргументов должны быть необязательными и объявляются с ключевым словом optional. В этом коде все аргументы не являются обязательными:Dim strИмя As StringDim strАдрес As StringSub Text(Optional x As String, Optional y As String)MsgBox xMsgBox yEnd SubPrivate Sub Exec()strИмя = "ВашеИмя"strАдрес = 12345 ' Передаются два параметра.Call Text(strИмя, strАдрес)End SubВ этом коде некоторые аргументы обязательны:Dim strИмя As String Dim varАдрес As VariantSub Text(x As String, Optional у As Variant)MsgBox xIf Not IsMissing(y) ThenMsgBox yEnd If End SubPrivate Sub Exec()strИмя = "ВашеИмя" ' Второй параметр не передается.Call Text(strИмя) End Sub

Если необязательный параметр отсутствует, то он рассматривается как параметр с типом variant, имеющий значение Empty. В предыдущем при мере показано, как с помощью функции IsMissing проверять необязательные параметры.

Значения по умолчанию для необязательных параметров

В следующем примере процедура возвращает значение по умолчанию необязательного параметра, если при ее вызове он опущен:

Sub ListText (x As String, Optional у As Integer = 12345) MsgBox xMsgBox yEnd SubPrivate Sub Exec()strName = "yourname" ' Второй параметр не передается. Call Text (strName) ' Добавляет "yourname" and "12345".End Sub

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: