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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow