VBA Entrega15
VBA Entrega15
VBA Entrega15
VBA - Access
Entrega 15
Operadores
Eduardo Olaz
15 - 2
Operadores
A la hora de construir instrucciones en VBA, que contengan operaciones, no sólo
manejamos constantes, variable y expresiones, sino que utilizamos unos elementos
llamados Operadores, que aplicados a uno ó varios operandos, generan el resultado de la
operación.
Tipos de Operadores
Aritméticos Se usan para efectuar cálculos matemáticos
De Comparación Permiten efectuar comparaciones
De Concatenación Combinan cadenas de caracteres
Lógicos Realizan operaciones lógicas
Operadores aritméticos
VBA maneja la mayor parte de los operadores aritméticos habituales en los lenguajes de
programación.
Estos operadores son
• + Suma
• - Resta
• * Producto
• / División
• ^ Elevar a potencia
• \ División entera
• Mod Módulo ó Resto
En general, el tipo devuelto por el resultado de una operación, es el del tipo del más preciso
de los operadores, salvo que el resultado supere su rango; en ese caso devolverá el
siguiente tipo de mayor precisión. Esta regla tiene abundantes excepciones.
Para más información consulte la ayuda de Access en la que se relata toda la casuística
pormenorizada para cada uno de los operadores.
Si el resultado de una operación fuese un dato de coma flotante y se asignara a un tipo
entero, se efectuaría un redondeo.
Si se trata de asignar un resultado fuera del rango de valores de la variable que va a recibir
el resultado de la operación, se generará un error de “Desbordamiento“ y se interrumpirá la
ejecución del código, salvo que el error fuera capturado y tratado.
Operador Suma
El operador suma (+), sirve para asignar el resultado de la suma de dos números, ó en el
caso de cadenas, dar como resultado una cadena compuesta por las dos anteriores.
La forma de usarlo es
resultado = expresión1+expresión2
bytResultado = 10 + 23
Debug.Print bytResultado
bytResultado = 150 + 150
Debug.Print bytResultado
End Sub
Nos imprimirá el resultado 33 y a continuación nos generará el error nº 6 “Desbordamiento“,
ya que un tipo Byte sólo admite valores que van de 0 a 255.
Nos daría ese mismo tipo de error si tratáramos de hacer
bytResultado = 15 + (-16)
Ya que a un Byte no se le pueden asignar valores negativos
Lo mismo ocurriría en el siguiente código
Dim intResultado As Integer
strResultado = 3 + 4
Debug.Print strResultado
strResultado = 3 + "4"
Debug.Print strResultado
Hay otro sumando permitido por VBA que no deja de ser sorprendente. Es el valor Empty
(vacío) que si lo usamos con un número, ó consigo mismo, se asimila al Cero. Y con una
cadena a la cadena vacía "".
Empty + "A" Æ "A"
Empty + 3.1416 Æ 3.1416
Empty + Empty Æ 0
Esta “promiscuidad” en el manejo y la asignación entre tipos diferentes de datos que permite
Visual Basic para Aplicaciones, es algo que personalmente no me termina de convencer,
pero como decía el castizo, - “es lo que hay…”.
VBA no permite los operadores del tipo Pre ó Post Incremental como serían:
Y = ++X ó Y = X++
Operador Resta
El operador resta (-), sirve para asignar el resultado de la sustracción entre dos números.
Tiene dos formas sintácticas
resultado = expresión1-expresión2
- expresión
En la primera, la variable resultado recibe el valor resultante de restar expresión2 a
expresión1.
En la segunda se cambia el signo al valor numérico de expresión.
Si expresión1 ó expresión2 tuvieran el valor Null, resultado recibirá también
el valor Null.
Empty lo considera como valor Cero.
Como en el caso de la suma, si uno de los operadores fuera del tipo Date, el resultado
también lo será. Si desde la ventana Inmediato hacemos:
Print #3/14/5# - 100
nos mostrará
04/12/2004
Para obtener información sobre los distintos tipos devueltos, en función del de los tipos de
los operadores, consulte la ayuda de VBA.
Operador Producto
El operador producto (*), sirve para asignar el resultado del producto de dos números.
La forma de usarlo es
resultado = expresión1*expresión2
resultado es una variable de tipo numérico y tanto expresión1 como expresión2
pueden ser cualquier expresión que de como resultado un valor numérico.
El tipo numérico que se suministra a resultado dependerá de los tipos de expresión1
y expresión2.
Si uno de los operandos es del tipo Single y el otro del tipo Long, resultado recibirá
un tipo Double. Para más información consultar la ayuda de VBA.
Si alguno de los operadores es Null, resultado tomará también el valor Null.
Si alguno de los operandos es Empty, resultado será Cero. Ya que considerará que
ese operando contiene el valor Cero.
Operador División
El operador división (/),asigna el resultado de la división de dos números.
La forma de usarlo es
resultado = expresión1/expresión2
resultado es una variable de tipo numérico y tanto expresión1 como expresión2
pueden ser cualquier expresión que de como resultado un valor numérico.
Si expresión2 fuera el valor Cero, daría el error 11 de “División por cero”.
El tipo numérico que recibe resultado normalmente será del tipo Double.
Esta regla tiene varias excepciones
Si los operandos son del tipo Byte, Integer ó Single, resultado recibirá un
Single, a menos que supere el rango de Single en cuyo caso será del tipo Double.
Si uno de los operandos fuera del tipo Decimal, resultado también lo será.
Es aplicable lo dicho en los anteriores operadores matemáticos respecto a Null y Empty.
Para más información consultar la ayuda de VBA.
16 ^ 0.5 Æ 4
Adicionalmente, para obtener la raíz cuadrada en VBA existe la función Sqr.
Sqr(16) Æ 4
Cuando estudiábamos matemáticas nos contaron que en el campo de los números reales, la
raíz cuadrada de un número negativo no tiene solución. Por ello se crearon los números
imaginarios.
Si tratamos de hacer Sqr(-16)nos generará un error 5 en tiempo de ejecución,
indicando que el valor -16 no es correcto para la función Sqr.
Puede sorprender que esto no ocurra si calculamos la raíz cuadrada elevando a 0.5
-16 ^ 0.5 Æ -4
En cambio si hacemos (-16)^0.5, sí dará el error.
La razón la veremos más adelante en la prioridad de operadores.
El cálculo del operador potencia se realiza antes que el del operador de cambio de signo.
Tanto en la base como en el exponente admite números de coma flotante.
Por ejemplo podríamos obtener algo tan exótico como el resultado de elevar el número e,
base de los logaritmos Neperianos, al valor de Pi
2.7182818 ^ 3.1415926 Æ 23,1406906315563
4 \ 0 Æ Error 11
Hay que tener un especial cuidado con este operador, y no olvidar que previamente realiza
un redondeo a cero decimales, tanto del numerador como del denominador.
Este redondeo utiliza el método de redondeo vigente en el sistema bancario americano,
que es ligeramente diferente al europeo.
De este tema hablaremos cuando veamos la función Round.
Operadores de Comparación
En algunos procesos podemos necesitar establecer si un valor es menor, igual ó mayor que
otro, por ejemplo para la toma de una decisión mediante una sentencia If . . . Then.
En VBA tenemos 6 tipos de operadores para esta tarea.
Estos operadores son
Operador Like
En la entrega anterior vimos la función InStr, que permite buscar una cadena dentro de
otra y nos devuelve la posición en la que se encuentra. También vimos la función StrComp
que compara dos cadenas diciéndonos cuál es “menor”.
Para la comparación entre cadenas tenemos también un operador adicional
• Like Permite comparar una expresión patrón con una cadena, indicándonos
si esa cadena cumple con lo indicado en la patrón.
Su sintaxis es
resultado = cadena Like patrón
Para el operador Like, también es aplicable lo comentado anteriormente sobre Option
Compare. Para obtener más información al respecto puede consultar la información sobre
el operador Like en la ayuda de VBA.
Comencemos a programar con VBA - Access
15 - 10
Operador Is
Para la comparación entre objetos tenemos un operador adicional, es el operador IS.
Case 10
- - -
Case is > 10
En ellas comprobamos si la variable pasada como testigo es menor ó mayor que 10.
Hay otro entorno en el que se usa Is y es en estructuras del tipo If . . . Then; en concreto
acompañando a la expresión TipeOf.
TipeOf devuelve el tipo de un objeto.
Se usa de la siguiente forma
TypeOf nombre_objeto Is tipo_objeto
Esto nos puede servir, por ejemplo para cambiar las propiedades de objetos en función del
tipo al que pertenecen.
Para ilustrar esto vamos a crear un formulario nuevo.
Al cargar el formulario, examinará los controles que hay en él.
Asignará a todos los controles la misma altura (propiedad Height) y ordenará las
etiquetas, cuadros de texto y botones que contenga.
Ajustará la distancia que haya entre la parte izquierda del control y la parte izquierda del
formulario (propiedad Left).
Ajustará también la distancia respecto a la parte superior de la sección donde están
ubicados (propiedad Top).
Las otras dos propiedades que ajustará serán
Texto del control (propiedades Caption o el valor por defecto de los cuadros de texto)
Anchura del control (propiedad Width).
En la barra del menú del Cuadro de Herramientas, desactivamos el botón [Asistentes para
controles] (la de la varita mágica).
Ponemos en el formulario
• 4 Cuadros de texto
• 2 Etiquetas adicionales (ponles un texto para ver el efecto)
• 3 botones
Procuraremos poner los controles de una manera desordenada, y variando sus tamaños.
Nuestro formulario podría tener un aspecto tan patético como éste:
Vemos que no es probable que obtenga el premio al diseño del formulario del año.
Para tratar de poner orden en este caos, vamos a hacer que sea Access el que lo haga
utilizando código. Aprovecharemos el evento Al cargar del formulario
Teniendo seleccionado el formulario, en la ventana de propiedades seleccionamos el evento
Al cargar y en el editor de código escribimos lo siguiente:
Private Sub Form_Load()
Const conlngAltura As Long = 300
Dim ctr As Control
Dim lngEtiquetas As Long
Dim lngCuadrosTexto As Long
Dim lngBotones As Long
End If
Next ctr
End Sub
Este código hace que el formulario, tras cargarse, tome este otro aspecto
Su sintaxis es TypeName(nombrevariable)
Operadores de concatenación
Los operadores de concatenación sirven para unir varias cadenas en una sola.
Estos operadores son
• + Suma
• & Ampersand
Ya he comentado la posibilidad que tiene el operador suma para unir cadenas, al igual que
el operador &.
También he comentado mi preferencia por el operador & para efectuar estas tareas.
La sintaxis para estos operadores es
resultado = expresión1 + expresión2
resultado = expresión1 & expresión2
Operadores lógicos
Los operadores lógicos sirven para realizar operaciones lógicas con los operandos.
Estos operadores son
Operador And
El operador And, realiza una conjunción lógica entre dos expresiones operandos.
Su sintaxis es
Operador Or
El operador Or, realiza una Disyunción lógica entre dos operandos.
Su sintaxis es
resultado = expresión1 Or expresión2
Resultado puede ser cualquier variable numérica ó boleana.
resultado tomará el valor True, si cualquiera de las dos expresiones es True.
Las combinaciones de False con False da False.
Null con False ó con Null da Null
A nivel de bits, en operaciones con números, Or dará 1 salvo en el caso de que ambos bits
valgan 0.
5 Or 13 Æ 13
0101
1101
1101
El binario 1101 es en notación decimal el número 13
Con el operador And, hemos visto que podemos averiguar qué bit está activado en una
expresión.
El operador Or nos permite definir el valor de un determinado bit de un valor.
Supongamos que tenemos un dispositivo que contiene la propiedad Config de tipo Long,
que controla el funcionamiento del mismo.
Comencemos a programar con VBA - Access
15 - 18
Operador Xor
El operador Xor, realiza una Exclusión lógica entre dos operandos.
Su sintaxis es
resultado = expresión1 Xor expresión2
Resultado puede ser cualquier variable numérica ó boleana.
Tomará el valor True, si una de las dos expresiones es True y la otra False.
Si cualquiera de ellas es Null, dará Null.
Si las dos son a la vez False o True dará False.
Cuadro de resultados del operador Xor
Expresión 1ª Expresión 2ª Resultado
True True False
True False True
False True True
False False False
Operador Not
El operador Not, realiza una Negación lógica sobre una expresión.
Su sintaxis es
resultado = Not expresión
Resultado puede ser cualquier variable numérica ó boleana.
Tomará el valor True, si expresión es False y a la inversa.
Si expresión fuese Null, devolverá Null.
Cuadro de resultados del operador Not
Expresión Resultado
True False
False True
Null Null
Operador Eqv
El operador Eqv, realiza una Equivalencia lógica entre dos expresiones.
Su sintaxis es
resultado = expresión1 Eqv expresión2
resultado puede ser cualquier variable numérica ó boleana.
Si alguna de las expresiones fuera Null, el resultado será Null.
Si los dos operandos fuesen True ó False, daría como resultado True.
En caso contrario daría False.
Cuadro de resultados del operador Eqv
Expresión 1ª Expresión 2ª Resultado
True True True
True False False
False True False
False False True
Podría considerarse como el operador inverso a Xor.
En operaciones a nivel de bit, dará 1 si los dos bits fueran iguales.
Si uno de los dos es 0 y el otro 1 dará 0.
5 Eqv 13 Æ -9
0000000000000101
0000000000001101
1111111111110111
El binario 1111111111110111 es el número -9
Operador Imp
El operador Imp, realiza una Implicación lógica entre dos expresiones.
Su sintaxis es
resultado = expresión1 Imp expresión2
resultado puede ser cualquier variable numérica ó boleana.
Cuadro de resultados del operador Imp
Expresión 1ª Expresión 2ª Resultado
True True True
True False False
True Null Null
False True True
False False True
False Null True
Null True True
Null False Null
Null Null Null
1. 19 And 7 Æ 3
2. 4 Or 3 Æ 7
3. 7 Or 13 Æ 15
Si quisiéramos que evaluara primero 4 or 19, 7 or 13 y luego los respectivos
resultados mediante And, deberíamos haber escrito
(4 Or 19) And (7 Or 13)
Que nos dará como resultado 7.
La utilización de paréntesis aclara el código y ayuda a evitar errores en el diseño del mismo,
muchas veces con resultados inesperados, y de difícil detección.