Оператор Function

Объявляет название, аргументы и код, которые составляют основной текст процедурыFunction.

Синтаксис

[Public | Private | Friend] [ Static ] Functionname [ ( arglist ) ] [ Astype ]
[ операторы ]
[ name=expression ]
[ Выход из Function ]
[ операторы ]
[ name=expression ]
End Function

Синтаксис оператора Function содержит такие части:

Part Описание
Public Необязательный параметр. Указывает на то, что процедура Function доступна для всех других процедур во всех модулях. При использовании в модуле, который содержит Option Private, процедура недоступна вне проекта.
Private Необязательный параметр. Указывает на то, что процедура Function доступна только для других процедур в том модуле, в котором была объявлена.
Friend Необязательный параметр. Используется только в модуле класса. Указывает на то, что процедура Function видима повсюду в проекте, но невидима для контроллера экземпляра объекта.
Static Необязательный параметр. Указывает на то, что локальные переменные процедуры Function сохраняются между вызовами. Атрибут Static не влияет на переменные, которые были объявлены вне Function, даже если они используются в процедуре.
name Обязательно. Название Function; соответствует стандарту соглашений об именовании переменных.
arglist Необязательный параметр. Список переменных, представляющих аргументы, которые передаются в процедуру Function при вызове. В качестве разделителя переменных используется запятая.
type Необязательный параметр. Тип данных значения, возвращаемого процедурой Function; может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (кроме фиксированной длины), Object, Variant или любым пользовательским типом.
Операторы Необязательный параметр. Любая группа операторов, которая будет выполняться в процедуре Function.
выражение Необязательный параметр. Возвращаемое значение Function.

Аргумент arglist имеет следующий синтаксис и элементы:

[ Необязательный ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ Кактип ] [ =defaultvalue ]

Part Описание
Необязательное Необязательный параметр. Указывает, что аргумент не является обязательным. Если он используется, все последующие аргументы в arglist тоже должны быть необязательными и объявляться с использованием ключевого слова Optional. Optional не может использоваться для каких-либо аргументов, если используется ParamArray.
ByVal Необязательный параметр. Указывает, что аргумент передается значением.
ByRef Необязательный параметр. Указывает, что аргумент передается по ссылке. ByRef является значением по умолчанию в Visual Basic.
ParamArray Необязательный параметр. Используется как последний аргумент в arglist, чтобы указать, что последний аргумент является массивом Optional элементов Variant. Ключевое слово ParamArray позволяет предоставлять произвольное число аргументов. Не может использоваться с аргументами ByVal, ByRef или Optional.
varname Обязательно. Имя переменной, представляющее аргумент; соответствует стандарту соглашений об именовании переменных.
type Необязательный параметр. Тип данных аргумента, передаваемого процедуре; может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только переменная длина), Object, Variant или определенный тип объекта. Если параметр объявлен без ключевого слова Optional, можно также указать тип, определяемый пользователем.
defaultvalue Необязательный параметр. Любая константа или константное выражение. Действительно только для параметров Optional. Если типом является Object, явным значением по умолчанию может быть только Nothing.

Замечания

Если обратное не указано явно с помощью параметров Public, Private, или Friend, процедуры Function общедоступны по умолчанию.

Если Static не используется, значение локальных переменных не сохраняется между вызовами.

Ключевое слово Friend может использоваться только в модулях классов. Однако доступ к процедурам Friend может осуществляться в любом модуле проекта. Процедура Friend не отображается в библиотеке типов своего родительского класса; процедура Friend не может быть привязана позднее.

Процедуры Function могут быть рекурсивными, то есть они могут вызывать сами себя для выполнения поставленной задачи. Однако рекурсия может стать причиной переполнения стека. Ключевое слово Static обычно не используется с рекурсивными процедурами Function.

Весь выполняемый код должен быть в процедурах. Нельзя определить процедуру Function внутри другой процедуры Function, Sub, или Property.

Оператор Exit Function вызывает немедленный выход из процедуры Function. Выполнение программы продолжается с оператором, следующим за оператором, который вызвал процедуру Function. В любом месте процедуры Function может появится любое количество операторов Exit Function.

Как и Sub, Function является отдельной процедурой, которая может содержать аргументы, выполнять наборы операторов и изменять значения их аргументов. Однако в отличие от Sub, процедуру Function можно использовать справа от выражения, как и при использовании любой встроенной функции, например Sqr, Cos или Chr, если необходимо использовать значение, возвращенное функцией.

Процедура Function вызывается с помощью имени функции, за которым следует список аргументов в круглых скобках в выражении. Ознакомьтесь с информацией об операторе Call, чтобы подробнее узнать о вызове процедур Function.

Чтобы вернуть значение функции, присвойте значение названию функции. В любом месте процедуры может появится любое количество таких назначений. Если параметру name не присвоено значение, процедура вернет значение по умолчанию: числовая функция вернет 0, строковая функция вернет строку нулевой длины (""), а функция Variant вернет значение Empty. Функция, которая возвращает объектную ссылку, возвращает значение Nothing, если для параметра name не присвоено ни одной объектной ссылки (с помощью Set) в Function.

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

Function BinarySearch(. . .) As Boolean 
'. . . 
 ' Value not found. Return a value of False. 
 If lower > upper Then 
  BinarySearch = False 
  Exit Function 
 End If 
'. . . 
End Function

Переменные, которые используются в процедурах Function, делятся на две категории: те, которые явно объявлены в процедуре, и те, которые нет.

Переменные, которые явно объявлены в процедуре (с помощью оператора Dim или его эквивалента), всегда являются локальными в процедуре. Переменные, которые используются, но не были явно объявлены в процедуре, также являются локальными, если они не были объявлены на более высоком уровне вне процедуры.

В процедуре может использоваться переменная, которая не была явно объявлена в процедуре, но если какой-либо элемент, который был определен на уровне модуля, имеет такое же название, может возникнуть конфликт. Если ваша процедура ссылается на необъявленную переменную, которая называется так же, как и другая процедура, константа или переменная, система посчитает, что ваша процедура ссылается на это название на уровне модуля. Следует явно объявлять переменные, чтобы избежать таких конфликтов. Используйте оператор Option Explicit для принудительного явного объявления переменных.

Visual Basic может менять порядок арифметических выражений для повышения внутренней эффективности. Избегайте использования процедуры Function в арифметических выражениях, если функция меняет значение переменных в одном выражении. Подробнее об арифметических операторах см. в разделе Операторы.

Пример

В этом примере оператор Function используется для объявления названия, аргументов и кода, которые составляют основной текст процедуры Function. В последнем примере используются фиксированные инициализированные аргументы Optional.

' The following user-defined function returns the square root of the 
' argument passed to it. 
Function CalculateSquareRoot(NumberArg As Double) As Double 
 If NumberArg < 0 Then ' Evaluate argument. 
  Exit Function ' Exit to calling procedure. 
 Else 
  CalculateSquareRoot = Sqr(NumberArg) ' Return square root. 
 End If 
End Function

Использование ключевых слов ParamArray позволяет функции принимать переменное число аргументов. В следующем определении он передается по значению.

Function CalcSum(ByVal FirstArg As Integer, ParamArray OtherArgs()) 
Dim ReturnValue 
' If the function is invoked as follows: 
ReturnValue = CalcSum(4, 3, 2, 1) 
' Local variables are assigned the following values: FirstArg = 4, 
' OtherArgs(1) = 3, OtherArgs(2) = 2, and so on, assuming default 
' lower bound for arrays = 1. 

Необязательные аргументы могут иметь значения по умолчанию и типы, отличные от Variant.

' If a function's arguments are defined as follows: 
Function MyFunc(MyStr As String,Optional MyArg1 As _
 Integer = 5,Optional MyArg2 = "Dolly") 
Dim RetVal 
' The function can be invoked as follows: 
RetVal = MyFunc("Hello", 2, "World") ' All 3 arguments supplied. 
RetVal = MyFunc("Test", , 5) ' Second argument omitted. 
' Arguments one and three using named-arguments. 
RetVal = MyFunc(MyStr:="Hello ", MyArg1:=7) 

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.