Vous êtes sur la page 1sur 13

Excel VBA y macros: Una herramienta muy til para trabajar hojas de clculo Esta es la segunda parte de los

posts para ensear a usar macros de Excel. Si te perdiste la primera parte, aqu la puedes encontrar. En esta segunda leccin nos familiarizaremos con el editor de cdigo y aprenderemos a trabajar con variables y algunas estructuras de datos.

Trata de ir despacio, un poco cada da, comprendiendo bien y luego prosiguiendo. No vayas con prisa porque voy a presentar bastante informacin, y lo ms importante es que te familiarices poco a poco.

El editor de cdigo de VBA

El rea de trabajo del editor se divide en 4 zonas:

Mdulos Propiedades Cdigo o form Pantalla de mensajes de depuracin

Mdulos Los mdulos son como una especie de pergamino largo donde escribes cdigo. Cada uno de los "pergaminos" de las hojas de clculo abiertas se muestran en esta zona. Los mdulos pueden tener asociada una interface grfica (una ventana de Windows) asociada, o pueden no tenerla y ejecutar instrucciones sin desplegar nada.

Hay 3 tipos de mdulos:

Forms: Cdigo que tiene una ventana de Windows asociada. Modules: Cdigo sin interface grfica. Class modules: Cdigo que se usa para crear objetos. Es para programadores ms avanzados, no vamos a cubrir esta parte aqu. Propiedades Si seleccionas un mdulo o un elemento de la interface grfica de tu programa, vers que se tiene asociada una lista de valores asociados a caractersticas, llamadas propiedades, para cada uno.

Cdigo o form El cdigo est compuesto por instrucciones que tu le das a la mquina. Esas instrucciones se ejecutan, pero no necesariamente resultan visibles al usuario durante la ejecucin. En pocas palabras aqu es donde escribirs el cdigo. Slo asegrate de que ests ubicado en el mdulo apropiado.

Los forms (o formularios) son lo que tu llamaras una "ventana" que en realidad es una superficie que contiene controles, como por ejemplo un botn o una zona para escribir texto, y que se muestra visible en algn momento de la ejecucin.

Pantalla de mensajes de depuracin Cuando ests haciendo tu programa, puedes desplegar lo que quieras en esta regin, usando el comando DEBUG.PRINT seguido por lo que deseas que se despliegue. Es en realidad un rea para el programador, porque el usuario de la macro no ver este texto a menos que entre al editor de macros durante una sesin. Normalmente un programador la usa para desplegar y verificar los datos o resultados que produce un programa en algn momento de la ejecucin.

Editando forms

Cuando editas forms, vas a tener dos zonas de inters:

Paleta de controles Form

En la paleta de controles escoges un control al pincharlo y vas al form a colocar el control. Los controles se colocan al dibujar un rectngulo encima del form, como cuando dibujas un rectngulo en MSPaint. Si haces doble clic sobre un control que colocaste sobre el form, pasars a editar el cdigo para dicho control.

Estructura del cdigo dentro de los mdulos

Cuando escribas cdigo dentro del mdulo incluirs procedimientos o subrutinas (Sub) y funciones (Function). Las subrutinas y funciones son fragmentos de cdigo que tienen un propsito especfico y que se activan en determinadas circunstancias, definidas por el que crea la macro. Cada subrutina o funcin tendr un inicio y un final claramente definidos.

Antes de las subrutinas y funciones se efecta la declaracin de variables y estructuras de datos que vas a usar y que sern utilizadas por varias subrutinas y funciones del mdulo.

Entendiendo las variables como medio para almacenar datos

Puedes imaginar las variables como celdas de datos que existen en memoria pero que no puedes ver, y al igual que en matemtica, a dichas celdas se les asigna un nombre de una variable. Por ejemplo, en lugar de decir que la celda A2 contiene un nmero 3, podramos decir que la variable X contiene un nmero 3. La variable X es como una celda oculta que no ves y que contiene el nmero. Esas variables necesitan ser creadas en la memoria, algo a lo que se le llama "dimensionar" o "declarar" una variable.

Para declarar o crear una variable X debemos indicar el tipo de variable que queremos, dependiendo del tipo de dato que almacenaremos. En este caso crearemos una variable X del

tipo Long (slo admite nmeros enteros). El tipo indica el tipo de datos que va almacenado en la variable.

Dim X As Long

Aunque existen muchos tipos de datos, slo voy a enumerar los tipos de datos ms comunes que deberas usar:

String: Representa variables que contienen texto (en realidad contienen un grupo de caracteres alfanumricos y simblicos). Long: Adminten valores enteros solamente Double: Admiten valores con punto decimal, ya sea valores muy grandes o valores con muchas cifras decimales. Date: Fechas. Este tipo de dato lo analizaremos ms adelante. Variant: Este no es un tipo de datos que vayas a usar. Si se te olvida declarar una variable, no te dar un error, sino que VB lo asignar al tipo Variant y puede aceptar valores de cualquier tipo, pero a un costo. Procesar variables de tipo Variant hace muy lento lo que hagas. Evita la presencia de variables Variant o variables no declaradas. En las subrutina o precedimiento ahora podemos usar esta variable X como la usaramos en matemticas. Cabe sealar que siempre es buena prctica inicializar la variable, darle un valor inicial. Imaginemos el siguiente cdigo dentro de un mdulo. Este cdigo desplegar los valores de las variables en la pantalla de depuracin, porque usa el comando Debug.Print.

En este ejemplo X tendr un valor de 3 y la variable Y usar el valor de X al que le sumar 2. Se parece mucho a la manera de hacer frmulas en secundaria. A la izquierda tienes la variable que almacenar el resultado y a la derecha una expresin de la cual resultar un valor que se almacena en la variable.

Dim X As Long Dim Y As Long

Sub Main()

X=3 Y=X+2 Debug.Print "El valor de X es "; X ; " y el valor de Y es ";Y End Sub Cabe indicar que si declaras las variables al inicio, antes de la primera subrutina o funcin, los valores sern visibles por todas las subrutinas y funciones del mdulo. Si colocas la declaracin dentro de la subrutina, slo ser visible dentro de la subrutina.

Sub Main() Dim X As Long Dim Y As Long X=3 Y=X+2 Debug.Print "El valor de X es "; X ; " y el valor de Y es ";Y End Sub Los vectores son como una coleccin de celdas que se llaman con un nombre de una variable, pero al contener varios valores deben ser direccionados por un subndice.

He aqu un ejemplo que crea el vector y lo llena con valores, usando frmulas. El asterisco (*) se usa para multiplicacin y el slash (/) se usa para divisin.

Sub Main() Dim A(4) As Long A(0) = 100 A(1) = A(0) * 2 A(2) = A(0) + A(1) * 2 A(3) = 356 A(4) = 890 / 2 Debug.Print "El valor de A(0) es "; A(0) Debug.Print "El valor de A(1) es "; A(1) Debug.Print "El valor de A(2) es "; A(2) Debug.Print "El valor de A(3) es "; A(3) Debug.Print "El valor de A(4) es "; A(4) End Sub

Cabe notar que en el cdigo anterior el tamao del vector es fijo. Tu puedes crear vectores de tamao variable. En el siguiente ejemplo se crea el vector A, luego se le cambia el tamao para que albergue el elemento cero, y luego se le cambia el tamao para que albergue hasta el elemento 4. Este proceso de crear vectores sin un tamao, y luego cambiarles el tamao se conoce como "dynamic memory allocation" (asignacin dinmica de memoria). La palabra Preserve indica que no debe borrar los valores ya existentes en el vector. Si no le pones esa palabra, cambiar el tamao y vaciar el vector.

Sub Main() Dim A() As Long Redim A(0) A(0) = 100

Redim Preserve A(4) A(1) = A(0) * 2 A(2) = A(0) + A(1) * 2 A(3) = 356 A(4) = 890 / 2 Debug.Print "El valor de A(0) es "; A(0) Debug.Print "El valor de A(1) es "; A(1) Debug.Print "El valor de A(2) es "; A(2) Debug.Print "El valor de A(3) es "; A(3) Debug.Print "El valor de A(4) es "; A(4) End Sub Las matrices de dos dimensiones son como tablas. En este caso tenemos una matriz en dos dimensiones, pero podramos tener una matriz de 3 dimensiones.

Asi podemos crear una matriz de la siguiente forma:

Dim A(3,3) As Long

A una matriz tambin le podemos aplicar el dynamic memory allocation, pero slo para la ltima dimensin. Si declaraste una matriz de 3 x 5 (3 filas y 2 columnas) slo podrs agregar columnas.

A la hora de usar los valores de la matriz, primero va el valor de la fila y luego el valor de la columna. En este ejemplo la fila 2 y columna 1 tendr un valor de 6.

B(2,1) = 6 B(3,1) = B(2,1) + 2

En los casos anteriores tenemos una variable que representa un grupo de datos llamado Array (Arreglo). En los casos que vimos el tipo de dato que se usa es siempre el mismo para todos los elementos del arreglo. Sin embargo a veces podramos tener estructuras de datos que no siempre contienen datos del mismo tipo.

Imagina que tenemos una tabla que contiene los siguientes datos de bolsa.

Fecha y hora Precio de apertura Precio de cierre Precio mximo Precio mnimo En lugar de crear 5 vectores, o crear 1 vector tipo Date para la fecha y una matriz de tipo Double para los precios, podemos crear una estructura que combina ambos.

Escribimos el siguiente cdigo para declarar una estructura llamada TipoRegistro que es en realidad un tipo personalizado que combina varios tipos. La estructura estar fuera de las subrutinas y funciones, en la seccin de declaracin del mdulo respectivo.

Private Type TipoRegistro Fecha As Date Apertura As Double Cierre As Double Maximo As Double

Minimo As Double End Type Y luego creamos una variable que contendr esa estructura. La variable puede estar dentro o fuera de una subrutina o funcin.

Dim D(4) As TipoRegistro Cuando queramos usar un valor de esa estructura, lo haremos de la siguiente manera. En este ejemplo Stop es otra variable que debera ser declarada en algn lado para que no sea de tipo Variant. Las variables no slo pueden estar compuestas por una sola letra, sino que puedes darle un nombre a la variable (sin usar espacios) que signifique algo.

D(0).Apertura = 100 Stop = D(0).Apertura Como notars, D es un vector que en lugar de contener una fila de datos, contiene en realidad una fila de datos de un registro burstil. Hasta ahora hemos aprendido a navegar en el editor, y hemos comprendido cmo crear espacios en memoria para extraer o almacenar datos, usando frmulas.

Sin embargo las celdas de Excel tambin pueden usarse para almacenar valores o para extraer valores. En este ejemplo tomamos el valor de la celda E3 (fila 3, columna 5) y sumamos 1 y almacenamos el resultado en X. Asimismo la celda B1 (fila 1 y columna 2) almacenar el resultado de multiplicar Y por 5.

X = Cells(3,5) + 1 Cells(1,2) = Y * 5

Cabe aadir que aunque te parezca tentador usar celdas en lugar de variables, extraer o almacenar valores en celdas es un proceso muy lento, y por eso es mejor usar variables y minimizar el uso de celdas en frmulas dentro de tu cdigo. Lo mejor si vas a usar valores de celdas es pasar el valor de la celda a una variable y hacer operaciones con esa variable.

Repitiendo instrucciones usando FOR / NEXT

Podremos realizar clculos ms complejos que involucren procesos que se repiten muchas veces? Si. Seguramente recuerdas que en el cdigo anterior tenamos este cdigo:

Debug.Print "El valor de A(0) es "; A(0) Debug.Print "El valor de A(1) es "; A(1) Debug.Print "El valor de A(2) es "; A(2) Debug.Print "El valor de A(3) es "; A(3) Debug.Print "El valor de A(4) es "; A(4)

Qu pasara si el vector que usamos tuviese 10 mil elementos en lugar de 5 elementos (desde 0 hasta 4)? Evidentemente deberas declarar el arreglo para que tenga 10 mil elementos.

Dim A(10000) As Long

Sera terriblemente cansado realizar el proceso de escribir 10 mil veces lo mismo. Lo mejor sera reemplazarlo por cdigo que use For / Next:

For i = 0 to 10000 Debug.Print "El valor de A("; i ; ") es "; A(i)

Next i

En este caso la variable i (que deberas haber declarado tambin) sirve de contador, y su valor variar desde 0 hasta 10000. El cdigo que se encuentra entre la lnea donde st el comando FOR y la lnea donde est el NEXT, se repetir y en cada iteracin la variable i se incrementar de 1 en 1.

Cabe notar que si el FOR usa la variable "i", tambin el NEXT debe referirse a "i". Adems, si haces el ciclo FOR NEXT desde 0 hasta 10 mil y el vector A tiene menos de 10 mil elementos, en algn momento lanzar un aviso de error, porque la variable "i" apunta a un valor del vector que no existe.

Prueba ahora este cdigo en una macro hecha por t:

Sub Main() Dim fila as Long Dim columna as Long

For columna = 1 to 4 For fila = 1 to 10 Cells(fila,columna) = columna * 10 + fila Next fila Next columna End Sub El resultado te parecer muy interesante. Como observas aqu tenemos dod ciclos FOR, uno dentro del otro, que es lo que se llama tener "ciclos anidados". Cabe notar que el ltimo FOR es el de la fila, y por ende el primer NEXT deber ser para la fila.

Tomando decisiones con IF THEN ELSE

Vamos a llenar las primeras 10 filas de la primera columna en la hoja de Excel con valores numricos. Si el valor de la primera columna es mayor que 5, entonces despliegue "SI" o de lo contrario despliegue "NO".

Sub Main() Dim i As Long Randomize Timer 'Activar generador de nmeros aleatorios For i = 1 to 10 Cells(i,1) = Int(Rnd * 10) 'Agregar un valor aleatorio entero de 0 a 10 en las celdas de la primera columna If Cells(i,1)>5 Then 'Inicia toma de decisin. Si se cumple la condicin de que el valor de la celda en la primera columna es mayor que 5 entonces... Cells(i,2) = "SI" '...poner SI en la columna 2. Else 'De otro modo, si no se cumple la condicin... Cells(i,2) = "NO" '...poner NO en la columna 2. End If 'Aqu termina la decisin. Next i End Sub Como puedes observar, lo que hizo el programa fue tomar una decisin. Rnd es un nmero aleatorio (en ingls se dice "random") cuyo valor oscila entre 0 y 1 pero nunca llega a ser 1. La funcin Int(x) lo que hace es tomar el valor x, para recortarle los decimales y obtener un nmero entero. Al multiplicar un nmero aleatorio entre 0 y 1 por 10, se obtiene un nmero aleatorio entre 0 y 10.

Prueba ejecutar este cdigo varias veces.

Eplogo

Hasta ahora no hemos visto un ejemplo completo, sino que hemos experimentado un poco con cdigo. Aprender a programar al inicio resulta un poco dificil porque uno requiere aprender muchas reglas, as que tmate tu tiempo para comprender cada ejemplo, lo que hace el cdigo. Y si tienes preguntas las puedes postear aqu.

Creo que ya estamos listos para un ejemplo un poco ms real para el siguiente post. Mientras llega, trata de familiarizarte y experimentar. Aqu se trata de hacer cosas a ver qu pasa, familiarizarse con una ambiente extrao. Todava no vamos en serio.

Estoy consciente de que he ido un poco rpido y no he cubierto todo lo que tiene que ver con FOR/NEXT o IF/THEN/ELSE pero es que no he querido saturar de informacin.

Vous aimerez peut-être aussi