Programación Vba en Excel
Programación Vba en Excel
Programación Vba en Excel
Macro
Un programa escrito o grabado por el usuario que almacena una serie de comandos de Microsoft Excel que pueden utilizarse
posteriormente como un único comando. Mediante las macros pueden automatizarse las tareas complejas y pueden reducirse
el número de pasos necesarios para realizar las tareas que se ejecutan con más frecuencia. Las macros se graban en el
lenguaje de programación de Visual Basic para Aplicaciones de Microsoft. También pueden escribirse las macros
directamente en el Editor de Visual Basic.
Te lo repetiré muchas veces, lee la ayuda, no se aprende todo ahí, pero "ayuda" mucho, aquí te enseñare como se graban y se usan las
macros, pero no pretendo enseñarte a programar, esa es una tarea muy compleja que siento sale fuera de mi alcance .
Entonces, una macro es una "serie de instrucciones escritas en un lenguaje, que se pueden ejecutar como una sola instrucción" y sirve
para "automatizar tareas difíciles o repetitivas".
El texto acerca de la macro, se obtuvo de la ayuda de Excel, pero es aplicable a cualquier otro programa que maneje VBA, del mismo
modo, las explicaciones que hagamos del Editor de Visual Basic se centraran en el de Excel, que es prácticamente el mismo de todos
los programas
La idea de esta página es que sirva tanto para los que quieran aprender, como para los que solo buscan una macro o una función que
realice una tarea especifica, para los segundos va dedicada esta sección. ¿Que hago cuando me dan una macro?, ¿que hago cuando me
la envían a mi correo o la copio de alguna página como esta?, ¿donde la pongo?, respondamos estas preguntas, supongamos que
tenemos la siguiente macro:
MsgBox "HOLA " & strNombre & " BIENVENIDO AL MUNDO DE LAS MACROS"
End Sub
Para usar esta macro en algún programa que soporte VBA, solo sigue estos sencillos pasos:
PAGINA 1 DE 67
MACROS EN EXCEL
• Como veras, le puse unos numeritos a la imagen, estas tres partes son importantes, debes de conocer su nombre y su uso, pues
son el pan de todos los días de los que usamos VBA, además de que en las páginas que veas aquí, tratare de llamar a las cosas
por su nombre, así que ahí te van...
1. Explorador de proyecto: Muestra una lista jerárquica de los proyectos, en casi todas las aplicaciones que usan
VBA, cada ARCHIVO que tengas de esa aplicación, se convierte en un PROYECTO , en la imagen notaras que dice
VBAProyect (Libro1) si lo vieses en Word diría Proyect (Documento1) , en PowerPoint diría VBAProyect
(Presentacion1) , en Access, como sabes, como primero hay que guardar la base de datos, antes de poder usarla,
supongamos que abres y creas una base de datos que se llame Directorio, al entrar al Editor de Visual Basic, diría
Directorio (Directorio) , Autocad es un caso especial, en el, los proyectos SI están separados de los archivos y estos
se pueden guardar y usar de forma separada. Si tienes más de un archivo abierto, aquí los verías, además de que el
nombre del proyecto puede ser diferente del nombre del archivo. Observa como su aspecto es muy similar al del
Explorador de Windows, pero los elementos que veras aquí tienen un nombre muy especial que tienes que recordar
Objetos
2. Ventana de propiedades: Esta ventana sirve para cambiar las Propiedades de los Objetos , las propiedades
determinan el aspecto y comportamiento de los objetos, mi forma de recordar esto es que las propiedades son los
adjetivos que califican a los sustantivos como no lo enseñaron en clase de Español, ¿verdad que te acuerdas?, por
ejemplo, en el Explorador de proyectos, selecciona el objeto Hoja1 (Hoja1), observa como cambia la Ventana de
propiedades, busca las propiedades (Name) y Name, no, no me equivoque al repetirla, búscalas, cambia el valor que
veras a la derecha de ellas y de "tareita" me dices cual es la diferencia entre ellas ¿de acuerdo?...
3. Ventana de código: Esta es la buena, aquí es donde, principalmente, escribiremos y editaremos el código de las
macros, también en Módulos como este, es donde las aplicaciones que permiten Grabar Macros, generan su código,
al insertar el modulo, el cursor de escritura debe de quedar dentro de esta ventana, aquí puedes escribir texto como
en cualquier editor, solo que este es especial para Visual Basic y como es especial, nos ayuda mucho en estas tareas,
como avisarnos de posibles errores, colorearnos el código, entre otras monerías, este editor, es altamente
personalizable.
PAGINA 2 DE 67
MACROS EN EXCEL
• Entonces, con el cursor dentro de la ventana de código, ve al menú Edición | Pegar y veras como el código toma la misma
apariencia del que ves aquí, con colores y todo. La mayor parte del código que veas aquí (casi todo), lo pondré como lo verías
en el Editor, de esta forma sabrás si no se te fue por ahí, alguna letra o te falto algo, además de que se ve más bonito, ¿no
crees?..
• Como ultimo paso Ejecuta la macro, ejecutar no es más que hacerla trabajar, esto lo logramos con el botón Ejecutar de la
barra de herramientas, que como ves, es una flecha señalando a la derecha o si lo prefieres, puedes usar el teclado
presionando F5 , es importante que el cursor este dentro de la macro para que funcione, es decir, entre las líneas Public Sub y
End Sub, si no esta dentro de estas líneas y nada más tienes una macro, tal vez si la ejecute, pero si tienes más macros, te
saldrá el cuadro de dialogo Macros par que selecciones la Macro que quieras ejecutar, este mismo cuadro sale, si desde la
ventana de la aplicación escoges el menú Herramientas | Macro | Macros... o el método abreviado de teclado Alt + F8 .
PRECAUCION esta macro es inocua, pero no todas lo son, de hecho, la mayoría tienen como propósito modificar, cambiar o
manipular, parte o toda la información que este contenida en algún lugar de tu equipo, por ello, TEN CUIDADO CON LAS
MACROS QUE EJECUTAS si no sabes que hace una macro, es tu responsabilidad si la ejecutas o no, si bien, la mayor parte de
lo que encuentres en estas páginas, estará, en la medida de lo posible, documentadas y explicadas, te recomiendo sacar siempre
una copia de seguridad de tus datos o bien, probar sobre datos irrelevantes no olvidando, también, tener siempre actualizado tu
programa Antivirus, quedando advertido, continuamos...
Segundo acto, ¿pero creías que esta era la única forma de copiar una macro?, pues no así, recuerda que en lo que a Software se refiere,
casi siempre hay más de una forma de hacer las cosas, para usar la que sea de nuestra preferencia...
El método que veremos ahora, se llama Importar un modulo, por ejemplo, si me solicitas una macro y esta es muy grande o esta
formada por una serie de macros, tal vez te envíe el modulo que las contiene y solo tienes que Importarlo desde la aplicación para la
que este destinada, un modulo de VBA, al menos dentro del Office 2000, no es más que un archivo de texto con extensión BAS,
incluso con el Block de notas se pueden editar. Los pasos a seguir para este método, también son muy sencillos, veamos...
PAGINA 3 DE 67
MACROS EN EXCEL
Asegúrate de que el módulo recién importado, esta dentro del archivo correcto, lo cual se nota fácilmente dentro del Explorador de
proyectos como se muestra en la imagen siguiente.
• Por ultimo, solo te resta guardar tu archivo y ejecutar la macro, por el método que más te guste, Herramientas | Macro |
Macros... o el método abreviado de teclado Alt + F8 y como ultima recomendación, recuerda que un módulo puede contener
más de una macro, así que asegúrate de ejecutar la macro correcta.
Tercer acto, pero..., ¿hay una tercer forma?, claro, y tal vez haya más, solo que yo nada más me se estos tres métodos, este ultimo se
llama Arrastrar modulo y es útil, cuando las macros que consigamos, nos las envíen dentro del archivo original, es decir, por
ejemplo, si te mando un archivo de Excel o de Word, con alguna macro funcionando, para pasar este modulo a otro archivo de tu
interés, usa este método:
• Abre el programa y los dos archivos, el de origen (donde esta la macro o modulo de interés) y el de destino (donde quedara
copiada la macro o el modulo)
• Entra al Editor de Visual Basic para Aplicaciones de aquí en adelante simplemente lo llamaremos Editor VBA
• Dentro del explorador de proyectos, tienes que ver algo así:
Creo que no hace falta aclararte que use a propósito los nombres de Origen y Destino, pero como vez, es muy simple, ahora solo
arrastra el modulo que te interese (por que puede haber más de uno dentro del archivo origen) y suéltalo dentro del proyecto Destino
para que nuestro Explorador de proyectos se vea así:
PAGINA 4 DE 67
MACROS EN EXCEL
• Listo, ahora tienes las mismas macros en los dos archivos, bueno, al menos las que están en el modulo que hayas arrastrado y
solo te resta probar tus macros, que ya sabes como.
• NOTA: como sabes, al menos hasta la versión 2000, no es posible tener dos bases de datos abiertas en Access, lo que hace el
programa, cuando tratas de abrir una segunda base, es crear otra instancia de este, por lo tanto, si entras el EditorVBA,
también tendrás otra instancia y solo veras una base de datos, pero aun así es posible arrastrar módulos entre estas dos
instancias, cualquier mediano usuario de Windows, sabe que puedes redimensionar las ventanas para que sean visibles las dos
y entonces poder hacer la operación de arrastre, pruébalo y veras...
Como ultima parte de la introducción, y esta va para aquellos que tengan la intención de profundizar en el VBA, te comento, si
observas la imagen del Editor VBA, veraz que esta contiene mas herramientas, menús y opciones, conforme vayamos usándolo,
iremos aprendiendo las más representativas, por lo pronto veremos unas que me parecen importantes, ve al menú Herramientas |
Opciones... y te saldrá un cuadro de dialogo que te permite configurar una serie de características que afectan al desarrollo y ejecución
general de cualquier macro que se ejecute o edite dentro de la aplicación donde se establezcan estos valores, como siempre, lo dicho
aquí, es solo lo que me ha determinado mi criterio, mi experiencia y también mis errores, tal vez no todas se ajusten a tus necesidades,
tu "tareita" es probar y encontrar el conjunto de opciones
que si lo hagan.
PAGINA 5 DE 67
MACROS EN EXCEL
• Ficha formato del editor: afecta a la apariencia de la ventana de código, como puedes observar, es posible cambiar el
color del fondo y primer plano, el tipo de fuente y el tamaño de la fuente, si bien puedes configurar estos valores como te
guste, la recomendación es; en tipo de letra usar una fuente de "ancho fijo", las cuales, todas sus letras usan el mismo
ancho, así sea la "I" o la "W" , esto, junto con el uso correcto de sangrías, le dan una apariencia bastante presentable al
código y también es mucho más fácil depurarlo, pero sobre todos, es mucho más fácil compartirlo, pues muchos
programadores siguen este formato.
PAGINA 6 DE 67
MACROS EN EXCEL
• Ficha general: en esta ficha, las opciones disponibles, afectan al uso de los UserForm (Formularios de usuarios) y al
control de errores, los cuales son un tema un poco más avanzado, pero puedes dejar las opciones que se ven en la imagen y en
su momento se explicaran cada una de ellas, sobre todo las de la sección Interceptación de errores
Tal vez te preguntaras por que no profundice en el significado o el uso de cada una de las opciones, por que la mayoría de estas
opciones, tienen que ver con conceptos que no hemos visto y que nos llevaría muchas más líneas que esta introducción, es preferible
esperar y conforme se vayan usando, hacer mención a estas, espero me haya explicado.
Con esto terminamos esta pequeña introducción a la macros, que ojala te haya interesado como para continuar con las demás
secciones, no te olvides de mandarme tus comentarios.
Dicen que la practica hace al maestro, creo que así es, pues a practicar...
PAGINA 7 DE 67
MACROS EN EXCEL
Introducción
Artículos
Macros
Funciones
Complementos (Add-ins)
Introducción
Programar sobre cualquier lenguaje es fascinante, en la mayoría de ellos, el limite esta más de parte del programador que del lenguaje,
no tengo elementos para decir cual es mejor o peor, creo que cada uno tiene diferentes propósitos y que el bueno o malo, es el
programador. Aprendí a programar de forma empírica, esto tiene sus pros y sus contras, como desventaja esta que te tardas un poco
más de tiempo en aprender y como ventaja esta que te vuelves un muy buen investigador, estas, solo por nombrar algunas, se que tal
vez tenga muchas deficiencias y muchos otros "vicios" de los cuales, tal vez, ni cuenta me de, pero confío en que algún buen
samaritano que tenga más experiencia que yo en la programación, me los hará notar, por lo pronto, es mi deseo que este camino que
para mi ha sido de más de cinco años, sea mas corto y más leve para ti, esta es la razón principal de estas páginas. Como notaras la
sección que esta más completa es la de Excel, fue de los primeros programas que use y en que empecé con el VBA y aun me sigue
sorprendiendo y cada vez que escribo unas líneas de código, me surgen nuevas interrogantes, pero eso me gusta y te sugiero que no te
desanime si este es tu caso, veras que poco a poco se va aclarando el camino.
Si bien en un principio no era mi intención hacer un manual, sino tan solo una guía, la verdad es que se ha impuesto mi espíritu
pedagógico, pues te cuento que una de mis actividades favoritas es dar clases, así que lo que empezó como unos apuntes se esta
convirtiendo en este pequeño manual, así que aprovecha, estudia, lee, investiga, lee, practica y lee, lee mucho...
Artículos
• Preguntale a la Grabadora de macros
• Publica o Privada, ¿cual usar?
• Option Explicit, Dim, ¿que es eso?
• Variables y objetos, ¿como nombrarlos?
Un usuario me hizo la siguiente pregunta, que pongo solo con ánimo ilustrativo, no se nos vaya a ofender:
PAGINA 8 DE 67
MACROS EN EXCEL
contengan texto del rango de celdas A1:A20 y me coloque el resultado en el rango C1:C20 ordenados una debajo de la
otra, es decir que no copie las celdas vacías, teniendo en cuenta que el rango de la columna A son celdas vinculadas desde
otras hojas y solo se rellenan si hay algún dato que consignar, si me puedes ayudar para realizar esa macro con te lo
agradecería muchísimo y me solventarías un gran problema....
Sub Macro2()
Range("A1:A20").Select
Selection.SpecialCells(xlCellTypeFormulas, 2).Select
Selection.Copy
Range("C1").Select
ActiveSheet.Paste
End Sub
Primero, este amigo, no sabe la diferencia entre una Macro, una Función o lo que sea, que son tres cosas diferentes, pero tu ya los
sabes ¿verdad?... Segundo, si el hubiese grabado la macro, tal vez no le hubiese dado el mismo código que a mi, pero tendría "algo",
que ya es ganancia, si antes de preguntar grabas tu macro, yo pensaré que tienes interés en aprender y me dará más gusto ayudarte,
pero que pasos hubiésemos seguido para grabar esta macro, veamos algunas opciones, supongamos el escenario que nos propone el
amigo, una serie de valores en las celdas A1:A20, pero que son formulas, las cuales pueden ser texto o algo más que no especifica, de
estos datos, hay que seleccionar los que son texto y copiarlos a la celda C1, eliminando los espacios vacios, para este ejemplo, use los
siguientes datos:
Observa la barra de formulas, ve como los datos están vinculados a otra hoja, observa
también, que tenemos textos y números, ahora, grabaremos nuestra macro con estos
pasos:
Si seguimos estos pasos al pie de la letra, la macro grabada tiene que quedar así...
Sub Macro1()
Range("A1:A12").Select
Selection.SpecialCells(xlCellTypeFormulas, 2).Select
Selection.Copy
Range("C1").Select
ActiveSheet.Paste
End Sub
PAGINA 9 DE 67
MACROS EN EXCEL
Si ejecutas esta macro en la hoja donde están las formulas, en nuestro ejemplo dentro de la Hoja1 tendrás que ver algo como la
siguiente imagen:
Sub Macro2()
Range("A1").Select
Selection.CurrentRegion.Select
Selection.SpecialCells(xlCellTypeFormulas, 2).Select
Selection.Copy
Range("C1").Select
ActiveSheet.Paste
End Sub
Ejecuta cada una de estas macros y nota las diferencias, dale variantes, por ejemplo, agrega mas datos por debajo de la celda A20 y
vuelve a probar cada una de las dos macros, agrega valores diferentes que no sean texto o números, agrega constantes, o sea, valores
que NO provengan de formulas, pruébalas en otras hojas o libros. Cierto, esta macro no se adapta a todos los casos, de hecho, hace un
trabajo muy especifico, pero notas que ahora sabemos como seleccionar la región actual Selection.CurrentRegion.Select o también
aprendimos como seleccionar las celdas con formulas que contengan solo texto Selection.SpecialCells(xlCellTypeFormulas,
2).Select ¿que más aprendiste con esta pequeñisima macro?
Por ultimo haremos algo que se hace con la "mayoría" de las macros, editarla, si, editarla, es decir, agregarle líneas que no haya
agregado la macro, eliminando las que no nos sirven o mejorando lo que sea posible y mira que casi siempre es posible.
Como primer paso, entra al Editor VBA y copia la macro que se llama (si no le pusiste otro nombre) Macro2, y cámbiale el nombre a
Macro3, recuerda que NO puedes tener dos macros con el mismo nombre dentro del mismo módulo, esta macro tres será la que
modificaremos y tal vez te sorprenda lo que se puede hacer, sigamos...
• Como primer paso comentare la macro para que sepas que hace cada línea...
Sub Macro3()
PAGINA 10 DE 67
MACROS EN EXCEL
• El siguiente paso será unificar las dos primeras líneas, es decir desde la celda A1 seleccionaremos la región actual, para que
se vea así...
Sub Macro3()
'Se selecciona la celda A1 y su REGION ACTUAL
Range("A1").CurrentRegion.Select
'Seleccionamos las celdas con formulas que sean texto
Selection.SpecialCells(xlCellTypeFormulas, 2).Select
'Copiamos la seleccion
Selection.Copy
'Se selecciona la celda C1
Range("C1").Select
'Copiamos el contenido del portapapeles en la hoja activa
ActiveSheet.Paste
End Sub
• Ejecuta la macro con cada modificación que le hagamos, para que compruebes que sigue realizando las mismas acciones y
finalizamos con el mismo resultado.
• Siguiente paso; unificamos la línea de selección de la celda A1 y la región actual, con la línea de selección de formulas que
contengan texto...
Sub Macro3()
'Se selecciona la celda A1 y su REGION ACTUAL y las
'las celdas con formulas que sean texto
Range("A1").CurrentRegion.SpecialCells(xlCellTypeFormulas, 2).Select
'Copiamos la seleccion
Selection.Copy
'Se selecciona la celda C1
Range("C1").Select
'Copiamos el contenido del portapapeles en la hoja activa
ActiveSheet.Paste
End Sub
Sub Macro3()
'Se selecciona la celda A1 y su REGION ACTUAL y las
'las celdas con formulas que sean texto y copiamos
Range("A1").CurrentRegion.SpecialCells(xlCellTypeFormulas, 2).Copy
'Se selecciona la celda C1
PAGINA 11 DE 67
MACROS EN EXCEL
Range("C1").Select
'Copiamos el contenido del portapapeles en la hoja activa
ActiveSheet.Paste
End Sub
• Siguiente paso; le agregamos el argumento "opcional" al método Copy, donde se le indica el destino donde queremos dejar
lo que estamos copiando, tiene que ser un argumento tipo Range, o sea un rango, para nuestro ejemplo, será la celda C1
Sub Macro3()
'Se selecciona la celda A1 y su REGION ACTUAL y las
'las celdas con formulas que sean texto y copiamos
'le agregamos el argumento "opcional" al metodo Copy
'el DESTINO donde queremos copiar, un Rango
Range("A1").CurrentRegion.SpecialCells(xlCellTypeFormulas, 2).Copy Range("C1")
End Sub
• Cómo vez?, ¿has ejecutado la macro?, ¿observas como con UNA sola línea podemos hacer lo que se hacia con SEIS?,
interesante ¿no crees?, no siempre es así, pero "casi" siempre, la grabadora de macros, graba líneas de más, que es muy bueno
depurar, pues nos da mucha practica y código más limpio y ordenado...
Para terminar, te comento que todavía, hago uso de esta técnica, si no se o no recuerdo como se hace determinada tarea, simplemente
grabo una macro y listo, me muestra como es y en poco tiempo te sorprenderás como cada vez menos, tienes que consultar la ayuda,
saludos...
Creiste que esta vez no habia tareita, pues te fallo, prueba a grabar una macro con alguna acción que te interese como se hace con
código y nos cuentas a todos en la lista de correo, si vemos alguna interesante la podemos publicar aquí...
Cuando grabamos una macro, la grabadora nos crea un código como este:
Sub Macro1()
ActiveCell.FormulaR1C1 = "Hola"
Range("A2").Select
End Sub
en algunas de mis páginas, en algunas otras páginas o en algún otro lado, habrás visto que algunas macros tienen una palabra más,
detrás del Sub, como se que eres curioso, presionaste F1 y en la ayuda leíste cuales y para que sirven estas palabras: Public y Private,
así que supongo que lo dicho aquí ya lo sabes, pero sigue leyendo, tal vez encuentres algo nuevo o tal vez notes algo que me falto y
que por supuesto harás el favor de decirme, ¿verdad?, gracias. Bien, entonces la macro anterior también puede estar escrita así...
PAGINA 12 DE 67
MACROS EN EXCEL
Range("A2").Select
End Sub
O también así
Public
Opcional. Indica que el procedimiento Sub es accesible para todos los demás procedimientos de todos los módulos.
Private
Opcional. Indica que el procedimiento Sub es accesible sólo para otros procedimientos del módulo en el que se declara.
A ver si entendimos, probemos con unos ejemplos, realiza los siguientes pasos:
• Entra a Excel
• Entra al EditorVBA (Alt+F11)
• Menú Insertar | Modulo
• En la ventana de código escribe lo siguiente
Sub Pruebas1()
MsgBox "Esta macro es PUBLICA"
End Sub
• Ahora quiero que la vuelvas a ejecutar, pero desde Excel, regresa a Excel, ve al menú Herramientas | Macro | Macros... o si
lo prefieres Alt+F8, selecciona la macro Pruebas1 y presiona el botón Ejecutar para confirmar que, de nuevo, se ejecuta
correctamente.
• Ahora, agrégale la primer palabrita que estamos estudiando, para que se vea así.
• Vuelve a ejecutar la macro, de las dos formas que hemos visto y felizmente, nos muestra nuestro mensaje.
• Conclusión: las macros o procedimientos son Publicas por omisión y como dice la ayuda que es opcional, entonces es lo
mismo poner o no poner la palabra Public antes de la instrucción Sub.
PAGINA 13 DE 67
MACROS EN EXCEL
• Muy bien, muy bien, veo que eres buen estudiante, ahora creamos una segunda macro que se llame Pruebas2, por que
recuerda que no puedes tener dos procedimientos que se llamen igual, prueba a ponerle el mismo nombre y veraz que el
EditorVBA te dirá algo medio feo. Ahora, le ponemos nuestra segunda palabrita.
• Ejecútala desde el EditorVBA, verás que nos sigue mostrando el mensaje, claro, ahora nos dice que es PRIVADA (ni tanto
¿verdad?, la seguimos viendo), pero la siguiente prueba será ejecutarla desde Excel (Alt+F8).
• ¿Qué paso?, ¿¡cómo que no se ve!?, pero si estamos declarándolo como debe ser, ah ya recuerdo, le agregamos una palabrita
mágica, ¿verdad?, Private, si, esta palabrita es muy útil, en este caso, la macro ya no aparece listada en el cuadro de lista, del
cuadro de dialogo Macros, como lo acabamos de demostrar, pero entonces, ¿no se puede ejecutar desde aquí, tiene que ser
desde el EditorVBA?, para probarlo entra de nuevo al cuadro de dialogo macros y por ahora solo veras la macro anterior
Pruebas1, ahí, donde dice Nombre de la macro, escribe Pruebas2 y observa que pasa...
• Interesante ¿no?, la macro de todos modos la podemos ejecutar con solo saber su nombre y estarás de acuerdo que si no
queremos que las ejecuten no les diremos como se llaman, sssssshhhh...
• Te puede suceder que, por error de dedo, hayas escrito mal el nombre de la macro, ¿qué pasa?, ¿qué es lo que hace Excel?, te
dejo de tareita que me cuentes que pasa en estos casos.
• ¿Y eso es todo?..., no, ¿cómo crees?, sigamos haciendo pruebas, como sabes, y si no sabias, ahora vas a saber, puedes
ejecutar una macro desde otra macro, a esto lo nombramos llamar a la macro y para comprobarlo, modifica nuestra primer
macro para que se vea así.
• Por supuesto ejecútala y observa, interesante, muy interesante... ¿verdad que si?... A la vista de este efecto, ¿que deduces?,
¿para que te imaginas que pueda servir el llamar a una macro desde otra?, ¿que utilidad tiene el que unas se vean y otras
no?...
• Antes de responder, algunas, por que otras de estas preguntas tú las tienes que responder, hagamos otras pruebitas. Insertemos
otro modulo en nuestro archivo, menú Insertar | Módulo, nuestro Explorador de proyectos se tiene que ver así.
• En este módulo crearemos una tercer macro Publica, en este momento ya tienes lo elementos para hacer tu propio ejemplo,
pero por supuesto puedes seguir con los que propongo...
PAGINA 14 DE 67
MACROS EN EXCEL
• Ahora, trata de llamar a la macro Pruebas1 que se encuentra en el primer módulo, la macro se tiene que ser así...
• La macro se ejecuta, o se debería ejecutar sin problemas, si no es así, revisa alguno de los pasos que hemos seguido, ahora,
trata de llamar a la segunda macro del primer módulo, es decir, trata de llamar a la macro que declaramos Privada en el
primer módulo y que nombramos Pruebas2.
• ¿Qué sucedió?, ¿se ejecuta?, creo que no, pero el EditorVBA nos muestra un mensaje de error, más específicamente el
siguiente error.
• Después de presionar el botón Aceptar, el Editor nos regresa a la ventana de código, selecciona la palabra donde esta el error
y nos muestra una línea de un color amarillo bastante distinguible
• Muy bien pensado, la razón de que no podamos llamar a una macro de otro módulo, es por que esta macro la declaramos
Privada (Private), entonces si es cierto lo que dice la ayuda, -indica que el procedimiento Sub es accesible sólo para otros
procedimientos del módulo en el que se declara-, ¿verdad?. Antes de que detengas la ejecución de la macro, observa la barra
de titulo, por ahí tiene una palabrita que dice [interrupción], ya la viste, bueno, por ahora solo lo menciono, pero más
PAGINA 15 DE 67
MACROS EN EXCEL
adelante se verá un poco más a detalle, cuando ejecutamos código, este se puede detener, tanto por errores de sintaxis (como
en este caso) o cuando nosotros queramos, esto es algo muy útil cuando depuramos nuestras macros, así que lo veremos en
otro articulo. Ahora si, puede detener la ejecución de la macro, de hecho, no tenemos otra alternativa, esto lo haces con el
icono Restablecer de la barra de herramientas, que es como el botón Detener de la mayoría de los reproductores de música, o
bien, ve al menú Ejecutar | Restablecer y listo, la macro se detendrá al momento.
• Concluyendo: las macros pueden ser Publicas (Public) o Privadas (Private), es igual poner el Public o no, pero no es lo mismo
si ponemos o no el Private, la recomendación es, declara explícitamente si tu macro es Publica o Privada.
• Para terminar te comento que lo visto aquí, acerca de las macros Publicas y Privadas es aplicable, también, para las funciones,
es decir, también tenemos funciones Publicas y funciones Privadas, pero parte de la tareita de esta sección es esa.
o Crea una segunda macro Privada en el segundo Módulo y realiza todas las pruebas que hemos hecho con las demás,
incluyendo, el tratar de ejecutarlas desde la ventana de Excel
o Crea todas las macros y has todas las pruebas que consideres suficientes para que no queden dudas de este tema,
incluso agrega un tercer o cuarto módulo para esto.
o Crea varias sencillas funciones, tanto Públicas como Privadas y quiero que me digas, donde se ven y donde no, te
daré una pista, usa el Asistente para funciones para observarlo. Para crear las funciones, si no lo has hecho, lee el
tema Escribiendo mi primera función en Excel y después haces estas pruebas.
o Una líneas más arriba, nos hicimos la siguiente cuestión: ¿para que te imaginas que pueda servir el llamar a una
macro desde otra?, la respuesta a esta pregunta es importantísima, tiene mucho que ver con lo que pensaba el señor
Descartes, ¿ya lo recuerdas?...
• Como complemento a este artículo, veremos que diferencia hay entre una función Publica y una función Privada
La siguiente función personalizada nos devuelve un texto con información del tipo de contenido de la celda pasada como argumento y
nos dice si la celda esta VACIA, si es un NUMERO, si es una FECHA o si contiene TEXTO...
Option Explicit
End Function
Para usar esta función, regresa a la ventana de Excel, en este caso, usaremos el Asistente para funciones, que seguro ya dominas,
entonces, los pasos serian...
PAGINA 16 DE 67
MACROS EN EXCEL
• Como bien sabes, el Asistente te presenta una ventanita con el nombre de la función y un cuadro de texto solicitándote el
argumento Celda necesario para que la función trabaje (bueno, realmente no es un cuadro de texto, sino un control muy
especial y muy útil que aprenderemos a usar más adelante)
• Puedes usar el botón Contraer o escribir directamente la referencia a la celda A1, tras lo cual presionaras el botón Botón de
comando Aceptar y el Asistente introducirá por nosotros, el signo igual, la función y el argumento que le establecimos
• Al terminar, mi celda B1 se tendrá que ver como en la siguiente imagen y verificaremos que la función haga el trabajo para la
cual la programamos, ¿así es?...
PAGINA 17 DE 67
MACROS EN EXCEL
• Ahora, cambiaremos la palabra Public de nuestra función por la palabra Private, o bien, puedes copiar la función y hacer una
segunda, por supuesto, con otro nombre, yo usare el primer método...
Option Explicit
End Function
• Regresa a la ventana de Excel y copia la formula existente en la celda B1 a la celda B2, ¿qué pasa?..., así es, la función sigue
trabajando, entonces!..., ¿cuál es la diferencia?, para notarlo, trata de agregar un valor cualquiera en la celda A3, posicionate
en la celda B3 y trata de usar el Asistente para funciones como en nuestro primer ejemplo y observa...
PAGINA 18 DE 67
MACROS EN EXCEL
• Efectivamente, la función no aparece, de hecho, la categoría que usamos Definidas por el usuario, ya no aparece (claro,
siempre y cuando no tengas otra función declarada), pero trata de escribir la función directamente en la celda, ¿funciona?, si,
si funciona, es algo similar a lo que pasa en las macros, que, como leiste más arriba, cuando la pasas a Privada, ya no se lista
en el cuadro de dialogo, pero aun la puedes ejecutar si sabes su nombre, del mismo modo, si sabes el nombre de alguna
función personalizada, la puedes llamar o hacer uso de ella, siempre y cuando te sepas su nombre y los argumentos que
necesita, tan solo, con escribirla directamente en la celda.
• Como con las macros, nos preguntamos, ¿para que servirá tener funciones Publicas y funciones Privadas?..., observa la
función Números a letras para que te des una idea, aunque de nuevo, el señor Descartes nos puede ayudar...
•
En la mayoría de código que veas en estas páginas, y en muchas otras macros que has visto, habrás notado que al inicio de estas, casi
siempre hay una pequeña línea de dos simples palabras, Option Explicit, las seleccionaste, presionaste F1 y leíste esto:
Se usa en el nivel de módulo para forzar declaraciones explícitas de todas las variables en dicho módulo.
• Entra Excel
• Entra al Editor VBA
• Inserta un nuevo módulo y asegúrate que este en vacío, si tiene las palabras que estamos estudiando, bórralas.
• Teclea o copia la siguiente macro y pruébala
End Sub
• Que bien, funciona verdad, ahora, vamos a suponer que tecleamos mal un nombre, por ejemplo, en vez de teclear Numero1,
tecleamos Numer1, para que nuestra macro quede así, por esta vez, pondré en negritas los nombres que hay que probar...
PAGINA 19 DE 67
MACROS EN EXCEL
End Sub
• Pruébala, ¿funciona?, si, si funciona, solo que NO da el resultado correcto, en este caso, siempre nos mostrara el valor del
segundo número que le hayamos proporcionado, ¿por qué?, sigamos con las pruebas, ahora supondremos que los números
están bien y que la que tecleamos mal es la palabra Suma, la cual la tecleamos así; Sum
End Sub
• Que bien!, también funciona, solo que tampoco nos da el resultado correcto, esta vez es peor, pues siempre nos muestra cero,
¿verdad?, bueno, la causa es más que obvia, los nombres no los hemos escrito correctamente y por correctamente me refiero a
como escribimos esas mismas palabras en las líneas anteriores o posteriores, pues aquí no vale la ortografía, para muestra una
macro...
End Sub
• Observa como alucine con los nombres de estas palabras, a parte de que están mal escritas, no tienen nada que ver con el
propósito de nuestra macro, ya volveremos sobre este asunto más adelante, por ahora quise mostrarte el sentido de la palabra
correctamente, y seguimos... Ahora, vuelve a nuestra primer macro y agrega, en la parte superior, las palabras mágicas Option
Explicit y trata de ejecutarla.
Option Explicit
PAGINA 20 DE 67
MACROS EN EXCEL
End Sub
• ¿Que paso?, ¿no te dejo?, ¿porque?, ¿que te aparece?... efectivamente, nos muestra un bonito mensaje, que dice..
• Y no solo eso, también nos colorea de amarillo la macro donde esta el error y nos selecciona la palabra que esta mal, mejor
dicho, la variable, déjame repetirlo, la variable que NO hemos declarado.
Variable
Un lugar de almacenamiento con nombre que puede contener cierto tipo de datos. Cada variable tiene un nombre único que la
identifica. Nombres de variable deben comenzar con un carácter alfabético, deben ser únicos dentro del mismo ámbito, no
deben contener más de 255 caracteres y no pueden contener un punto
• Entonces, una variable es un lugar de almacenamiento con nombre, por ahora, es suficiente que recuerdes esto, es muy
importante, y... ¿dónde esta es lugar de almacenamiento?, en la RAM, bueno, todos la conocemos y la usamos, siempre que
prendemos nuestra maquina, ¿verdad?, si, esa cosa llamada memoria RAM que por cierto ha subido mucho de precio, pero en
fin, ahí, en al memoria RAM es el lugar de almacenamiento de nuestras variables, pero tenemos que comunicarle al VBA
que nos aparte un pedacito de memoria y que además le de un nombre para que sepamos donde esta, a la acción de reservar
memoria para nuestras variables, se le denomina Declaración de variables o Dimencionar variables, para ello, usamos otra
nueva palabrita, la instrucción Dim, modifica la macro para que se vea así...
Option Explicit
PAGINA 21 DE 67
MACROS EN EXCEL
End Sub
• Ejecutala y..., tampoco nos deja, y ahora ¿que paso?, se detuvo de nuevo, pero ahora en otra variable, pero nos muestra el
mismo error, ¿no es así?, bueno, pues ni modo, vamos a declarar nuestras restantes variables
Option Explicit
End Sub
• Y esta vez?, claro, ahora si funciona de nuevo, pero... ¿qué ventaja percibes al declarar las variables?, ¿no es teclear más
solamente?, en este ejemplo manejamos tres variables y seria algo difícil el escribir mal alguna, pero cuando empiezas a
manejar, diez, veinte, cincuenta variables y no se diga cuando empieza a combinar más de una macro, funciones y otras
cositas, notaras todas las ventajas de Declarar explícitamente las variables pues el uso de Option Explicit nos evita que
usemos variables que antes, no las hayamos declarado.
• Si lees la ayuda acerca de la instrucción Dim, leerás que no solo es esta, sino que tiene muchas otras variantes, tantas que nos
saldríamos del tema central de este articulo, pero te recomiendo que lo leas, analices y ponga en practica, lo que si veremos es
algo de suma importancia, transcribo...
Dim
Declara variables y les asigna espacio de almacenamiento
De esta definición, ya debes de tener comprendida la primer parte Declara variables, la segunda no es tan complicada asigna
espacio de almacenamiento. Quedamos que nuestras variables quedan en la memoria RAM, como sabes esta memoria es
limitada y conforme se usa, hay la posibilidad de que se acabe, lo cual es muy malo, así como dice la física, que materia es
todo lo que ocupa un lugar en el espacio, aquí, diremos que toda variable ocupa un espacio en la memoria, la pregunta es
¿cuánto espacio?, la respuesta es, depende, nueva pregunta ¿de que depende?, nueva respuesta, del tipo de variable,
(expresión de asombro), ¿pero que hay varios tipos de variables?, respuesta si, ¿cómo cuales?, aquí van algunos: Byte,
Boolean, Integer, Long, Currency, Single, Double, Date, String, Object, Variant, cada
uno de estos tipos, ocupa un lugar, tiene un tamaño y puede contener una cierta cantidad de información, ¿cuál es la mínima
unidad de almacenamiento?, así es, 1(un) byte, entonces, las variables, dependiendo su tipo, usan desde un byte y ¿hasta?, esa
es tu tarea...
PAGINA 22 DE 67
MACROS EN EXCEL
• Te estarás preguntando, ¿pero como le decimos que tipo de variable quiero usar?, y la respuesta es muy sencilla, solo usamos
otra palabrita mágica, As, seguida del tipo de variable que queramos declarar, para muestra, declararemos correctamente
nuestras variables...
Option Explicit
End Sub
• Todavía más preguntas, ¿qué pasa si no le indico de que tipo es?, en nuestro ejemplo anterior funciono bien, ¿entonces?,
¿cuál es la diferencia?, la respuesta a esta interrogante, esta en la ayuda, así que nuevamente, busca y lee un poquito, por lo
pronto, acostúmbrate a declarar explícitamente tus variables, reitero, declara explícitamente TODAS tus variables y
acostumbrate a que como primer línea, en cualquier módulo de código, tengas un Option Explicit, entre más variables uses y
mas líneas de código tengas, notaras cada vez más, las grandes ventajas de esto.
Option Explicit
MsgBox "Hola " & Nombre & " tienes " & Edad & " años"
End Sub
MsgBox "Hola " & Coche & " tienes " & Sol & " años"
End Sub
PAGINA 23 DE 67
MACROS EN EXCEL
Macros
• Grabando mi primer macro en Excel
• Escribiendo mi primer macro en Excel I
• Escribiendo mi primer macro en Excel II
• Escribiendo mi primer macro en Excel III
o Entra a Excel
o Ve al menú Herramientas | Macro | Grabar nueva macro...
o Te saldrá el siguiente cuadro de dialogo...
Nombre de la macro
Con este nombre identificaremos a la macro, con este la podemos "ejecutar" y "llamar" desde otras macros, por default te
saldrá Macro1 la primera vez y, si no cambias este nombre, a las sucesivas macros las ira nombrando Macro2, Macro3,
Macro'n, etc, propongo que se llame Mi_Primer_Macro , las recomendaciones son: usa un nombre corto, pero
suficientemente claro en relación con la tarea o tareas que hará la macro, NO uses espacios, por ejemplo, si tienes una macro
que realiza un reporte, podrías llamarla:
1. hacerreporte
2. HACERREPORTE
3. hacer_reporte
4. HACER_REPORTE
5. Hacer_Reporte
6. HacerReporte
Comúnmente, y lo veraz en estas páginas, uso la opción 5 o 6 pues me parecen mas claras de leer, pero no te detengas en
hacer uso de tu libre derecho de usar el que te de la gana.
Método abreviado
Si sabes para que nos sirve Ctrl + C o Alt + F4 , entonces ya sabes para que es esta opción, así es, bien pensado, sirve para
relacionar una combinación de teclas con la macro que estamos grabando y ejecutarla con solo presionar estas teclas, en lo
PAGINA 24 DE 67
MACROS EN EXCEL
personal no lo uso, pues ya tengo bastante con las decenas de métodos abreviados que tiene Windows, prefiero "asignarlas" a
un botón o un menú (te enseñare a hacer esto), pero estas en todo tu derecho de usarla si así lo deseas.
Guardar macro en
Toda la información ocupa un lugar, verdad?, pues las macros son información y ocupan lugar y hay que guardarlas en algún
lado, este lado, son los archivos de Excel, es decir, "dentro" del archivo, se guardan las instrucciones en un lugar especial que
se llama modulo , que aprenderemos a dominar, si observas la imagen, tenemos un Cuadro de lista desplegable o ComboBox
(así se llama este "objeto") que tiene tres opciones: Libro de macros personal, Libro nuevo y Este libro, como veras, los tres
son libros o sea, archivos de Excel, las macros de Excel solo pueden estar dentro de archivos de Excel. Para nuestro ejemplo
escogeremos Este libro.
Descripción
Creo que el nombre es bastante "descriptivo", aquí puedes poner toda la información que consideres conveniente acerca de tu
macro, su función más útil, es comentar brevemente cual es el propósito de nuestra macro, algunos ponen la fecha y el
nombre del autor.
o Damos un clic en el Botón de Comando (CommandButton) ACEPTAR , a partir de este momento, casi cualquier acción, lo
repito, casi cualquier acción que realices sobre la ventana de Excel, se grabará en nuestra macro, por eso las recomendaciones
antes de grabar una macro son:
1. Planea lo que hara tu macro, las correcciones que hagas, también se grabaran.
2. Casi nunca una macro queda a la primera, no importa que repitas de nuevo los pasos, pero hazla bien, cuando
aprendas a editarlas, veremos como quitar lo que no sirve.
3. Procura no grabar demasiadas instrucciones, es mejor grabar pequeñas macros y después llamarlas desde otras o
entre si, esto, ya veremos como se hace.
o Realiza los siguientes pasos tal cual...
• Selecciona la celda A1
• Escribe "Esta es mi primer macro" (o lo que gustes).
• Presiona Enter, si tu selección se movió abajo (normalmente), entonces vuelve a seleccionar la celda A1
• Dale formato de Negritas , Cursiva , cambia el tamaño de la fuente, el estilo de la fuente y por ultimo el
color de la fuente
• Al final se tiene que ver algo muy parecido a esto:
o Da un clic en el botón Detener grabación , este botón (que aparece en la imagen de arriba) se encuentra dentro de la barra de
herramientas Detener Grabación, esta barra se visualiza (o deberia de aparecer) en cuanto empiezas a grabar una macro, si no
la vez, ve al menú Ver | Barra de Herramientas y activa la barra Detener Grabación o si lo prefieres, en el menú
PAGINA 25 DE 67
MACROS EN EXCEL
Herramientas | Macro veraz, en vez de Grabar Macro , la opción Detener Grabación , esto solo cuando tienes activada la
grabadora de macros.
o Ahora, probemos la macro, borra o mejor, elimina la celda donde escribiste el texto Esta es mi primer macro, en nuestro
ejemplo, se trata de la celda A1.
o Ve al menú Herramientas | Macro | Macros... o presiona el método abreviado de teclado Alt + F8 , por cualquiera de estos
dos métodos, te saldrá el siguiente cuadro de dialogo.
o La imagen lo dice todo, tendras una lista de las macros que esten disponibles en los libros (archivos de Excel) abiertos, es
decir, para que puedas ejecutar una macro, el libro que la contiene debe estar abierto. Este cuadro de dialogo tiene más
opciones que el anterior, así que las que no se vean aquí, te dejo de "tareita" investigues para que sirven.
o Selecciona la macro que acabamos de grabar, si no le cambiaste el nombre debe decir Macro1 , si usaste el propuesto será
Mi_Primer_Macro o en su defecto el que hayas escogido, si tienes más libros abiertos que tengan macros, aquí las veraz (no
todas, ya te explicare por que), da un clic en el Boton de Comando (CommandButton) EJECUTAR .
o ¿Que pasó?, se ve bonito no?, ahora, con un solo paso, hacemos varias instrucciones de Excel, si fue así?, bien, ahora ya
tenemos el 0.01 % de lo necesario para dominar las macros y no te estoy desanimando, al contrario, pretendo, con estas
páginas, subir un poco mi 5% de dominio y también pretendo, que lo hagamos juntos, si estas de acuerdo sigue leyendo y
sino también sigue leyendo.
o Este es un buen momento para guardar tu archivo, propongo que se llame Mis macros , pero, como antes, puedes usar el
nombre que gustes ¿como podría impedírtelo?.
o Ahora van las preguntas, lo siento pero te tendrás que acostumbrar a ellas, aun cuando veas que trato a detalle los temas, no es
así, por que el tema es bastante extenso y muchas cosas las tendrás que buscar, descubrir y mejor aun, razonar por tu cuenta.
o ¿ Todo salió bien ?
o ¿ Que pasa si ahora pongo el cursor, o sea la selección en otra celda, por ejemplo la C15 y ejecuto la macro?
o Prueba a grabar otra macro, pero activa el botón que aparece al lado del Detener grabación y que se llama Referencia
relativa y haz la prueba anterior, ¿que pasa ahora?
o Si cambias de hoja en el libro ¿puedes ejecutar la macro?
o Y si cambias de libro ¿aun la puedes ejecutar?
o Prueba a grabar una macro que cambie a otras ventanas fuera de Excel o abra otros programas ¿es posible?
o Graba una macro un poco mas larga y ejecútala ¿que observas?, ¿como se ve la pantalla cuando se esta ejecutando?
o Tal vez pienses que son muchas preguntas para la primera vez, ya veraz que solito te saldrán mas, ahora mismo yo tengo más
preguntas que respuestas, pero no importa, sigue siendo muy divertido crear y grabar macros. Cuando tengas contestadas las
preguntas anteriores y cuando hagas las "tareitas" que propongo, entonces, pasamos al siguiente punto.
o Esto es más interesante, veamos las instrucciones que graba Excel a estas instrucciones se le conoce como código fuente ,
para esto ve la menú Herramientas | Macro | Macros... o presiona el método abreviado de teclado Alt + F8 y ya sabes que
PAGINA 26 DE 67
MACROS EN EXCEL
sale ¿verdad?, si, el cuadro de dialogo Macro , de nuevo, selecciona la primer macro que grabaste y que ejecutaste, pero
ahora, en vez de ejecutarla, presiona el Botón de Comando (CommandButton) MODIFICAR . Esta acción abrirá una nueva
ventana (la notaras en la barra de tareas de Windows) y nos llevara a una ventana que tal vez nunca has visto, esta ventana se
llama Microsoft Visual Basic y es una nueva aplicación, un programa, correctamente es un Editor, un Editor del lenguaje
Visual Basic para crear nuestras macros, también puedes abrir esta ventana desde el menú Herramientas | Macro | Editor de
Visual Basic o presiona el método abreviado de teclado Alt + F11 , este Editor tienes que dominarlo si quieres obtener más
provecho de tus macros, más adelante veremos las partes principales de este Editor, por lo pronto y si grabaste la macro de
ejemplo, veraz algo muy similar a la siguiente imagen.
o Las ventanitas que están a la derecha de la imagen, tal vez las tengas a la izquierda en tu ventana, pero no importa, estas
ventanas las puedes mover como la mayoría de las ventanas de Windows (desde la barra de titulo) y posicionar donde gustes,
te recomiendo dejarlas como en la imagen de arriba, para que nos entendamos mejor.
o Te pongo el código aquí por si en la imagen no se ve bien, además de que le faltan unas líneas abajo.
Sub Mi_Primer_Macro()
'
' Macro1 Macro
' Macro grabada el 09/01/2002 por Tecnico1
'
Range("A1").Select
ActiveCell.FormulaR1C1 = "Esta es mi primer macro"
PAGINA 27 DE 67
MACROS EN EXCEL
Range("A1").Select
Selection.Font.Bold = True
Selection.Font.Italic = True
With Selection.Font
.Name = "Arial"
.Size = 20
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
With Selection.Font
.Name = "Comic Sans MS"
.Size = 20
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Selection.Font.ColorIndex = 5
End Sub
Ya la viste bien, ¿verdad que hay líneas repetidas?, ¿porque crees que sea esto?, observa muy bien los colores, nos dicen mucho,
pero lo primero que te enseñare de los colores es que las líneas que están en verde no se "ejecutan" , esto quiere decir, que el VBA
se las salta olímpicamente, las ignora completamente, esas líneas verdes se llama comentarios y sirven para documentar nuestras
macros para poner notas acerca del propósito o funcionamiento del código, algo muy importante, pues después de algunos cientos
de líneas, ya ni sabes donde vas o para que servía determinada línea, por ejemplo, observa la primer línea después de la ultima
verde, si quisiéramos comentarla, o sea, establecerla de modo que no se "ejecute", tenemos dos formas, agregando una comilla
simple a la izquierda de la línea o escribiendo, también a la izquierda la palabra REM, me parece más fácil la comilla ¿no crees?.
Sub Mi_Primer_Macro()
'
' Macro1 Macro
' Macro grabada el 09/01/2002 por Tecnico1
'
Range("A1").Select
'Range("A1").Select
Rem Range("A1").Select
Ahora que sabes como se comentan las líneas para que el VBA no las ejecute, te recomiendo que cuando estés probando código, no lo
borres, mejor solo comenta la línea, pues algunas veces pasa que regresamos a la línea original y si la borramos en ocasiones ya no
sabemos como iba, así que te pregunto, ¿que líneas de este código fuente, se podrían comentar, de modo que no se ejecuten, pero que
la macro siga haciendo lo mismo?... muy bien, podría quedar así...
Sub Mi_Primer_Macro()
' Macro grabada el 09/01/2002 por Tecnico1
'
PAGINA 28 DE 67
MACROS EN EXCEL
Range("A1").Select
ActiveCell.FormulaR1C1 = "Esta es mi primer macro"
Range("A1").Select
Selection.Font.Bold = True
Selection.Font.Italic = True
'With Selection.Font
' .Name = "Arial"
' .Size = 20
' .Strikethrough = False
' .Superscript = False
' .Subscript = False
' .OutlineFont = False
' .Shadow = False
' .Underline = xlUnderlineStyleNone
' .ColorIndex = xlAutomatic
'End With
With Selection.Font
.Name = "Comic Sans MS"
.Size = 20
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Selection.Font.ColorIndex = 5
End Sub
Pero todavía se puede mejorar más, prueba a comentar las líneas que terminen en la palabra False para que nuestro código quede así:
Sub Mi_Primer_Macro()
' Macro grabada el 09/01/2002 por Tecnico1
'
Range("A1").Select
ActiveCell.FormulaR1C1 = "Esta es mi primer macro"
Range("A1").Select
Selection.Font.Bold = True
Selection.Font.Italic = True
'With Selection.Font
' .Name = "Arial"
' .Size = 20
' .Strikethrough = False
' .Superscript = False
' .Subscript = False
' .OutlineFont = False
' .Shadow = False
' .Underline = xlUnderlineStyleNone
' .ColorIndex = xlAutomatic
'End With
With Selection.Font
.Name = "Comic Sans MS"
.Size = 20
' .Strikethrough = False
' .Superscript = False
PAGINA 29 DE 67
MACROS EN EXCEL
Sigue haciendo lo mismo la macro?, si?, pues entonces vamos bien, con esto te darás cuenta que, la mayoría de las veces, la grabadora
de macro nos escribe mucha "basura", es decir, código de más, código innecesario para nuestra macro, lo complicado es saber que
quitar y que no, incluso que agregar y que no, ojalá que con todos los ejemplo que haya aquí, te sea más leve esta tarea. Por ultimo, te
escribiré una segunda versión de esta macro, la llamaremos Mi_Primer_Macro2 , regla, no puede tener dos macros en el mismo
modulo de código, que tengan el mismo nombre , no lo olvides, esta segunda versión, esta basada completamente en la original, tu
"tareita" es decirme cuales son las diferencias, claro, aparte del número de líneas, hice lagunas "trampitas", observa las primeras líneas,
observa las líneas que se quitaron y las que se modificaron, las que se movieron y las que se dejaron tal cual, ¿de acuerdo?...
Sub Mi_Primer_Macro2()
' Macro modificada por mi
ActiveCell.FormulaR1C1 = "Esta es mi primer macro, claro, con algunos cambios"
With Selection.Font
.Bold = True
.Italic = True
.Name = "Comic Sans MS"
.Size = 20
.ColorIndex = 5
End With
End Sub
Se me pasaba comentarte que puedes hacer todas las macros que quieras dentro de un mismo modulo, lo único que tienes que hacer es
procurar separarlas por una línea, como se que eres observador, habrás notado que todas las macros empiezan con Sub y terminan con
End Sub , pues así son las macros, por ejemplo, podrías tener esto:
Sub CopiarDatos()
' Aqui va el código de esta macro
End Sub
Sub HacerReporte()
' Aqui va el código de esta macro
End Sub
Sub HacerGrafico()
' Aqui va el código de esta macro
End Sub
Ahora hagamos algo muy interesante, grabaremos nuestra segunda macro, pero con una pequeña variante, iremos viendo como es que
Excel, va grabando las instrucciones dentro de un modulo en el Editor de Visual Basic, para lograrlo abramos el Editor de Visual
Basic, ya sabes como ¿verdad?, redimensiona y manipula las ventanas, tanto de Excel como del Editor, para que ocupen,
aproximadamente la mitad de la pantalla cada una, cuida , que la pantalla de Excel quede en primer plano y en segundo plano el Editor
de Visual Basic, cuidado , si en la ventana del Editor, no esta visible el MODULO donde se están grabando las macros no veraz nada,
tienes que poner el cursor dentro del modulo actual para que veas la grabación, para que no haya duda, ve la siguiente imagen:
PAGINA 30 DE 67
MACROS EN EXCEL
Observa como Excel esta en primer plano y el Editor en segundo plano, si estas en la misma sesión de trabajo, donde grabaste
Mi_Primer_Macro , entonces solo deja el cursor dentro del modulo donde está, esta macro, si estas usando otra sesión de trabajo, te
grabara esta segunda macro, dentro de un segundo modulo y tal vez no lo veas, en resumen, el modulo visible debe ser el actual, donde
veas que Excel esta grabando actualmente tus macros.
o Entramos a Excel
o Aquí podemos usar un nuevo libro o si lo prefieres abre tu libro de pruebas favorito.
o Entra el Editor de Visual Basic Alt + F11 .
o Puedes usar, si ya lo tienes, un modulo existente, o mejor aun, agregamos uno, esto lo hacemos desde el menú Insertar |
Modulo , nuestro Explorador de Proyectos se tiene que ver así.
PAGINA 31 DE 67
MACROS EN EXCEL
o El cursor de escritura debe de quedar dentro de la ventana de código, observa que estoy usando el mismo archivo que hice en
el tema anterior Grabando mi primer macro, pero reitero, puedes usar cualquier otro que gustes, observa la barra de título,
observa si tengo alguna nueva barra de herramientas, observa la Ventana de Propiedades, en fin, observa lo más que puedas.
o El siguiente paso es importante, ¿qué hará nuestra macro?, bueno, realmente al entrar al EditorVBA ya "deberíamos" de haber
tenidos resuelta esta cuestión, pero debes de recordar que esta es la primera y más importante pregunta que debemos
hacernos, cuando empecemos a crear una macro, para nuestro ejemplo, como estamos considerando que será nuestra primera
macro, tendremos que escoger algo sencillo, se me ocurre hacer una macro que nos solicite nuestro nombre y el nombre de
algún mes, después solicitaremos los importes de algunos conceptos "predefinidos" como: transporte, alimentos, diversión,
por ultimo sumar estos importes, entonces, los pasos que hará nuestra macro son:
Solicitar nuestro nombre
Escribirlo en una celda
Solicitar el nombre de algún mes
Escribirlo en alguna celda
Solicitar un importe para el gasto de Transporte
Escribirlo en alguna celda
Solicitar un importe para el gasto de Alimentos
Escribirlo en alguna celda
Solicitar un importe para el gasto de Diversión
Escribirlo en alguna celda
Introducir la formula que sume estos conceptos
o Esto que acabamos de hacer es muy importante, siempre que te sea posible y repito, siempre, procura tratar de escribir la
secuencia de pasos necesarios para lograr el proposito establecido, detras de esto, hay miles de líneas de teoría, así que puedes
PAGINA 32 DE 67
MACROS EN EXCEL
investigar los siguientes temas: Análisis de sistemas, algoritmos, seudocódigo, entre más domines estos temas y entre más
claros sean estos pasos, más fácil te será, pasarlos el lenguaje que quieras, en nuestro caso, al VBA.
o Vamos a la ventana de código y escribimos, ojo, no lo copies, quiero que lo teclees en la ventana de código...
End Sub
o Puntos importantes: Toda macro tiene un nombre, para este caso, decidí que se llamará Gastos_Mes, pero si tu consideras que
otro nombre es adecuado, adelante, no dejes de usarlo, ¿observaste que paso, cuando finalizaste con la línea Public Sub
Gastos_Mes() y presionaste la tecla Enter?, ayudas como esta, nos la da el EditorVBA, en este caso, solito agrego el final de
la macro, End Sub, y poco a poco te mostrare y te iras dando cuenta de que el EditorVBA, nos da muchas otras ayudas más,
que hacen un poco más fácil la escritura de código, si observas alguna otra, durante el proceso de esta macro, no dejes de
comentarla, también observa que después del nombre de la macro, terminamos la línea con un abriendo y cerrando un par de
paréntesis, más adelante, veremos que podemos introducir dentro de estos paréntesis, por lo pronto, las macros que haremos
deben de terminar con estos.
o Recuerda que todo lo que escribamos de aquí en adelante, será entre las lineas Public Sub y End Sub, y de acuerdo a los pasos
que establecimos, debemos de solicitar un nombre y escribirlo en una celda ¿verdad?...
End Sub
o Esta muy fácil ¿verdad?, conforme vayamos esribiendo nuestra macro, ve la probando, y, por ahora, te sugiero proporcionarle
todos los datos que solicitamos, ya veremos que pasa cuando no es así. Ahora trata de solicitar un nombre de mes y escríbelo
en la celda A2, como se que no harás trampa, aquí esta la solución...
End Sub
o Que fácil esta esto, ahora solicitaremos el importe de cada uno de los conceptos, en este caso son tres y estos, los
escribiremos en las celdas B5, B6 y B7 respectivamente, ¿por qué ahí?, bueno, ya lo notaras más adelante, sigue, sigue
leyendo por favor, veamos como quedaría para el primer caso...
PAGINA 33 DE 67
MACROS EN EXCEL
End Sub
o Solo nos resta solicitar los restantes dos importes, de las restantes categorías, y esta es mi pregunta, ¿declararemos otras dos
variables para "guardar" los valores de estos importes?, ¿o podemos usar la misma?, y tu, ¿qué crees?...
End Sub
o Y por ultimo, introducimos la formula que nos sume el importe de estas tres categorías, esto lo haremos en la celda B8
PAGINA 34 DE 67
MACROS EN EXCEL
End Sub
o En sentido estricto, lo que tenemos hasta ahora, realiza el propósito para lo que fue creada, pero... (siempre hay un pero),
¿como la vez?, ¿te gusta?, ¿qué le agregamos?, ¿qué le quitamos?, ¿siempre funciona, en cualquier libro y hoja? (ya sabes a
donde contestar estas preguntas). La primer mejora, será agregar algunos encabezados para identificar cada valor y la
segunda, será darle un poco de formato a los datos...
End Sub
PAGINA 35 DE 67
MACROS EN EXCEL
o Muy importante , como mencionamos, por lo pronto, proporciónale, a la macro, todos los datos que pedimos, no dejes nada
vacío, teclea texto donde te pida texto y números donde te pida números, la tareita es: modifica la macro, de modo que se vea
como la siguiente imagen...
o Por ultimo, y como preparación para la segunda parte de este tema, prueba, ahora sí, a NO darle todos los valores a la macro,
a darle texto donde deberían ir números y ver que es lo que hace la macro, se muy observador, el EditorVBA, de nuevo nos
va a ayudar mucho, LEE la ayuda, investiga más acerca de la función InputBox y ve investigando para que sirve la función
Val, todo esto, lo encuentras en la ayuda, así que solo es cuestión de leer, razonar y comprender un poquito, nos vemos...
o Como se que hiciste tu tarea, aquí esta la solución a la macro, si no te resulto, verifica en donde están las diferencias, recuerda
que esto es solo una propuesta...
'*****************************************
'Esta es la función que TU tenias que hacer
Public Sub Gastos_Mes_2()
Dim strNombre As String 'Declaramos nuestra variable
Dim strMes As String 'Declaramos otra variable
Dim sngImporte As Single 'Declaramos la variable para los Importes
PAGINA 36 DE 67
MACROS EN EXCEL
Range("A4").Value = "Mes"
Range("A6").Value = "Concepto"
Range("B6").Value = "Importe"
Range("A7").Value = "Transporte"
Range("A8").Value = "Alimentos"
Range("A9").Value = "Diversión"
Range("A10").Value = "Total"
End Sub
'*****************************************
'Esta es la función que TU tenias que hacer
Public Sub Gastos_Mes_2()
Dim strNombre As String 'Declaramos nuestra variable
Dim strMes As String 'Declaramos otra variable
Dim sngImporte As Single 'Declaramos la variable para los Importes
PAGINA 37 DE 67
MACROS EN EXCEL
Range("A6").Value = "Concepto"
Range("B6").Value = "Importe"
Range("A7").Value = "Transporte"
Range("A8").Value = "Alimentos"
Range("A9").Value = "Diversión"
Range("A10").Value = "Total"
End Sub
o También quedamos que en esta ocasión, no le vamos a proporcionar los datos esperados, si no que pondremos a prueba la
"solidez" de nuestra macro, asignándole valores incorrectos o simplemente cancelando la operación, esto ultimo muy
importante, en la mayoría de los casos, tienes que proporcionarle al usuario una forma de cancelar la macro en ejecución...
o Como primer prueba le pasaremos una cadena vacía en donde nos solicite un dato, veamos que hace la macro y que mejores
le podemos hacer, empecemos...
o Cuando nos solicite el primer dato, prueba a; directamente dar un clic en el botón Aceptar o a introducir puros espacios con la
tecla Barra espaciadora, observa como en la imagen siguiente el cursor esta unos caracteres adelante, pues se introdujeron
algunos espacios.
o Al dar clic en el botón Aceptar, la macro continua como si nada, es decir, nos muestra el siguiente cuadro donde nos solicita
el siguiente dato, ¿pero?, ¿es esto correcto?, no verdad, el dato Nombre es un dato (lo pondré en mayúsculas) REQUERIDO,
esta palabra es muy importante, nos indica que el valor que estamos solicitando es OBLIGATORIO proporcionarlo para que
nuestra macro haga el trabajo encomendado, si un dato es o no REQUERIDO es algo que Tu tienes que decidir y que es muy
fácil determinar, tan solo pregúntate; ¿la macro puede resolver el trabajo sin este dato?, si la respuesta es NO, entonces es
REQUERIDO, si la respuesta es SI, entonces es OPCIONAL, para nuestro caso, el dato Nombre es un dato REQUERIDO,
por lo que tenemos que garantizar que el usuario proporcione este valor, la pregunta del millón ¿cómo lo hacemos?...
o Como sabes (y si no lo sabes aquí te lo dijo), la función InputBox "siempre", lo repito, "siempre", nos devuelve un String, es
decir, una cadena de texto y esta cadena de texto, será de longitud cero, cuando: presione inmediatamente el botón Aceptar o
cuando presione el botón Cancelar, aun cuando ya haya introducido algún texto en el cuadro, con este conocimiento, solo
tenemos que medir el número de caracteres para saber si el usuario escribió algo en el cuadro de texto, para eso, usamos la
función Len, que nos devuelve un Long, un número con el número de caracteres de una cadena...
PAGINA 38 DE 67
MACROS EN EXCEL
o En la variable Largo, tenemos el número de caracteres que el usuario escribió, si este valor es cero, entonces ya sabes que
significa ¿verdad?, ¿pero, como sabemos si es o no cero?, para esto lo preguntamos de esta manera
If Largo = 0 Then
MsgBox "El dato Nombre es requerido"
End If
o Lo que acabamos de hacer, es crear una estructura condicional, o sea, que dependiendo de una condición, podemos ejecutar
determinado código, en esta caso, nuestra condición es: Largo = 0, que, como observas, esta entre las palabras If y Then, es
decir, entre estas dos palabras claves de VB, pondremos la condición necesaria, como condición, puedes usar "cualquier
expresión que se pueda evaluar como VERDADERA o FALSA", esta estructura tiene muchas variantes, pero empezaremos
por su forma más sencilla, en nuestro ejemplo, si la condición es VERDADERA, entonces se ejecuta la línea o líneas
inmediatas a la condición, en este caso la línea: MsgBox "El dato Nombre es requerido", que tan solo le notifica al usuario
que no proporciono un dato, pero si continuamos, la macro sigue como antes, es decir, nos muestra el siguiente mensaje, lo
cual no es correcto, pues buscamos obligar al usuario a introducir el dato, para esto, podemos volver a preguntar, pero con
esto corremos el riesgo de que vuelva a proporcionar una cadena de longitud cero, con este inconveniente, decidimos mejor,
salir de la macro con la instrucción Exit Sub, con la cual el código quedaría así...
If Largo = 0 Then
MsgBox "El dato Nombre es requerido"
Exit Sub
End If
o Pruébala y verifica como, cuando presionas Cancelar o inmediatamente presionas Aceptar, efectivamente nos informa de ello
y termina la macro, la instrucción Exit Sub hay que usarla con mesura, no abuses mucho de ella, ya aprenderemos otras
alternativas para minimizar su uso.
o Bien, muy bien, ahora prueba a introducir espacios cuando te solicite el nombre, ¿qué paso?, nos deja continuar ¿verdad?,
esto es por que recuerda que aunque nosotros no veamos los espacios, para la computadora son un carácter más, así que
cuando evalúa el largo de la cadena, esta devuelve el número de espacios vacíos que el usuario tecleo, pero esto también
debemos de preverlo con una función llamada Trim que elimina los espacios en blanco que tenga una cadena al principio y al
final de esta...
strNombre = Trim(strNombre)
o en este ejemplo, primero le quitamos los espacios a la variable strNombre y después reasignamos el valor resultante a ella
misma, también podríamos haber usado la función Trim directamente en la función InputBox de la siguiente manera...
o solo para que lo notaras, puse en negritas la función Trim, puedes usar cualquiera de las dos, al final el resultado es el mismo.
Vuelve a hacer las pruebas pertinentes.
o Como siguiente paso, realizamos la misma evaluación para el dato Mes, garantizaremos que el usuario introduzca un dato.
PAGINA 39 DE 67
MACROS EN EXCEL
End If
o Una muy buena pregunta; ¿podremos lograr evaluar que el usuario introduzca un nombre de Mes válido, es decir, garantizar
que el usuario introduzca Enero, Febrero... Diciembre o cualquier mes correcto?, te queda de tareita tratar de hacerlo, al fin y
al cabo solo son doce meses, pero recuerda que la respuesta más obvia no siempre es la mejor.
o El siguiente dato que tenemos que garantizar que el usuario introduzca es un valor, un número, ya no una cadena, esto es
importante, más atrás se dijo la función InputBox "siempre", lo repito, "siempre", nos devuelve un String, es decir, una
cadena de texto, entonces, ¿como es que podemos asignar un String (cadena de texto) a una variable de tipo Single (número
simple) como en la línea siguiente?...
o La respuesta es simple, cuando VB encuentra que queremos hacer una asignación de un Tipo de dato a otro Tipo de dato, si le
es posible hace la conversión necesaria, si no le es posible ocurre un error (mejor dicho un horror por que nuestro código se
detiene), veamos un ejemplo...
o En la imagen anterior, cuando se nos solicita un importe, en vez de un número, introducimos un texto, al presionar el botón
Aceptar nos muestra un lindo e interesante mensaje, un mensaje de ERROR, nos muestra el número de error (13) y nos
muestra la causa del error (No coinciden los tipos), a que tipos...
o Si presionamos el botón Finalizar simplemente la ejecución de la macro termina, pero si presionamos el botón Depurar pasa
algo muy interesante, se abre la ventana del Editor del VBA y una línea se colorea de un forma bastante llamativa, ¿para que
será?...
PAGINA 40 DE 67
MACROS EN EXCEL
o Así es, como lo imaginaste en esa línea ocurrió el error y en ese momento, podemos modificarla, pero antes, quiero que seas
muy observador, aparte de la línea amarilla, hay otra cosa que quiero que observes, esta es, la barra de titulo del Editor,
obsérvala y ve lo que nos va mostrando conforme cambiamos y usamos el Editor VBA, por ahora, detén la ejecución de la
macro, ¿como?, ve al menú Ejecutar | Restablecer o presiona el botón que encerré en un circulo rojo (ya vieron que bien
dibujo a mano alzada).
o Entonces, el error fue que VB no pudo convertir el valor tipo String al tipo Single, pero nuestro trabajo es garantizar que si
pueda hacerlo, pues si a un usuario le sale el mismo mensaje de "horror" que acabamos de ver, ten por seguro que se acordara
de ti, pero para que no pase esto, veamos como solucionarlo.
o Como casi siempre, hay más de una manera de resolverlo, probemos una de las más sencillas, haciendo uso de la función Val,
que convierte "si le es posible" una cadena de texto en un número, pero si no le es posible, ya no ocurre un error, sino que lo
convierte en cero, su uso es simple...
o Ahora, en la variable sngImporte tendremos el valor en "número" si fue posible hacer la conversión, y tendremos un cero, si
no fue posible hacer la conversión, pregunta; ¿cómo evalúas entonces que el dato este correcto?...
o Muy bien, veo que si estas aprendiendo, pero... ¿qué crees?, pues si, tienes otra tareita, es sencilla, solo tienes que responder
la pregunta ¿cómo solucionarías el caso, cuando un usuario introduzca un número negativo?, más fácil no es posible...
o Ahora solo te resta hacer lo mismo para los restantes datos, pero... ¿por qué siempre sales con un pero?, observa la siguiente
imagen, obsérvala muy bien...
PAGINA 41 DE 67
MACROS EN EXCEL
o En este cuadro, se nos esta solicitando el dato Importe (en rojo), que como sabemos debe ser un número, pero le estamos
proporcionando una cadena de texto (en azul), como ya previmos esto, la macro simplemente nos avisara que no es un
número válido y se detendrá, ¿pero que pasa?, en el fondo (en naranja) ya introdujimos por código, los valores de las dos
variables anteriores, pero al cancelarse mi macro por la introducción de un dato erróneo, estos valores son obsoletos, es decir,
inservibles, inútiles, están de más ¿verdad?, solución uno, los borramos antes de salir, solución dos (mejor), los escribimos
hasta después de haber evaluado todas las variables, pero... ¿otro? (ya me estoy cansando de los pero's...), esto es válido para
las dos primeras variables, pero en el caso de los tres importes, estamos usando una sola variable para los tres, para resolver
este pequeño inconveniente, usaremos una variable para cada dato y te podrás preguntar ¿y si mis datos a introducir son
muchos, tendré que declarar una variable para cada dato?, muy buena pregunta, más adelante veremos casos como ese, por lo
pronto hazme caso y declara una variable para cada concepto o cuéntame que otras alternativas que se te ocurren.
o Bien, nuestro código completo se vera así...
Option Explicit
'Solicitamos cada uno de los datos requerido y verificamos que sean correctos
strNombre = Trim(InputBox("¿Cual es tu nombre?"))
Largo = Len(strNombre)
If Largo = 0 Then
MsgBox "El dato Nombre es requerido"
Exit Sub
End If
PAGINA 42 DE 67
MACROS EN EXCEL
End If
End Sub
o Bien, muy bien, ahora nuestra macro es un poco más profesional, los posibles usuarios "casi" no se acordaran de nosotros y
estamos contentos de saber un poco más, recuerda que no es la única solución, puede y hay más, una de ellas la veremos en el
próximo capitulo, no te despegues...
PAGINA 43 DE 67
MACROS EN EXCEL
Option Explicit
'Solicitamos cada uno de los datos requerido y verificamos que sean correctos
strNombre = Trim(InputBox("¿Cual es tu nombre?"))
Largo = Len(strNombre)
If Largo = 0 Then
MsgBox "El dato Nombre es requerido"
Exit Sub
End If
PAGINA 44 DE 67
MACROS EN EXCEL
Range("B8").Value = sngAlimentos
Range("B9").Value = sngDiversion
End Sub
o Esta versión funciona bien, pero como habrás notado, cuando el usuario no proporciona un dato correctamente, la macro, si
bien informa de esta falta, lo que hace es simplemente terminar la ejecución, no le da la oportunidad al usuario de intentarlo
nuevamente, dicen por ahí que -todos merecemos una segunda oportunidad-, así que implementaremos una forma de que el
usuario pueda intentarlo nuevamente, para ello usaremos una nueva estructura condicional, veamos el ejemplo y después lo
explicamos...
o Estos cambios, ya lo habrás notado, los haremos para solicitar el primer dato, para entender esta nueva estructura, te pondré
las instrucciones pero le agregare su interpretación en español...
PAGINA 45 DE 67
MACROS EN EXCEL
o La estructura condicional Do...Loop... While, nos sirve para repetir una serie de instrucciones mientras o hasta que se cumpla
una condición, fíjate como es muy sencillo, solo hay que iniciar la estructura con un Do y terminarla con un Loop While
condicion, con esta estructura el código se ejecutara mientras la condición sea verdadera, la otra variante es que el código se
ejecute hasta que la condición sea verdadera, veamos este ultimo ejemplo...
o El cambio fue realmente simple, observa la siguiente línea que fue la que se modifico...
o Solo sustituimos While por Until e invertimos la condición strNombre <> "" , esto es muy importante, es decir, que la
condición la establezcas de manera correcta, sino, nuestra estructura no cumplira su proposito. Esta estructura tiene otras
variantes, por ejemplo, que la condición la realices al principio de la estructura, en la misma línea del Do, pero como este no
es un curso de programación, te dejo de tareita que investigues más de esta estructura, en la ayuda del VBA, viene, creo yo,
suficientemente explicada, lo que si veremos más adelante son ejemplos de su uso, pues es muy versátil y muy poderosa esta
estructura.
o Solo nos resta complementar los restantes datos, para que queden en la misma estructura de la siguiente manera, siéntete en
libertad de usar cualquier de las dos formas vistas...
Option Explicit
PAGINA 46 DE 67
MACROS EN EXCEL
Do
strMes = Trim(InputBox("¿Cual es el mes?"))
If strMes = "" Then
MsgBox "El dato Mes es requerido"
End If
Loop While strMes = ""
Do
sngTransporte = Val(InputBox("¿Cual es el importe para Transporte?"))
If sngTransporte = 0 Then
MsgBox "El dato Transporte es requerido"
End If
Loop While sngTransporte = 0
Do
sngAlimentos = Val(InputBox("¿Cual es el importe para Alimentos?"))
If sngAlimentos = 0 Then
MsgBox "El dato Alimentos es requerido"
End If
Loop While sngAlimentos = 0
Do
sngDiversion = Val(InputBox("¿Cual es el importe para Diversion?"))
If sngDiversion = 0 Then
MsgBox "El dato Diversion es requerido"
End If
Loop While sngDiversion = 0
PAGINA 47 DE 67
MACROS EN EXCEL
End Sub
CONCLUSIONES
PAGINA 48 DE 67
MACROS EN EXCEL
Funciones
Las funciones personalizadas de Excel, trabajan igual que las incorporadas, con la diferencia de que estas las creamos nosotros y nos
sirven para obtener valores que no nos devuelven las incorporadas o para unir en una sola, el resultado de varias funciones, su uso y
manipulación es muy semejante a las macros, pero como sabes estas nos devuelven valores, esto no lo pierdas de vista.
Las funciones personalizadas, "deben" seguir la misma estructura, si eres observador, notaras que los argumentos están separados por
";" (punto y coma), pero en la descripción dice que debe ser "," (comas), ¿porque?, ¿cual es la correcta? (esto te queda de tareita).
Nuestras funciones "deben" de responder de la misma manera que las incorporadas, DEVOLVIENDO VALORES , esto me parece la
parte más importante que algunos olvidan, ¿has visto que alguna función de Excel te de algún mensaje?, no, lo que hace, cuando no
puede hacer resolver la operación, es darnos un error como #¡NULO!, #¡DIV/0!, #¡VALOR!, #¡REF!, #¿NOMBRE?, #¡NÚM!, #N/A,
pero nada más.
Entonces ya conocemos los siguiente términos, Función y Argumentos, ¿verdad?, otro punto importante es saber que una función
puede o no llevar argumentos como la función ALEATORIO y AHORA, una función puede requerir argumentos de un Tipo y
devolver valores de otro Tipo, como las funciones:
Tareita: Excel, dentro de sus formulas, maneja diferentes Tipos de datos, como fechas y números, ¿que otros TIPOS DE DATOS
conoces que usen las funciones de Excel?, ¿que otros ejemplos de funciones, podrías dar, que devuelvan un tipo de dato diferente del
de su o sus argumentos?
Como habrás notado, el nombre es importante, el nombre de la función nos sirve para en primera instancia sepamos que hace o que
valor o valores nos devuelve, entonces, una parte importante es saber QUE HARA NUESTRA FUNCION es decir, que trabajo
realizara, cual es su finalidad.
Resumiendo:
PAGINA 49 DE 67
MACROS EN EXCEL
Ahora que sabemos lo que necesitamos, hagamos nuestra primera función, como ya dijimos, lo primero es saber, que queremos que
haga nuestra función, como ejemplo, haremos la super-archi-dificilisima formula para calcular el
Área de un triángulo:
• Entramos a Excel
• Entramos el EditorVBA
• Insertamos un nuevo Módulo y escribimos lo siguiente:
• Bueno, nuestra formula funciona, pero no esta optimizada, es decir, estamos cometiendo omisiones "técnicas", es decir, no
estamos escribiendo nuestra función como lo mandan los "santos cánones" de la programación y esto, si bien, no es
obligatorio, es muy, muy conveniente hacerlo y más aun, saberlo, veamos cuales son esas omisiones...
• Si no se especifica otra cosa, toda función es Pública, pero procura hacerlo explícitamente...
• No le estamos diciendo de que TIPO son nuestros argumentos, en nuestro ejemplo, nuestra función debe poder manejar
números grandes y con decimales, por lo tanto el Tipo de dato más conveniente es el Single (busca en la ayuda, los tipos de
datos que se puedes usar en el VBA y me dices cuales son), por lo tanto nuestra función quedaría así:
PAGINA 50 DE 67
MACROS EN EXCEL
• Tampoco le estamos diciendo que tipo de valor es que nos devolverá nuestra función, es muy importante, escoger este tipo de
dato muy bien, la recomendación es, debe ser lo suficientemente grande para contener el resultado de nuestra función, en la
misma ayuda, encontraras cuando espacio ocupa (en memoria) y que valores pueden contener los diferentes tipos de datos,
para nuestro caso, si estamos multiplicando un Single por un Single y aunque estemos dividiendo, el más conveniente es un
Double, para que nuestra función quede así:
• Por ultimo, hay que agregarlo otra palabrita, que en otros ejemplos veremos a detalle, por lo pronto, solo te menciono que
sirve para que los valores que tengan los argumentos, no se puedan modificar desde nuestra función y en la mayoría de los
casos se usa, esta palabrita se llama ByVal y me gustaría que buscaras ayuda de esta palabra, ya sabes donde...
• Y ahora sí, estarás de acuerdo conmigo, que se ve mucho más bonita y presentable, pero sobre todo, esta eficientemente
codificada. Para terminar, te mostrare una variante, que te servirá como ejemplo para la tareita que te dejare.
End Function
• Lo que te he querido decir con esta variante, es que "casi nunca", obtenemos el resultado de nuestra función en una línea,
"casi siempre" se hace uso del proverbio que dice -divide y vencerás-, ¿recuerdas lo que decía Descartes?, puedes hacer uso
de VARIABLES intermedias, observa muy bien esta línea
• te encontraras con líneas como esta muy seguido, lo que le estamos diciendo al VBA es -oye, apártame un cachito de
memoria (recuerda que todo lo que hagas con tu maquina encendida, usa memoria) para que la use-, estamos
DECLARANDO UNA VARIABLE. Como se que eres una personita muy observadora, notaras que es "casi" igual que con
los argumentos, solo que aquí usamos la palabra reservada (¿que es eso de palabra reservada?) Dim, pero para decirle el tipo
de datos es igual As Tipo_Dato
• Ahora si, esta es la tareita, como sabes, tenemos los pelos de los griegos por cualquier lado que mires, allá por el año 500
a.C., vivia el señor Herón que no se conformo con la función que hicimos un poco más arriba, así que se puso a investigar
como obtener el área, pero de cualquier triángulo con solo conocer la longitud de sus lados, para llegar a deducir la siguiente
formula...
A = S ( S − a ) × ( S − b) × ( S − c )
PAGINA 51 DE 67
MACROS EN EXCEL
• En donde a, b y c, son los lados del triángulo y S es el Semiperímetro o sea, la mitad del perímetro y hasta te voy a ayudar un
poco más, en VBA para obtener la raíz cuadrada de un número, se usa la función Sqr (número), en donde número es el
número del cual queremos obtener la raíz cuadrada, adelante, empieza a codificarla que con gusto la revisaré...
• Como siempre, pruébala, si tenemos el famoso triángulo 3,4,5 y le pasamos estos datos a nuestra primer función, Base = 4 y
Altura = 3, el área obtenida sería 6, si le pasamos estos mismos datos, más el largo del tercer lado, a la función que escribas,
te tiene que dar el mismo resultado, el poder de la segunda, como ya se menciono, esta en que se puede obtener el área de
cualquier triángulo, tan solo conociendo la longitud de sus lados.
• Después de haber recibido todas las pruebas que han hecho, aquí esta una de
varias posibles soluciones, pruébala y verifica si esta correcta o cuéntame que
es lo que no te gusta o que otras variantes podría tener...
'Obtenemos el semiperimetro
Semi = (LadoA + LadoB + LadoC) / 2
'Obtenemos los productos
Area = Semi * (Semi - LadoA) * (Semi - LadoB) * (Semi - LadoC)
'Obtenemos la RAIZ CUADRADA
Area = Sqr(Area)
'Asignamos el valor obtenido al nombre de nuestra función
AreaTrianguloHeron = Area
End Function
PAGINA 52 DE 67
MACROS EN EXCEL
En los años que llevo programando, nunca he usado otra moneda ni otro formato más que el de México, si tu eres internacional y usas
varias monedas, te felicito y te recomiendo usar la versión del Guille, pero si tan solo usas tu moneda local, te recomiendo adaptar esta
versión, de hecho, me gustaría compilar en esta página, las versiones de diferentes países, así que si en tu país se usa otro estilo y
moneda, me dices como es y la agregamos a esta página...
NOTA: (30-Oct-2002)
La función se ha modificado un poco, ahora, es posible pasarle el nombre de la moneda, así como otros valores para
configurar el resultado final, creo que en el archivo de ejemplo que puedes descargar al final de esta página, hay suficientes
ejemplos para que no haya duda de su uso.
Option Explicit
'Mauricio Baeza - Samuel Monajaras - Enero-97
'Ultima modificacion Octubre del 2002
'mbs@inbox.net
'http://www.vbalym.netfirms.com
'Argumentos:
'Numero = Valor que deseamos convertir en texto
'Moneda = es el nombre de la moneda a mostrar
'Fraccion_Letras = Verdadero para que la fraccion de la moneda
' tambien la convierta a letras
'Fraccion = Es el nombre de la fraccion de la moneda
'Texto_Inicial = Cualquier texto que quieras al principio del resultado
'Texto_Final = Cualquier texto que quieras al finla del resultado
'Estilo = Formato de salida
' 1 = MAYUSCULAS
' 2 = minusculas
' 3 = Tipo Titulo
'Los valores negativos los convierte a positivos
'El valor minimo en 0, el valor maximo es 9,999,999,999,999.99
PAGINA 53 DE 67
MACROS EN EXCEL
strLetras = Texto_Inicial
'Convertimos a positivo si es negativo
Numero = Abs(Numero)
NumTmp = Format(Numero, "000000000000000.00")
If Numero < 1 Then
strLetras = strLetras & "cero " & Plural(Moneda) & " "
Else
strLetras = strLetras & NumLet(Val(Left(NumTmp, 15)))
If Val(NumTmp) = 1 Or Val(NumTmp) < 2 Then
strLetras = strLetras & Moneda & " "
ElseIf Val(Mid(NumTmp, 4, 12)) = 0 Or Val(Mid(NumTmp, 10, 6)) = 0 Then
strLetras = strLetras & "de " & Plural(Moneda) & " "
Else
strLetras = strLetras & Plural(Moneda) & " "
End If
End If
If Fraccion_Letras Then
intFraccion = Val(Right(NumTmp, 2))
Select Case intFraccion
Case 0
strLetras = strLetras & "con cero " & Plural(Fraccion)
Case 1
strLetras = strLetras & "con un " & Fraccion
Case Else
strLetras = strLetras & "con " & NumLet(Val(Right(NumTmp, 2))) &
Plural(Fraccion)
End Select
Else
strLetras = strLetras & Right(NumTmp, 2)
End If
strLetras = strLetras & Texto_Final
Select Case Estilo
Case 1
strLetras = StrConv(strLetras, vbUpperCase)
Case 2
strLetras = StrConv(strLetras, vbLowerCase)
Case 3
strLetras = StrConv(strLetras, vbProperCase)
End Select
Numeros_Letras = strLetras
End Function
PAGINA 54 DE 67
MACROS EN EXCEL
co1 = co1 + 1
PAGINA 55 DE 67
MACROS EN EXCEL
Leyenda = ""
letra1 = ""
letra2 = ""
letra3 = ""
Loop
NumLet = TFNumero
End Function
End Function
PAGINA 56 DE 67
MACROS EN EXCEL
If uni > 0 And dec > 2 Then cTexto = cTexto + "y "
Decena = cTexto
End Function
Unidad = cTexto
End Function
End Function
PAGINA 57 DE 67
MACROS EN EXCEL
Recuerda que en la Introducción, hay una explicación de como usar cualquier macro o función que veas aquí.
Agregue una nota acerca de los usuarios de Excel97, se refiere al uso de la función StrConv que solo funciona en el
Excel2000 en adelante, si este es tu caso, sustituye donde corresponda, con el siguiente código, en el código.
'***************************************************************
'Nota: la funcion StrConv solo funciona en Excel2000 en adelante
'si es tu caso, usa el siguiente codigo
TFNumero = TFNumero & Leyenda1
Select Case Estilo
Case 1
TFNumero = UCase(TFNumero)
Case 2
TFNumero = LCase(TFNumero)
Case Else
TFNumero = Application.WorksheetFunction.Proper(TFNumero)
End Select
PAGINA 58 DE 67
MACROS EN EXCEL
Complementos (Add-ins)
En esta sección explicaremos que son, cual es su propósito y como se usan, así como la forma de "instalarlos" dentro de Excel,
también agregaremos complementos probados y terminados para su libre uso y estudio del código.
Esto es lo que nos dice la ayuda, en otros términos, un complemento es un archivo de Excel, con ciertas características especiales (que
veremos) en el cual podemos crear macros o funciones que extiendan las posibilidades de Excel, veamos primero un complemento de
los que incluye Excel y después crearemos el nuestro...
• Entramos a Excel
• Seleccionamos el menú Herramientas |
Complementos...
• Nos mostrara el siguiente cuadro de dialogo
PAGINA 59 DE 67
MACROS EN EXCEL
• Como este articulo no es para explicar el uso de este complemento, pues te queda de tarea probarlo, que como imaginaras, te
permite guardar cada X minutos el libro activo o todos los libros, además de que si esta bien instalado, también se instala la
ayuda de los complementos.
• Ahora, quiero que regreses a los complementos y busques en la lista uno que se llama Solver, selecciónalo y de nuevo te
agregara una nueva opción al menú Herramientas, esto es solo como prueba de otro complemento y también como tarea te
queda investigar como quitar estos complementos.
• Observa como la herramienta de Autoguardar NO esta implementada en Excel, sino que se agrego esta funcionalidad con un
complemento o Add-ins como también se les conoce, esto no lo pierdas de vista, los complementos son para agregar nuevas
funciones o herramientas a Excel, no para repetir las ya existentes.
• Ahora viene lo interesante, como creo mi propio complemento, antes de continuar, no pierda de vista lo comentado en el
punto anterior y veamos paso a paso como crear un sencillo complemento. Para lo que veremos a continuación, estoy
suponiendo que ya trabajas, aunque sea muy básico, con macros y funciones, si no es así, te recomiendo los siguientes temas
vistos en estas páginas:
•
Introducción donde vemos como empezar desde cero con las macros y a familiarizarnos con el Editor VBA
Grabando mi primer macro en Excel
Escribiendo mi primer función en Excel
Y los primeros tres temas de la sección Articulos
Como ya se dijo, vamos a usar los complementos para agregar funcionalidades inexistentes en Excel, para nuestro
ejemplo, implementaremos la posibilidad de cambiar el contenido de las celdas de MAYÚSCULAS a minúsculas y
viceversa.
Entramos a Excel.
Si tenemos más de una hoja (normalmente 3) dejamos solamente una hoja, esto no es indispensable, pero dado que
no se van a ocupar, las eliminamos para que el complemento resultante sea de menor tamaño.
Guardamos nuestro archivo, por ahora, guárdalo como cualquier archivo de Excel y después veremos como hacerlo
como complemento.
Entramos al Editor VBA, método abreviado Alt + F11
Agregamos un módulo de código Estándar desde el menú Insertar | Módulo
Escribimos o copiamos las siguientes macros...
Option Explicit
End Sub
End Sub
PAGINA 60 DE 67
MACROS EN EXCEL
End Sub
End Sub
• Comprobamos que trabajen bien, probándolas desde el Editor VBA o desde la interfaz de Excel desde el menú Herramientas |
Macro | Macros... o con el método abreviado de teclado Alt + F8
• Estas macros las declaramos Publicas (para detalles de este tema lee el articulo Publica o Privada, ¿cual usar?), pero al
guardar nuestro archivo como Complemento, estas macros no las podrás ver y por consiguiente ejecutar, desde la interfaz de
Excel, es como si las macros pasaran a ser Privadas, entonces, para poder ejecutarlas tienes que asignarlas a alguna elemento
de la pantalla, un menú, un botón o algún control, como notaste en los Complementos Autoguardar y el Solver, estos
agregaban una nueva opción al menú Herramientas, esto no es obligatorio, ya que puedes agregar una opción en cualquier
parte de los menús o submenús existentes o de plano crear un nuevo menú propio, para nuestro ejercicio agregaremos un
submenú al menú Herramientas que se llame Utilidades y dentro de este las opciones Mayúsculas y Minúsculas, para ello
usaremos el siguiente código...
PAGINA 61 DE 67
MACROS EN EXCEL
.Caption = "Mayusculas"
'Le asignamos la macro que queramos ejecutar
.OnAction = "Mayusculas"
End With
End If
End If
'Liberamos la memoria
Set MenuHerr = Nothing
Set NuevoMenu = Nothing
Set OpcionMenu = Nothing
End Sub
End Sub
o Ahora, para que la macro PonerMenu se ejecute de forma automática al abrir el Complemento y la macro
QuitarMenu se ejecute automáticamente al cerrar el Complemento, las "llamamos" desde los eventos Open y
BeforeClose del libro, respectivamente...
o Desde el Editor VBA selecciona el objeto ThisWorkbook
o Ve al menú Ver | Código o presiona la tecla F7
o Copia o escribe el siguiente código.
Option Explicit
o Ahora, antes de guardarlo como un Complemento, guarda el archivo con estos últimos cambios de modo que
siempre tengas un "respaldo" de tu complemento como un libro normal XLS.
o Ve al menú Archivo | Guardar Como... y del cuadro de lista desplegable (ComboBox) Guardar como tipo, buscas y
seleccionas Complemento de Microsoft Excel (*.xla)
PAGINA 62 DE 67
MACROS EN EXCEL
o Establece el nombre del Complemento, normalmente será el mismo de mi archivo XLS, pero antes de aceptar y
cerrar este cuadro de dialogo, observa como Excel, al decirle que queremos guardarlo como Complemento, solito
nos cambia la ruta de acceso, da un clic en el cuadro de lista desplegable (ComboBox) Guardar en, y observa la ruta
donde lo dejara, la cual normalmente es
C:\WINDOWS\Application Data\Microsoft\Complementos
claro, en este momento, si lo deseas, puedes cambiar esa ruta y guardar tu complemento donde gustes.
PAGINA 63 DE 67
MACROS EN EXCEL
o En este momento ya tienes dos archivos, uno XLS y otro XLA, aunque el XLA (el Complemento) no queda abierto
en estos momentos, hay que cargarlo para probarlo y es lo que haremos a continuación.
o Cierra y vuelve a entrar a Excel, esto es con la finalidad de que reconozca el nuevo complemento, NO es
indispensable, pero ya te iras dando cuenta, cuando es conveniente hacerlo y cuando no.
o Ve al menú Herramientas | Complementos, la lista de complementos esta en orden alfabético, así, que si has usado
los nombres propuestos, desplázate hasta la letra U y debe de aparecer el Complemento Utilidades como se ve en la
siguiente imagen, en caso de que hayas guardado tu complemento en otro lugar, tienes que usar el botón de comando
(CommandButton) Examinar... para localizarlo...
PAGINA 64 DE 67
MACROS EN EXCEL
o Ve al menú Herramientas y observa como tenemos nuestro menú personalizado, agregado automáticamente al cargar
nuestro complemento y que será eliminado automáticamente al cerrarse o descargarse.
o Pruébalo, llena algunas celdas con texto y conviértelas a MAYUSCULAS o minúsculas, prueba a hacerlo en
cualquier otro libro, prueba a cargar y descargar el complemento para verificar que se elimina el menú
correctamente.
o Por ultimo, habrás notado en los complementos instalados que al seleccionar en la lista de Complementos, en al
parte inferior aparece una breve descripción del propósito de dicho complemento, si bien esto no puede sustituir a la
documentación que debe de acompañar a todo código o programa, es útil para de primera mano, saber la utilidad del
complemento, agreguémosle esta propiedad a nuestro complemento, para esto, descarga el complemento y abre el
archivo XLS original.
o Ve al menú Archivo | Propiedades... y selecciona la ficha Resumen, en esta, puedes llenar todos los campos que
quieras, pero los importantes son: Titulo y Comentarios, el campo Titulo será lo que aparezca en el cuadro de lista
Complementos y el campo Comentarios se verá en la parte inferior de dicho cuadro, complétalos a tu gusto, te
muestro lo que yo escribí...
PAGINA 65 DE 67
MACROS EN EXCEL
o Vuelve a realizar el proceso de guardar como Complemento, por supuesto, al querer guardarlo con el mismo
nombre, te preguntara si quieres reemplazarlo, respondes que si y cierras y vuelves a entrar a Excel, vas al menú
Herramientas | Complementos buscas tu complemento y veras que corresponde lo que escribiste en los campos de
las propiedades del archivo, con lo que ves aquí...
PAGINA 66 DE 67
MACROS EN EXCEL
Muy bien hecho, cierto, todavía puede tener muchas mejoras y las tiene, sobre todo en lo que respecta a controlar errores, pero eso
se verá en otro capitulo, por lo pronto con esto basta...
La mayoría de las macros y funciones que hagamos, son susceptibles de usarse desde un modulo estándar y un libro común como
macro o incorporarse a un Complemento, con el uso y la experiencia, tu mismo discernirás cuando es conveniente lo uno y
cuando lo otro.
Para los miembros de la lista, el archivo original XLA esta disponible en el área de archivos.
Su uso de detallará en esta página, aunque realmente es muy sencillo, el complemento esta disponible en el área de ficheros de la lista,
o puedes descargarlo desde aqui, te aclaro que para que puedas ver el código, el archivo esta guardado como XLS, pero puedes
guardarlo como complemento, pues esta pensado para que funcione como tal...
PAGINA 67 DE 67