Instrucción de función

Declara el nombre, los argumentos y el código que forman el cuerpo de un procedimientoFunction.

Sintaxis

[Public | Privado | Friend] [ Static ] Nombre de la función [ ( arglist ) ] [ Como tipo ]
[ instrucciones ]
[ name = expression ]
Exit Function
[ instrucciones ]
[ name = expression ]
Terminar Function


La sintaxis de la instrucción Function consta de estas partes:

Parte Descripción
Public Opcional. Indica que el procedimiento Function es accesible para todos los otros procedimientos en todos los módulos. Si se utiliza en un módulo que contiene una Option Private, el procedimiento no está disponible fuera de proyecto.
Private Opcional. Indica que el procedimiento Function solo está accesible para otros procedimientos del módulo donde se declara.
Friend Opcional. Se usa únicamente en un módulo de clase. Indica que el procedimiento Function es visible a través del proyecto, pero no es visible para un controlador de una instancia de un objeto.
Static Opcional. Indica que las variables locales del procedimiento Function se conservan entre llamadas. El atributo Static no afecta a las variables declaradas fuera de Function, incluso si se usan en el procedimiento.
name Obligatorio. Nombre de la Function; sigue las convenciones de nomenclatura de variables estándar.
arglist Opcional. Lista de variables que representa los argumentos que se pasan al procedimiento Function cuando se realiza la llamada. Distintas variables están separadas por comas.
type Opcional. Tipo de datos del valor devuelto por el procedimiento Function; puede ser Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (no es compatible actualmente), Date, String (excepto la longitud fija), Object, Variant o cualquier tipo definido por el usuario.
statements Opcional. Cualquier grupo de instrucciones que se ejecutará dentro del procedimiento Function.
expresión Opcional. Devuelve el valor de Function.

El argumento arglist consta de las siguientes sintaxis y partes:

[ Opcional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ As type ] [ = defaultvalue ]


Parte Descripción
Optional Opcional. Indica que no se necesita un argumento. Si se usan, todos los argumentos siguientes en arglist también deben ser opcionales y declararse usando la palabra clave Optional. Optional no se puede usar para ningún argumento si se usa ParamArray.
ByVal Opcional. Indica que el argumento se pasa por valor.
ByRef Opcional. Indica que el argumento se pasa por referencia. ByRef es el valor predeterminado en Visual Basic.
ParamArray Opcional. Solo se usa como último argumento de arglist para indicar que el argumento final es una matriz opcional de elementos de Variant. La palabra clave ParamArray le permite proporcionar un número arbitrario de argumentos. Es posible que no pueda usarse con ByVal, ByRef u Optional.
varname Obligatorio. Nombre de la variable que representa el argumento; sigue las convenciones de nomenclatura de variables estándar.
type Opcional. Tipo de datos del argumento que ha pasado al procedimiento; puede ser Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (no es compatible actualmente) Date, String (solo longitud de variable), Object, Variant o un object type específico. Si el parámetro no es Optional, también puede especificarse un tipo definido por el usuario.
defaultvalue Opcional. Cualquier constante o expresión constante. Válida solo para parámetros Optional. Si el tipo es Object, un valor predeterminado explícito solo puede ser Nothing.

Observaciones

Si no se especifica explícitamente mediante Public, Private o Friend, los procedimientos Function son públicos de forma predeterminada.

Si no se usa Static, el valor de las variables locales no se conserva entre llamadas.

La palabra clave Friend solo puede utilizarse en los módulos de clase. Sin embargo, a los procedimientos Friend se puede acceder mediante procedimientos en cualquier módulo de un proyecto. Un procedimiento Friend no aparece en la biblioteca de tipos de su clase primaria, ni tampoco puede un procedimiento Friend ser un enlace en tiempo de ejecución.

Los procedimientos Función pueden ser recursivos, es decir, que pueden llamarse a sí mismos para realizar una tarea determinada. No obstante, la recursión puede llevar al desbordamiento de pila. La palabra clave Static normalmente no se usa con procedimientos Function recursivos.

Todo el código ejecutable debe estar en procedimientos. No puede definir un procedimiento Function dentro de otro procedimiento Function, Sub o Property.

La instrucción Exit Function provoca una salida inmediata de un procedimiento Function. La ejecución del programa continúa con la instrucción que sigue a la que llama al procedimiento Function. Cualquier número de instrucciones Exit Function pueden aparecer en cualquier lugar en un procedimiento Function.

Como un procedimiento Sub, un procedimiento Function es independiente y puede aceptar argumentos, realizar una serie de instrucciones y cambiar los valores de sus argumentos. Sin embargo, a diferencia de un procedimiento Sub, puede usar un procedimiento Function al lado derecho de una Expresión de la misma manera que utiliza cualquier función intrínseca, como Sqr, Cos o Chr, cuando desea utilizar el valor devuelto por la función.

Puede llamar a un procedimiento Function usando el nombre de la función, seguido de la lista de argumentos entre paréntesis, en una expresión. Consulte la instrucción Llamada para obtener información sobre cómo se llama a procedimientos Function.

Para devolver un valor desde una función, asigne el valor al nombre de esta. Cualquier número de dichas tareas puede aparecer en cualquier lugar dentro del procedimiento. Si no se asignó ningún valor a nombre, el procedimiento devuelve un valor predeterminado: una función numérica devuelve 0, una función de cadena devuelve una cadena de longitud cero ("") y una función Variant devuelve Empty. Una función que devuelve una referencia de objeto devuelve Nothing si no se asigna ninguna referencia de objeto a nombre (con Establecer) dentro de Function.

El siguiente ejemplo muestra cómo asignar un valor devuelto a una función. En este caso, False se asigna al nombre para indicar que no se encontró algún valor.

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

Las variables usadas en procedimientos Function se dividen en dos categorías: los que están declarados explícitamente dentro del procedimiento y los que no.

Las variables declaradas explícitamente en un procedimiento (con Dim o su equivalente) siempre son locales en el procedimiento. Las variables que se utilizan pero no están explícitamente declaradas en un procedimiento también son locales, a menos que estén declaradas explícitamente a un nivel superior fuera del procedimiento.

Un procedimiento puede usar una variable que no se declare explícitamente en el procedimiento, pero esto puede crear un conflicto de nombres si algo que definió en el nivel de módulo tiene el mismo nombre. Si el procedimiento hace referencia a una variable no declarada con el mismo nombre que otro procedimiento, constante o variable, se supone que el procedimiento hace referencia a ese nombre del nivel de módulo. Declarar variables explícitamente para evitar este tipo de conflicto. Puede usar una instrucción Option Explicit para forzar la declaración explícita de variables.

Visual Basic podría reorganizar las expresiones aritméticas para aumentar la eficacia interna. Evite usar un procedimiento Function en una expresión aritmética cuando la función cambie el valor de las variables en la misma expresión. Para obtener más información sobre los operadores aritméticos, vea Operators.

Ejemplo

En este ejemplo, se usa la instrucción Function para declarar el nombre, los argumentos y el código que forman el cuerpo de un procedimiento Function. El último ejemplo utiliza argumentos Optional inicializados y con tipado fuerte.

' 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

La palabra clave ParamArray permite a una función aceptar un número variable de argumentos. En la siguiente definición, se pasa por valor.

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. 


Los argumentos Optional pueden tener valores predeterminados y tipos distintos de 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) 

Vea también

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.