Buscar..
Observaciones
Los operadores son evaluados en el siguiente orden:
- Operadores matematicos
- Operadores bitwise
- Operadores de concatenacion
- Operadores de comparación
- Operadores logicos
Los operadores con prioridad coincidente se evalúan de izquierda a derecha. El orden predeterminado se puede anular utilizando paréntesis (
y )
para agrupar expresiones.
Operadores matematicos
Listado por orden de precedencia:
Simbólico | Nombre | Descripción |
---|---|---|
^ | Exposiciónción | Devuelva el resultado de elevar el operando de la izquierda a la potencia del operando de la derecha. Tenga en cuenta que el valor devuelto por exponenciación es siempre Double , independientemente de los tipos de valor que se dividan. Cualquier coacción del resultado en un tipo de variable tiene lugar después de que se realiza el cálculo. |
/ | División 1 | Devuelve el resultado de dividir el operando de la izquierda por el operando de la derecha. Tenga en cuenta que el valor devuelto por división siempre es Double , independientemente de los tipos de valor que se dividan. Cualquier coacción del resultado en un tipo de variable tiene lugar después de que se realiza el cálculo. |
* | Multiplicación 1 | Devuelve el producto de 2 operandos. |
\ | División entera | Devuelve el resultado entero de dividir el operando de la izquierda por el operando de la derecha después de redondear ambos lados con .5 redondeando hacia abajo. Cualquier resto de la división se ignora. Si el operando de la derecha (el divisor) es 0 , se producirá un error en tiempo de ejecución 11: División por cero. Tenga en cuenta que esto ocurre después de que se realiza todo el redondeo: expresiones como 3 \ 0.4 también darán como resultado un error de división por cero. |
Mod | Modulo | Devuelve el resto entero de dividir el operando de la izquierda por el operando de la derecha. El operando en cada lado se redondea a un entero antes de la división, con .5 redondeando hacia abajo. Por ejemplo, tanto 8.6 Mod 3 como 12 Mod 2.6 dan como resultado 0 . Si el operando de la derecha (el divisor) es 0 , se producirá un error en tiempo de ejecución 11: División por cero. Tenga en cuenta que esto ocurre después de que se realiza todo el redondeo: expresiones como 3 Mod 0.4 también darán como resultado un error de división por cero. |
- | Resta 2 | Devuelve el resultado de restar el operando de la derecha del operando de la izquierda. |
+ | Adición 2 | Devuelve la suma de 2 operandos. Tenga en cuenta que este token también se trata como un operador de concatenación cuando se aplica a una String . Ver Operadores de Concatenación . |
1 Se considera que la multiplicación y la división tienen la misma precedencia.
2 La suma y la resta se tratan con la misma prioridad.
Operadores de Concatenacion
VBA es compatible con 2 operadores de concatenación diferentes, +
y &
y ambos realizan la misma función cuando se usan con los tipos de String
: el String
mano derecha se agrega al final del String
de la izquierda.
Si el operador &
se usa con un tipo de variable que no sea una String
, se convierte implícitamente en una String
antes de concatenar.
Tenga en cuenta que el operador de +
concatenación es una sobrecarga del operador de suma +
. El comportamiento de +
está determinado por los tipos de variables de los operandos y la precedencia de los tipos de operadores. Si ambos operandos se escriben como una String
o Variant
con un subtipo de String
, se concatenan:
Public Sub Example()
Dim left As String
Dim right As String
left = "5"
right = "5"
Debug.Print left + right 'Prints "55"
End Sub
Si cualquiera de los lados es un tipo numérico y el otro lado es una String
que se puede convertir en un número, la prioridad de tipo de los operadores matemáticos hace que el operador sea tratado como el operador de suma y se agreguen los valores numéricos:
Public Sub Example()
Dim left As Variant
Dim right As String
left = 5
right = "5"
Debug.Print left + right 'Prints 10
End Sub
Este comportamiento puede dar lugar a errores sutiles y difíciles de depurar, especialmente si se utilizan los tipos Variant
, por lo que normalmente solo se debe usar el operador &
para la concatenación.
Operadores de comparación
Simbólico | Nombre | Descripción |
---|---|---|
= | Igual a | Devuelve True si los operandos de la izquierda y la derecha son iguales. Tenga en cuenta que esta es una sobrecarga del operador de asignación. |
<> | No igual a | Devuelve True si los operandos de la izquierda y la derecha no son iguales. |
> | Mas grande que | Devuelve True si el operando de la izquierda es mayor que el de la derecha. |
< | Menos que | Devuelve True si el operando de la izquierda es menor que el de la derecha. |
>= | Mayor que o igual | Devuelve True si el operando de la izquierda es mayor o igual que el operando de la derecha. |
<= | Menor o igual | Devuelve True si el operando de la izquierda es menor o igual que el operando de la derecha. |
Is | Equidad de referencia | Devuelve True si la referencia del objeto de la izquierda es la misma instancia que la referencia del objeto de la derecha. También se puede utilizar con Nothing (la referencia de objeto nulo) en cualquier lado. Nota: el operador Is intentará forzar ambos operandos en un Object antes de realizar la comparación. Si cualquiera de los lados es un tipo primitivo o una Variant que no contiene un objeto (ya sea un subtipo sin objeto o vtEmpty ), la comparación dará como resultado un error 424 en tiempo de ejecución: "Objeto requerido". Si cualquiera de los operandos pertenece a una interfaz diferente del mismo objeto, la comparación devolverá True . Si necesita probar la equidad tanto de la instancia como de la interfaz, utilice ObjPtr(left) = ObjPtr(right) lugar. |
Notas
La sintaxis VBA permite "cadenas" de operadores de comparación, pero estas construcciones generalmente deben evitarse. Las comparaciones siempre se realizan de izquierda a derecha en solo 2 operandos a la vez, y cada comparación da como resultado un Boolean
. Por ejemplo, la expresión ...
a = 2: b = 1: c = 0
expr = a > b > c
... se puede leer en algunos contextos como una prueba de si b
está entre a
y c
. En VBA, esto se evalúa de la siguiente manera:
a = 2: b = 1: c = 0
expr = a > b > c
expr = (2 > 1) > 0
expr = True > 0
expr = -1 > 0 'CInt(True) = -1
expr = False
Cualquier operador de comparación que no Is
use con un Object
como operando se realizará en el valor de retorno del miembro predeterminado del Object
. Si el objeto no tiene un miembro predeterminado, la comparación dará como resultado un error 438 en tiempo de ejecución: "El objeto no admite su propiedad o método".
Si el Object
está inicializado, la comparación resultará en un error de tiempo de ejecución 91 - "Variable de objeto o Con variable de bloque no establecida".
Si se usa el literal Nothing
con cualquier operador de comparación que no sea Is
, se producirá un error de compilación: "Uso no válido del objeto".
Si el miembro predeterminado del Object
es otro Object
, VBA llamará continuamente al miembro predeterminado de cada valor de retorno sucesivo hasta que se devuelva un tipo primitivo o se genere un error. Por ejemplo, suponga que SomeClass
tiene un miembro predeterminado de Value
, que es una instancia de ChildClass
con un miembro predeterminado de ChildValue
. La comparación...
Set x = New SomeClass
Debug.Print x > 42
... serán evaluados como:
Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42
Si cualquiera de los operandos es de tipo numérico y el otro es una String
o Variant
de subtipo String
, se realizará una comparación numérica. En este caso, si la String
no se puede convertir a un número, se generará un error de tiempo de ejecución 13 - "Falta de coincidencia de tipo" en la comparación.
Si ambos operandos son una String
o Variant
de subtipo String
, se realizará una comparación de cadena en función de la configuración de Opción Comparación del módulo de código. Estas comparaciones se realizan en una base de carácter por carácter. Tenga en cuenta que la representación de caracteres de una String
contiene un número no es lo mismo que una comparación de los valores numéricos:
Public Sub Example()
Dim left As Variant
Dim right As Variant
left = "42"
right = "5"
Debug.Print left > right 'Prints False
Debug.Print Val(left) > Val(right) 'Prints True
End Sub
Por este motivo, asegúrese de que las variables String
o Variant
se conviertan en números antes de realizar comparaciones numéricas de inequidad en ellos.
Si un operando es una Date
, se realizará una comparación numérica en el valor Doble subyacente si el otro operando es numérico o se puede convertir a un tipo numérico.
Si el otro operando es una String
o Variant
de subtipo String
que se puede convertir en una Date
utilizando la configuración regional actual, la String
se convertirá en una Date
. Si no se puede convertir a una Date
en la configuración regional actual, se generará un error de tiempo de ejecución 13 - "No coincide el tipo" en la comparación.
Se debe tener cuidado al hacer comparaciones entre valores Double
o Single
y valores booleanos . A diferencia de otros tipos numéricos, no se puede suponer que los valores que no son cero sean True
debido al comportamiento de VBA de promover el tipo de datos de una comparación que implique un número de punto flotante a Double
:
Public Sub Example()
Dim Test As Double
Test = 42 Debug.Print CBool(Test) 'Prints True.
'True is promoted to Double - Test is not cast to Boolean
Debug.Print Test = True 'Prints False
'With explicit casts:
Debug.Print CBool(Test) = True 'Prints True
Debug.Print CDbl(-1) = CDbl(True) 'Prints True
End Sub
Bitwise \ Operadores lógicos
Todos los operadores lógicos en VBA se pueden considerar como "anulaciones" de los operadores a nivel de bits del mismo nombre. Técnicamente, siempre se tratan como operadores bitwise. Todos los operadores de comparación en VBA devuelven un valor booleano , que siempre tendrá ninguno de sus bits establecidos ( False
) o todos sus bits establecidos ( True
). Pero tratará un valor con cualquier bit establecido como True
. Esto significa que el resultado de convertir el resultado a nivel de bits de una expresión a un operador Boolean
(ver Operadores de comparación) siempre será el mismo que tratarlo como una expresión lógica.
Asignar el resultado de una expresión usando uno de estos operadores dará el resultado a nivel de bits. Tenga en cuenta que en las tablas de verdad a continuación, 0
es equivalente a False
y 1
es equivalente a True
.
And
Devuelve True
si las expresiones de ambos lados se evalúan como True
.
Operando de mano izquierda | Operando de mano derecha | Resultado |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Or
Devuelve True
si cualquiera de los lados de la expresión se evalúa como True
.
Operando de mano izquierda | Operando de mano derecha | Resultado |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Not
Devuelve True
si la expresión se evalúa como False
y False
si las evaluaciones de expresión son True
.
Operando de mano derecha | Resultado |
---|---|
0 | 1 |
1 | 0 |
Not
es el único operando sin un operando de la mano izquierda. El Editor de Visual Basic simplificará automáticamente las expresiones con un argumento de la mano izquierda. Si escribe ...
Debug.Print x Not y
... el VBE cambiará la línea a:
Debug.Print Not x
Se realizarán simplificaciones similares a cualquier expresión que contenga un operando de la izquierda (incluidas las expresiones) para Not
Xor
También conocido como "exclusivo o". Devuelve True
si ambas expresiones evalúan resultados diferentes.
Operando de mano izquierda | Operando de mano derecha | Resultado |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Tenga en cuenta que aunque el operador Xor
se puede usar como un operador lógico, no hay absolutamente ninguna razón para hacerlo, ya que da el mismo resultado que el operador de comparación <>
.
Eqv
También conocido como "equivalencia". Devuelve True
cuando ambas expresiones evalúan al mismo resultado.
Operando de mano izquierda | Operando de mano derecha | Resultado |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Tenga en cuenta que la función Eqv
se usa muy raramente, ya que x Eqv y
es equivalente a Not (x Xor y)
mucho más legible.
Imp
También conocido como "implicación". Devuelve True
si ambos operandos son iguales o si el segundo es True
.
Operando de mano izquierda | Operando de mano derecha | Resultado |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
Tenga en cuenta que la función Imp
es muy rara vez utilizada. Una buena regla general es que si no puede explicar lo que significa, debe usar otra construcción.