ELEMENTOS BÁSICOS PARA LA PROGRAMACIÓN DE FUNCIONES TIPOS DE DATOS Constantes Una constante se usa para guardar o identificar a un dato que mantiene un valor constante a través de la ejecución de un programa. Las constantes pueden ser cadenas de caracteres o constantes numéricas. Variables en VBA Una variable se utiliza para guardar información temporal la cual será utilizada dentro de un procedimiento, módulo o libro. Antes de entrar en detalle de las variables, hay algunas reglas importantes que usted debe conocer. 1) El nombre de una constante o variable debe comenzar con una letra y no un número. Los números pueden ser incluidos en el nombre, pero no como el primer carácter. 2) El nombre de una constante o variable puede tener más de 250 caracteres. 3) El nombre de una constante o variable no puede ser la misma que cualquiera de las palabras clave de Excel, esto quiere decir que no se puede nombrar una variable con nombres tales como hojas, etc. 4) Los nombres de constantes o variables deben consistir en una cadena continua de sólo caracteres. Puede separar las palabras, ya sea con mayúsculas en la primera letra de cada palabra, o mediante el uso de los caracteres de subrayado. Puede nombrar las variables con cualquier nombre válido, por ejemplo usted podría nombrar una variable Benjamín y declararla como Entero u otro tipo de dato, sin embargo, es una buena práctica el uso de convenciones de nomenclatura, de esta manera sabremos a simple vista que tipo de dato es nuestra variable. La tabla siguiente muestra los tipos de datos compatibles, incluyendo el tamaño de almacenamiento y el intervalo. Tipo de datos Tamaño de almacenamiento Intervalo Byte 1 byte 0 a 255 Boolean 2 bytes True o False Integer 2 bytes -32,768 a 32,767 Long 4 bytes -2,147,483,648 a 2,147,483,647 Pag. 1
(entero largo) Single (coma flotante/ precisión simple) Double (coma flotante/ precisión doble) 4 bytes -3,402823E38 a 1,401298E-45 para valores negativos; 1,401298E-45 a 3,402823E38 para valores positivos 8 bytes -1.79769313486231E308 a -4,94065645841247E-324 para valores negativos; 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos Date 8 bytes 1 de enero de 100 a 31 de diciembre de 9999 Object 4 bytes Cualquier referencia a tipo Object String (longitud fija) Longitud de la cadena Desde 1 a 65.400 aproximadamente Variant (con números) 16 bytes Cualquier valor numérico hasta el intervalo de un tipo Double INSTRUCCIÓN DIM La instrucción DIM es la instrucción que permite declarar variables para el manejo de los diferentes tipos de datos. Ejemplos: Dim salario as single, tarifa as single Dim horastrabajadas as integer, contador as integer Pag. 2
ESTRUCTURAS DE CONTROL EN VISUAL BASIC DE APLICACIONES (vba) Las estructuras de control son construcciones algorítmicas que controlan el flujo de un programa, es decir determinan el orden de ejecución de las sentencias o instrucciones. La técnica de programación estructurada requiere el uso de las tres estructuras de control: secuenciales, selectivas y de repetición. 1. Secuenciales La secuencia de ejecución de las instrucciones o sentencias es una a continuación de otra en el orden en el que están dispuestas. 2. De selección binaria. Esta estructura permite bifurcar el flujo de control de ejecución en una u otra dirección dependiendo del cumplimiento de una condición. Utilizar instrucciones If...Then...Else Se puede usar la instrucción If...Then...Else para ejecutar una instrucción o bloque de instrucciones determinadas, dependiendo del valor de una condición. Las instrucciones If...Then...Else se pueden anidar en tantos niveles como sea necesario. Sin embargo, para hacer más legible el código es aconsejable utilizar una instrucción Select Case en vez de recurrir a múltiples niveles de instrucciones If...Then...Else anidadas. Ejecutar una sola instrucción cuando una condición es True Para ejecutar una sola instrucción cuando una condición es True, se puede usar la sintaxis de línea única de la instrucción If...Then...Else. El siguiente ejemplo muestra la sintaxis de línea única, en la que se omite el uso de la palabra clave Else: Sub FijarFecha() mifecha = #13/2/95# If mifecha < Now Then mifecha = Now Para ejecutar más de una línea de código, es preciso utilizar la sintaxis de múltiples líneas. Esta sintaxis incluye la instrucción End If, tal y como muestra el siguiente ejemplo: Sub AvisoUsuario(valor as Long) If valor = 0 Then Aviso.ForeColor = "Red" Aviso.Font.Bold = True Aviso.Font.Italic = True End If Pag. 3
Ejecutar unas instrucciones determinadas si una condición es True y ejecutar otras si es False Use una instrucción If...Then...Else para definir dos bloques de instrucciones ejecutables: un bloque que se ejecutará cuando la condición es True y el otro que se ejecutará si la condición es False. Sub AvisoUsuario(valor as Long) If valor = 0 Then Aviso.ForeColor = vbred Aviso.Font.Bold = True Aviso.Font.Italic = True Else Aviso.Forecolor = vbblack Aviso.Font.Bold = False Aviso.Font.Italic = False End If Comprobar una segunda condición si la primera condición es False Se pueden añadir instrucciones ElseIf a una instrucción If...Then...Else para comprobar una segunda condición si la primera es False. Por ejemplo, el siguiente procedimiento función calcula una bonificación salarial dependiendo de la clasificación del trabajador. La instrucción que sigue a la instrucción Else sólo se ejecuta cuando las condiciones de todas las restantes instrucciones If y ElseIf son False. Function Bonificación(rendimiento, salario) If rendimiento = 1 Then Bonificación = salario * 0.1 ElseIf rendimiento = 2 Then Bonificación= salario * 0.09 ElseIf rendimiento = 3 Then Bonificación = salario * 0.07 Else Bonificación = 0 End If End Function 3. De selección múltiple. Esta estructura permite realizar un cálculo según sea el valor de una variable o expresión, permite desviar el flujo de control por más de dos opciones. Utilizar instrucciones Select Case La instrucción Select Case se utiliza como alternativa a las instrucciones ElseIf en instrucciones If...Then...Else cuando se compara una expresión con varios valores diferentes. Mientras que las instrucciones If...Then...Else pueden comparar una expresión distinta para cada instrucción ElseIf, la ins- Pag. 4
trucción Select Case compara únicamente la expresión que evalúa al comienzo de la estructura de control. En el siguiente ejemplo, la instrucción Select Case evalúa el argumento rendimiento que se pasa al procedimiento. Observe que cada instrucción Case puede contener más de un valor, una gama de valores, o una combinación de valores y operadores de comparación. La instrucción opcional Case Else se ejecuta si la instrucción Select Case no encuentra ninguna igualdad con los valores de la instrucciones Case. Function Bonificación(rendimiento, salario) Select Case rendimiento Case 1 Bonificación = salario * 0.1 Case 2, 3 Bonificación = salario * 0.09 Case 4 To 6 Bonificación = salario * 0.07 Case Is > 8 Bonificación = 100 Case Else Bonificación = 0 End Select End Function 4. De repetición automática contada. Esta estructura permite realizar de manera repetitiva una sentencia o bloque de sentencias, las repeticiones son automáticamente contadas por un contador llamado variable de control. El valor de esta variable de control inicia con un valor, determinado por el límite inferior, y termina cuando la variable de control alcance el límite superior. Utilizar instrucciones For...Next Sintaxis For Vc = Li To Ls [Step P] Sentencias Next Las instrucciones For...Next se pueden utilizar para repetir un bloque de instrucciones un número determinado de veces. Los bucles For usan una variable contador cuyo valor se aumenta o disminuye cada vez que se ejecuta el bucle. El siguiente procedimiento hace que el equipo emita un sonido 50 veces. La instrucción For determina la variable contador x y sus valores inicial y final. La instrucción Next incrementa el valor de la variable contador en 1. Pag. 5
Sub Bips() For x = 1 To 50 Beep Next x Mediante la palabra clave Step, se puede aumentar o disminuir la variable contador en el valor que se desee. En el siguiente ejemplo, la variable contador j se incrementa en 2 cada vez que se repite la ejecución del bucle. Cuando el bucle deja de ejecutarse, total representa la suma de 2, 4, 6, 8 y 10. Sub DosTotal() For j = 2 To 10 Step 2 total = total + j Next j MsgBox "El total es " & total Para disminuir la variable contador utilice un valor negativo en Step. Para disminuir la variable contador es preciso especificar un valor final que sea menor que el valor inicial. En el siguiente ejemplo, la variable contador minum se disminuye en 2 cada vez que se repite el bucle. Cuando termina la ejecución del bucle, total representa la suma de 16, 14, 12, 10, 8, 6, 4 y 2. Sub NuevoTotal() For minum = 16 To 2 Step -2 total = total + minum Next minum MsgBox "El total es " & total Nota: No es necesario incluir el nombre de la variable contador después de la instrucción Next. En los ejemplos anteriores, el nombre de la variable contador se ha incluido para facilitar la lectura del código. Se puede abandonar una instrucción For...Next antes de que el contador alcance su valor final, para ello se utiliza la instrucción Exit For. Por ejemplo, si se produce un error se puede usar la instrucción Exit For en el bloque de instrucciones True de una instrucción If...Then...Else o Select Case que detecte específicamente ese error. Si el error no se produce, la instrucción If Then Else es False y el bucle continuará ejecutándose normalmente. 5. De repetición condicionada. Utilizar instrucciones Do...Loop Se pueden usar instrucciones Do...Loop para ejecutar un bloque de instrucciones un número indefinido de veces. Las instrucciones se repiten mientras una condición sea True o hasta que llegue a ser True. Repetir instrucciones mientras una condición es True Pag. 6
Hay dos formas de utilizar la palabra clave While para comprobar el estado de una condición en una instrucción Do...Loop. Se puede comprobar la condición antes de entrar en el bucle, o después de que el bucle se haya ejecutado al menos una vez. En el siguiente procedimiento ComPrimeroWhile, la condición se comprueba antes de entrar en el bucle. Si minum vale 9 en vez de 20, las instrucciones contenidas en el bucle no se ejecutarán nunca. En el procedimiento ComFinalWhile, las instrucciones contenidas en el bucle sólo se ejecutarán una vez antes de que la condición llegue a ser False. Sub ComPrimeroWhile() minum = 20 Do While minum > 10 minum = minum - 1 Loop MsgBox "El bucle se ha repetido " & contador & " veces." Sub ComFinalWhile() minum = 9 Do minum = minum - 1 Loop While minum > 10 MsgBox "El bucle se ha repetido " & contador & " veces." Repetir instrucciones hasta que una condición llegue a ser True Hay dos formas de utilizar la palabra clave Until para comprobar el estado de una condición en una instrucción Do...Loop. Se puede comprobar la condición antes de entrar en el bucle (como muestra el procedimiento ComPrimeroUntil) o se pueden comprobar después de que el bucle se haya ejecutado al menos una vez (como muestra el procedimiento ComFinalUntil). El bucle sigue ejecutándose mientras la condición siga siendo False. Sub ComPrimeroUntil() minum = 20 Do Until minum = 10 minum = minum - 1 Loop MsgBox "El bucle se ha repetido " & contador & " veces." Pag. 7
Sub ComFinalUntil() minum = 1 Do minum = minum + 1 Loop Until minum = 10 MsgBox "El bucle se ha repetido " & counter & " veces." Instrucción de salida de Do...Loop desde dentro del bucle Es posible salir de Do...Loop usando la instrucción Exit Do. Por ejemplo, para salir de un bucle sin fin, se puede usar la instrucción Exit Do en el bloque de instrucciones True de una instrucción If...Then...Else o Select Case. Si la condición es False, el bucle seguirá ejecutándose normalmente. En el siguiente ejemplo, se asigna a minum un valor que crea un bucle sin fin. La instrucción If...Then...Else comprueba esa condición y ejecuta entonces la salida, evitando así el bucle sin fin. Sub EjemploSalida() minum = 9 Do Until minum = 10 minum = minum - 1 If minum < 10 Then Exit Do Loop MsgBox "El bucle se ha repetido " & contador & " veces." Nota Para detener la ejecución de un bucle sin fin, presione la tecla ESC o CTRL+PAUSE. Utilizar instrucciones For Each...Next Las instrucciones For Each...Next repiten un bloque de instrucciones para cada uno de los objetos de una colección o para cada elemento de una matriz. Visual Basic asigna valor automáticamente a una variable cada vez que se ejecuta el bucle. Por ejemplo, el siguiente procedimiento cierra todos los formularios excepto el que contiene al procedimiento que se está ejecutando. Sub CierraFormul() For Each frm In Application.Forms If frm.caption <> Screen.ActiveForm.Caption Then frm.close Next Pag. 8
El siguiente código recorre todos los elementos de una matriz e introduce en cada uno de ellos el valor de la variable índice I. Dim PruebaMatriz(10) As Integer, I As Variant For Each I In PruebaMatriz PruebaMatriz(I) = I Next I Recorrer un conjunto de celdas Se puede usar el bucle For Each...Next para recorrer las celdas pertenecientes a un rango determinado. El siguiente procedimiento recorre las celdas del rango A1:D10 de la Página1 y convierte cualquier valor absoluto menor de 0,01 en 0 (cero). Sub RedondeoACero() For Each miobjeto in micoleccion If Abs(miObjeto.Value) < 0.01 Then miobjeto.value = 0 Next Salir de un bucle For Each...Next antes de que finalice Se puede salir de un bucle For Each...Next mediante la instrucción Exit For. Por ejemplo, cuando se produce un error se puede usar la instrucción Exit For en el bloque de instrucciones True de una instrucción If...Then...Else o Select Case que detecte específicamente el error. Si el error no se produce, la instrucción If Then Else es False y el bucle se seguirá ejecutando normalmente. El siguiente ejemplo detecta la primera celda del rango A1:B5 que no contiene un número. Si se encuentra una celda en esas condiciones, se presenta un mensaje en pantalla y Exit For abandona el bucle. Sub BuscaNumeros() For Each miobjeto In MiColeccion If IsNumeric(miObjeto.Value) = False Then MsgBox "El objeto contiene un valor no numérico." Exit For End If Next c Pag. 9