Está en la página 1de 7

Excel incluye un intrprete de Visual Basic con el que se puede aumentar el poder del programa definiendo nuevos comandos

y funciones que proporcionan una enorme potencia a las macros. Solamente se requieren mnimos conocimientos de lgica y programacin.

PCW 250

TUTOR

Programacin de macros y funciones en Excel

Excel, Visual Basic y Master Mind


Claudio H. Snchez claudio@pcw.idg.es

na macro puede definirse como un sper comando, que permite ejecutar varias operaciones sucesivas con una nica orden. Por ejemplo, supongamos una hoja de clculo en la que tengamos que ordenar una lista, luego copiarla ordenada en otra hoja y, finalmente, imprimir esta segunda hoja. Se trata de tres operaciones: ordenar, copiar, imprimir. Una macro nos permitira ejecutar las tres operaciones de una sola vez: tomando una sola opcin del men, usando una nica combinacin de teclas o haciendo clic sobre un botn adecuado. Para obtener una macro as, tenemos que escribir un programa, una lista de instrucciones que, traducidas a un lenguaje que Excel pueda entender, equivalgan a las operaciones anteriores. As, por ejemplo, la accin de imprimir la hoja actual se representa en una macro mediante la instruccin ActiveWindow.SelectedSheets.PrintOut Copies:=1

Esto podra traducirse como imprimir una copia de la hoja seleccionada en la ventana activa. En qu idioma? En VBA (Visual Basic para Aplicaciones), una variante del lenguaje Visual Basic que se usa en la programacin de Excel. Con ellas podemos ampliar las opciones del programa, dotndolo de nuevos comandos y tambin nuevas funciones. Por supuesto que para escribir una macro hay que conocer las reglas del lenguaje VBA: cul es la instruccin correspondiente a cada operacin de Excel. Pero estas reglas son bastante sencillas y fciles de
PCW 251

TUTOR
aprender. Por si esto no alcanzara, Excel incluye un modo de programacin (el grabador de macros) que simplifica las cosas an ms (ver el recuadro El grabador como asistente). Este artculo explica cmo usar la programacin de Excel para crear una hoja de clculo contra la cual jugar al Master Mind. Crear un juego de ordenador en un programa como Excel es de por s un desafo interesante. Pero, adems, el desarrollo de esta hoja de clculo constituye una forma muy atractiva de comenzar a familiarizarse con las herramientas de programacin.
Figura 1: la hoja de clculo con los elementos necesarios para generar el nmero de cuatro dgitos diferentes que habremos de adivinar. Figura 2: la macro que genera el nmero a adivinar.

Master Mind Conoce usted este juego?, consiste en adivinar un nmero pensado por el adversario. El nos guiar hacia ese objetivo dicindonos cunto nos aproximamos al nmero que l ha pensado. Por ejemplo, supongamos que el piensa en el nmero 4587 (cosa que, por supuesto, no nos dice). Nosotros arriesgamos: Es el 7482? Entonces l nos dir: Dos regular y uno bien. Con esto nos quiere decir que dos dgitos de nuestro nmero se encuentran tambin en el que l ha pensado,

pero en distinta posicin (el 7 y el 4). Y que otro (el 8) se encuentra en la misma posicin. Pero no nos dice cules son esos dgitos. Solamente evala nuestro intento en trminos de bien y regular. Con esta informacin, y usando la lgica, podemos llegar a determinar cul es el nmero. Una hoja de clculo capaz de jugar al Master Mind debe hacer dos cosas: generar el nmero de cuatro cifras que tendremos que

adivinar y evaluar nuestros intentos de adivinarlo en trminos de bien y regular, de acuerdo con las reglas del juego. Veamos entonces cada problema.

Cmo se ejecuta una macro


En el texto se indica la forma ms incmoda de ejecutar una macro: a travs de las opciones HerramientasMacroMacros. Hay muchas otras formas, pero las ms simples y elegantes son las siguientes:

Asignando una combinacin de teclas a la macro Tomamos las opciones HerramientasMacroMacros. Aparecer un cuadro con la lista de macros disponibles, en la cual seleccionamos (con un clic) la macro a la cual le queramos asignar la combinacin de teclas. Hacemos un clic en el botn Opciones y aparecer el cuadro de la Figura 6. Donde dice Tecla de mtodo abreviado escribimos una M mayscula y hacemos un clic en Aceptar. Cerramos el cuadro donde aparece la macro. De acuerdo con la combinacin de teclas usada, ahora podemos ejecutar la macro (generando el nmero a adivinar) mediante la combinacin Control+Shift+M. Es conveniente elegir combinaciones de este tipo porque las combinaciones ms sencillas (de la forma Control+Letra) suelen tener alguna otra funcin asignada por el programa. Insertando un botn en la hoja de clculo Los que son ms aficionados al ratn que al teclado, preferirn ejecutar la macro haciendo clic en un botn insertado a tal efecto. Los botones de macros se obtienen en la barra de herramientas Formularios (Figura 7). Hacemos un clic en el botn Botn, dentro de la barra de herramientas Formularios y definimos, arrastrando el ratn, un rectngulo del tamao que tendr el botn. Al soltar el botn del ratn aparecer el cuadro de la Figura 8, con la lista de macros definidas en la hoja de clculo. Hacemos un clic en la macro a la cual le queremos asignar el botn y hacemos un clic en Aceptar. De ahora en adelante, la macro puede ejecutarse con un clic en el botn creado.

Generando el nmero Excel incluye un par de funciones para generar nmeros aleatorios de determinadas caractersticas. Pero ninguna de ellas nos asegura que el nmero generado tenga todos sus dgitos diferentes, condicin necesaria en el Master Mind. Entonces recurrimos a la hoja de clculo de la Figura 1. El rango E3:E12 contiene copias de la funcin =ALEATORIO() . Esta funcin devuelve un nmero aleatorio cualquiera comprendido entre 0 y 1. El nmero devuelto cambia cada vez que se recalcula la hoja, tanto porque hacemos algn cambio en ella, como porque apretamos la tecla F9. El rango F3:F12 contiene simplemente los nmeros del cero al nueve. Si ordenamos esta tabla segn el contenido de la columna E , el resultado ser, realmente, desordenar los dgitos de la columna F. Leyendo de arriba hacia abajo las cuatro primeras celdas de esta columna, obtendremos el

PCW 252

TUTOR
En la siguiente instruccin ( Range(E3).Select ) el objeto es la BIEN. celda E3, y lo que se hace es seleccionarla. En otras palabras, la instruccin ubica el cursor en la E3 . La estructura celda Objeto.Accin es tpica del lenguaje Visual Basic en general y de VBA en particular. Luego sigue un bucle: un conFigura 4: junto de instrucciones que puela funcin den ejecutarse una o ms veces. REGULAR. Hay dos tipos de ciclos: aquellos en que las instrucciones se ejecutan un nmero determinado de veces y aquellos en que se ejecutan segn se cumpla o no cierta condicin. El que aparece en el listado de la Figura 2 pertenece a este segundo tipo. Este ciclo comienza con la palabra clave Do y se cierra con Loop. En esta ltima instruccin se indica que el ciclo se repetir hasta (en ingls, until) que el valor de la celda F3 sea disFigura 5: la hoja de clculo terminada. En la celda E1 tinta de cero. Aqu apaest (oculto) el nmero a adivinar. A partir de la celda rece una estructura A2 escribimos nuestros pronsticos y en las columnas B similar a Objeto.Accin: y C la hoja de clculo nos mostrar la calificacin obteObjeto.Propiedad. El objeto es nida por cada intento. la celda F3 y la propiedad es su valor. Entendiendo el cdigo La instruccin comprendida Encabeza la macro la instruccin entre el Do y el Loop es Selection.Sort Key1:=Range(E3), Order1:=xlAscending . Sub Ordenar() . Toda macro debe comenzar con la palabra clave Sub, Aqu aparece de nuevo la estrucseguida del nombre elegido para tura objeto.accin: el objeto es la seleccin actual y la accin es su la macro. En principio, este nomordenamiento (en ingls, sort). bre puede ser cualquiera. Luego La instruccin indica tambin siguen dos instrucciones de la que la clave de ordenamiento misma forma: Objeto.Accin. Es decir, se menciona un objeto (que (Key1) es la celda E3 y que el orden es ascendente. Debido a la conpuede ser un rango, un grfico, dicin expresada en la instrucuna lnea, etc.) y una accin que cin Loop , el ordenamiento se se efectuar sobre ese objeto. har tantas veces como sea La primera instruccin es Range(A2:A11).ClearContents. La primera necesario hasta que el valor de parte (el objeto) indica que se va a la celda F3 sea distinto de cero, lo que asegura generar un nmero hacer una operacin sobre el de cuatro dgitos. Una vez generango A2:A11 . La segunda parte indica la accin que se hace sobre rado el nmero a adivinar, la ese objeto: borrar el contenido. Es instruccin Range(A2).Select ubica el cursor en la celda A2 para decir que esta instruccin borra el comenzar el juego. Finalmente contenido del rango donde se aparece la instruccin End Sub que encontraran los nmeros escritos seala el fin de la macro. en una partida anterior.
Figura 3: la funcin

nmero de cuatro dgitos diferentes que estamos necesitando. Para construir este nmero escribimos en la celda E1 la frmula =F3*1000+F4*100+F5*10+F6 que rene los cuatro primeros dgitos en uno solo nmero. Este ser el nmero a descubrir.

Automatizando el proceso En resumen, para obtener el nmero a adivinar, tenemos que hacer lo siguiente: - Borrar el rango A2:A11, para eliminar los nmeros usados en una partida anterior. - Colocar el cursor en la celda E3. - Ordenar el rango E3:F12. - Asegurarnos que, al ordenar, se obtiene en E1 un nmero cuatro cifras, es decir, que no comienza con cero. - Colocar el cursor en la celda A2 para comenzar la tarea de deduccin. Son demasiados pasos. Y, aunque se tarde ms en decirlos que en hacerlos, pueden simplificarse con una macro. sta es la que aparece en la Figura 2. Lo que vemos en la figura es el cdigo de la macro. Es la traduccin al lenguaje VBA de la lista de cinco operaciones que conducen a la obtencin del nmero. Para entender las instrucciones que aparecen en la macro de la Figura 2 no se necesita un gran conocimiento de VBA. Apenas si hace falta saber un poco de ingls.

PCW 254

TUTOR
2- Comparar cada dgito del pronstico con el correspondiente dgito del objetivo. 3- Si la comparacin es satisfactoria, contar ese dgito como bien. Cada una de estas operaciones se hace con funciones y herramientas especficas del lenguaje VBA. Para descomponer un nmero en sus dgitos disponemos de la funcin Mid. Su sintaxis es: Mid(nmero, comienzo, cantidad), donde: nmero es el nmero del Figura 7: esta es la barra de herramientas Formularios. El botn cual queremos que aparece en la figura permite definir un botn al cual extraer sus dgitos, asignarle luego una macro. comienzo es la posicin a partir de la cual en forma inmediata. Estas funciohacemos la extraccin y cantidad es nes no existen pero pueden tamla cantidad de dgitos que querebin ser creadas en VBA, tal como mos extraer. En nuestro caso, un hicimos con la macro. dgito por vez. Por ejemplo, queremos saber si La funcin BIEN el tercer dgito del pronstico Un dgito se califica como bien coincide con el tercer dgito del cuando ocupa la misma posicin objetivo. Si coincide, una variable en el nmero objetivo y en el proque lleva la cuenta del puntuanstico. La funcin BIEN deber, cin incrementa su valor en una entonces, ser capaz de: unidad. Las instrucciones de VBA 1- Descomponer el objetivo y el que hacen todo esto son: If Mid(pronstico, 3, 1) = Mid(objetivo, 3, 1) Then pronstico en cada uno de sus BIEN = BIEN + 1 dgitos. End If poner un nmero (que llamaremos el pronstico) y obtener su puntuacin respecto del nmero pensado por la hoja de clculo (el objetivo) de acuerdo con las reglas del Master Mind. Lo ideal sera disponer de dos funciones, BIEN() y REGULAR() , capaces de hacer la evaluacin

Figura 6: en este cuadro podemos asignar una combinacin de teclas para ejecutar la macro.

Cmo se escribe la macro El texto de la Figura 2 debe escribirse en una hoja de mdulos dentro del editor de Visual Basic. Elejimos la opciones HerramientasMacroEditor de Visual Basic y aparecer el editor (que es un programa aparte). Entonces seleccionamos InsertarMdulo, dentro del men del editor. El ltimo paso abre una ventana de texto donde podemos escribir el cdigo de la macro tal como aparece en la Figura 2. Antes de seguir con la programacin del juego es el momento de probar si la macro anterior funciona correctamente. Desde la hoja de clculo Excel (no desde el editor de VBA) seleccionamos HerramientasMacroMacros. Aparecer un cuadro con la lista de macros disponibles. Seleccionamos la macro Ordenar y hacemos un clic en el botn Ejecutar. En ese momento la celda E1 deber mostrar un nmero de cuatro cifras distintas, apto para ser adivinado por el jugador. La ejecucin de la macro puede simplificarse de varias formas, para ello vea el recuadro Cmo se ejecuta una macro. Tal como fue contada hasta aqu, la hoja de clculo presenta un problema: el nmero a adivinar queda a la vista. Basta mirar la celda E1 o los dgitos de la columna F para saber qu nmero gener el programa. La forma ms simple de resolver esto es ocultar las columnas E y F, seleccionndolas y pinchando en FormatoColumnaOcultar. Calculando las puntuaciones Habiendo obtenido (y ocultado) el nmero a adivinar, debemos pro-

El grabador como asistente


En la macro que genera el nmero a adivinar aparecen instrucciones en VBA correspondientes a diversas operaciones de Excel: seleccionar una celda, borrar un rango, ordenar una lista. Cmo podemos saber cules son esas instrucciones sin disponer de un libro de VBA? Para eso podemos recurrir al grabador de macros, que traduce a VBA las operaciones que hacemos con Excel. Su manejo es muy sencillo. Por ejemplo, queremos saber cul es la instruccin en VBA correspondiente a la accin de seleccionar un rango y borrarlo. Para ello seleccionamos HerramientasMacroGrabar nueva macro, lo que hace aparecer un cuadro como el de la Figura 9. Hacemos un clic en Aceptar y aparece la barra de botones de la Figura 10. Todo lo que hagamos de ahora en adelante ser registrado por el grabador y traducido a VBA. El primero de estos botones servir para apagar el grabador cuando hayamos completado la operacin. Realizamos la operacin cuya traduccin a VBA queremos conocer, en este caso, seleccionamos un rango y borramos su contenido apretando la tecla Suprimir. Hacemos un clic en el botn de la Figura 10 para apagar el grabador y ahora podemos ver la macro obtenida abriendo el editor de VBA. Para ello vamos a HerramientasMacroMacros. Aparece un cuadro parecido al de la Figura 8 con la lista de macros disponibles. En la lista deber aparecer la macro que acabamos de crear. La seleccionamos y hacemos un clic en Modificar. Se abrir el editor de VBA (Figura 11) mostrando el cdigo correspondiente a la operacin realizada mientras el grabador estaba funcionando. Asi nos enteramos de la forma que tiene la instruccin. El grabador funciona entonces como un asistente que nos dice cul es la instruccin VBA correspondiente a cualquier comando de Excel. Sin embargo, si queremos depurar nuestras macros y hacerlas ms eficientes, debemos profundizar el conocimiento del lenguaje. Abundan los libros sobre este tema.

PCW 255

TUTOR
nstico debe ser comparado con todos los dems dgitos del objetivo. Esto se logra usando dos ciclos For... Next:
Figura 9: este cuadro aparece al comenzar la creacin de una macro usando el grabador. Macro1 es el nombre de la macro. For i = 1 To 4 For j = 1 To 4 If Mid(pronstico, i, 1) = Mid(objetivo, j, 1) Then REGULAR = REGULAR + 1 End If Next

variable donde se guarda el valor que la funcin Figura 8: en este cuadro debemos indicar la macro devuelve. La ltima instruca la cual le asignaremos el botn. cin, que seala el fin de la funcin es End Function. Esto se lee si el dgito que En la Figura 3 aparece el cdigo ocupa la tercera posicin en el completo de la funcin, que se pronstico es igual al dgito que escribe en una hoja de mdulos ocupa la tercera posicin en el tal como se explic en el caso de objetivo, entonces la variable BIEN la macro. aumenta en una unidad. La comparacin debe hacerse con cada uno de los cuatro dgitos que componen los nmeros y no solamente con el tercero. Para eso no hace falta escribir las instrucciones anteriores cuatro veces. Podemos recurrir a otro tipo de ciclos:
For i = 1 To 4 If Mid(pronstico, i, 1) = Mid(objetivo, i, 1) Then BIEN = BIEN + 1 End If Next

Next

La instruccin For seala el comienzo del ciclo e indica que todo lo que sigue hasta la aparicin del Next (fin del ciclo) se ejecutar cuatro veces. La variable i controla el avance del ciclo y se usa, al mismo tiempo, para designar la posicin del dgito a analizar. Es decir, que el ciclo comenzar comparando los primeros dgitos, luego comparar los segundos y as sucesivamente. Cada vez que se detecta que los dgitos comparados son iguales, la variable donde se guarda el puntuacin incrementa su valor en una unidad. En forma similar a lo que ocurre con las macros, el cdigo de las funciones comienza con la instruccin especial Function , seguido del nombre de la funcin. Este nombre es el de la

Este juego de instrucciones realiza diecisis comparaciones. Comienza con la variable i igual a 1. Es decir, tomando el primer dgito del pronstico. Sin cambiar este valor, el segundo ciclo se ejecuta cuatro veces comparando este primer dgito con cada uno de los cuatro del objetivo. Luego el valor de i se incrementa a 2. Es decir que se toma el segundo dgito del pronstico y, otra vez, el segundo ciclo recorre los cuatro dgitos del objetivo. Como antes, cada vez que la comparacin detecta dos dgitos iguales, se incrementa el valor del puntuacin. Pero hay algo mal: las insFigura 10: esta barra de botones indica que est trucciones anteriores califiencendido el grabador de macros. El botn seacan un dgito como regular lado servir para apagarlo y dar por terminada la cuando aparece en ambos grabacin. nmeros, sin verificar que ocupen distintas posiciones. Para restringir la comparacin a posiciones diferentes se agrega una segunda condicin en la instruccin If : If
Mid(pronstico, i, 1) = Mid(objetivo, j, 1) And Figura 11: el editor de VBA y la macro correspondiente a la seleccin y borrado de un rango. i<>j Then

La funcin REGULAR Un dgito se califica como regular cuando est presente tanto en el nmero objetivo como en nuestro pronstico, pero en distinta posicin. Es decir que, en este caso, cada dgito del proPCW 256

El signo <> representa la desigualdad. Esta modificacin asegura que solamente se compar a n dgitos que ocupan posiciones d i f e r e n t e s . L a f u n c i n t e r m i n a d a aparece en la Figura 4.

TUTOR
Usando las funciones Habiendo creado las funciones en el editor de VBA, ya las podemos usar. Considerando la hoja de clculo de la Figura 1, supondremos que nuestros pronsticos sern escritos en la columna A, debajo del nmero objetivo (que permanecer oculto al oscurecer su celda). En las columnas B y C debemos obtener las respectivas puntuaciones. En la celda B2 escribimos =BIEN(E$1;A2) , en la celda C2 escribimos =REGULAR(E$1;A2). Estas dos frmulas comparan el objetivo que est en la celda E1 con los pronsticos que iremos escri- Excel incluye biendo a partir de la celda un par de A2 . Ambas deben extenderse hacia abajo para funciones para poder conservar las pungenerar tuaciones de todos nuestros intentos. Diez inten- nmeros tos es una cantidad razoaleatorios de nable. La hoja de clculo termi- determinadas nada aparece en la Figura caractersticas. 5, con algunas opciones de formato para hacerla Pero ninguna de ms elegante. Del botn ellas nos que se ve a la derecha hablamos en el apartado asegura que el Cmo se ejecuta una nmero macro.

generado tenga
Comienza el juego todos sus Est todo listo para comenzar a jugar. Para dgitos ello ejecutamos la macro, diferentes, escribimos nuestro pronstico en A2. Las celdas condicin B2 y C2 mostrarn la punnecesaria en tuacin de ese pronstico. Con la informacin sumi- Master Mind nistrada por estas puntuaciones, escribimos otro nmero en A3. Cuando la funcin escrita en la columna B muestre el valor 4, es que hemos acertado. Los cuatro dgitos de nuestro ltimo intento estn bien. Como dijimos antes, deberamos adivinar el nmero generado por la computadora en no ms de diez intentos. Puede encontrar la hoja de clculo terminada y funcionando (con ligeras modificaciones estticas) en el rea de descarga de listados de nuestra pginas web: www.idg.es/pcworld PCW
Claudio Horacio Snchez es ingeniero industrial y profesor de fsica y de informtica en la Universidad de Flores (Argentina). Ha escrito varios libros sobre Excel.

el

También podría gustarte