VBA
Procedimiento de llamadas
Buscar..
Sintaxis
- IdentifierName [ argumentos ]
- Call IdentifierName [ (argumentos) ]
- [Let | Set] expresión = IdentifierName [ (argumentos) ]
- [Let | Set] IdentifierName [ (argumentos) ] = expresión
Parámetros
Parámetro | Información |
---|---|
Nombre del identificador | El nombre del procedimiento a llamar. |
argumentos | Una lista de argumentos separados por comas para pasar al procedimiento. |
Observaciones
Las dos primeras sintaxis son para llamar a los procedimientos Sub
; Note que la primera sintaxis no implica paréntesis.
Ver Esto es confuso. ¿Por qué no usar siempre paréntesis? para una explicación detallada de las diferencias entre las dos primeras sintaxis.
La tercera sintaxis es para llamar a los procedimientos de Function
y Function
Property Get
; Cuando hay parámetros, los paréntesis son siempre obligatorios. La palabra clave Let
es opcional cuando se asigna un valor , pero se requiere la palabra clave Set
cuando se asigna una referencia .
La cuarta sintaxis es para llamar a los procedimientos Property Let
y Property Set
; la expression
en el lado derecho de la asignación se pasa al parámetro de valor de la propiedad.
Sintaxis de llamada implícita
ProcedureName
ProcedureName argument1, argument2
Llame a un procedimiento por su nombre sin paréntesis.
Caso extremo
La palabra clave de Call
solo se requiere en un caso de borde:
Call DoSomething : DoSomethingElse
DoSomething
y DoSomethingElse
son procedimientos a los que se llama. Si se eliminara la palabra clave de Call
, DoSomething
se analizaría como una etiqueta de línea en lugar de una llamada de procedimiento, lo que rompería el código:
DoSomething: DoSomethingElse 'only DoSomethingElse will run
Valores de retorno
Para recuperar el resultado de una llamada de procedimiento (por ejemplo, los procedimientos de Function
o Property Get
), coloque la llamada en el lado derecho de una asignación:
result = ProcedureName
result = ProcedureName(argument1, argument2)
Los paréntesis deben estar presentes si hay parámetros. Si el procedimiento no tiene parámetros, los paréntesis son redundantes.
Esto es confuso. ¿Por qué no usar siempre paréntesis?
Los paréntesis se utilizan para encerrar los argumentos de las llamadas de función . Su uso para llamadas de procedimiento puede causar problemas inesperados.
Porque pueden introducir errores, tanto en tiempo de ejecución al pasar un valor posiblemente no deseado al procedimiento, como en tiempo de compilación simplemente por ser una sintaxis no válida.
Tiempo de ejecución
Los paréntesis redundantes pueden introducir errores. Dado un procedimiento que toma una referencia de objeto como parámetro ...
Sub DoSomething(ByRef target As Range)
End Sub
... y llama con paréntesis:
DoSomething (Application.ActiveCell) 'raises an error at runtime
Esto generará un error de tiempo de ejecución "Objeto requerido" # 424. Otros errores son posibles en otras circunstancias: aquí la referencia del objeto Application.ActiveCell
Range
se evalúa y se pasa por valor, independientemente de la firma del procedimiento que especifique que ByRef
pasaría el target
. El valor real pasado de ByVal
a DoSomething
en el fragmento anterior, es Application.ActiveCell.Value
.
Los paréntesis obligan a VBA a evaluar el valor de la expresión entre corchetes y pasar el resultado ByVal
al procedimiento llamado. Cuando el tipo del resultado evaluado no coincide con el tipo esperado del procedimiento y no se puede convertir implícitamente, se genera un error de tiempo de ejecución.
Tiempo de compilación
Este código no podrá compilar:
MsgBox ("Invalid Code!", vbCritical)
Debido a que la expresión ("Invalid Code!", vbCritical)
no se puede evaluar a un valor.
Esto compilaría y funcionaría:
MsgBox ("Invalid Code!"), (vbCritical)
Pero definitivamente se vería tonto. Evite los paréntesis redundantes.
Sintaxis explícita de llamadas
Call ProcedureName
Call ProcedureName(argument1, argument2)
La sintaxis de llamada explícita requiere la palabra clave de Call
y paréntesis alrededor de la lista de argumentos; los paréntesis son redundantes si no hay parámetros. Esta sintaxis se volvió obsoleta cuando se agregó a VB la sintaxis de llamada implícita más moderna.
Argumentos opcionales
Algunos procedimientos tienen argumentos opcionales. Los argumentos opcionales siempre vienen después de los argumentos requeridos, pero el procedimiento se puede llamar sin ellos.
Por ejemplo, si la función, ProcedureName
tuviera dos argumentos obligatorios ( argument1
, argument2
) y un argumento opcional, optArgument3
, podría llamarse al menos cuatro formas:
' Without optional argument
result = ProcedureName("A", "B")
' With optional argument
result = ProcedureName("A", "B", "C")
' Using named arguments (allows a different order)
result = ProcedureName(optArgument3:="C", argument1:="A", argument2:="B")
' Mixing named and unnamed arguments
result = ProcedureName("A", "B", optArgument3:="C")
La estructura del encabezado de la función que se llama aquí sería algo así:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String) As String
La palabra clave Optional
indica que este argumento se puede omitir. Como se mencionó anteriormente, todos los argumentos opcionales introducidos en el encabezado deben aparecer al final, después de los argumentos requeridos.
También puede proporcionar un valor predeterminado para el argumento en el caso de que un valor no se pase a la función:
Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String = "C") As String
En esta función, si no se proporciona el argumento para c
, su valor será por defecto "C"
. Si se proporciona un valor, esto anulará el valor predeterminado.