Está en la página 1de 134

Macros de Excel: Para personas ocupadas

Aprende en poco tiempo a crear macros que hagan el


trabajo duro por ti.

Luis Alberto Cruz Orellana


Este libro está a la venta en http://leanpub.com/libro-macros-excel

Esta versión se publicó en 2019-11-21

Este es un libro de Leanpub. Leanpub anima a los autores y publicadoras con el proceso de
publicación. Lean Publishing es el acto de publicar un libro en progreso usando herramientas
sencillas y muchas iteraciones para obtener feedback del lector hasta conseguir tener el libro
adecuado.

© 2019 Luis Alberto Cruz Orellana


Este libro esta dedicado a Dios, a mi esposa Patty y mis hijos Luis y Gabriela. Ellos son la razón por
la que me esfuerzo cada dia en ser mejor.
ÍNDICE GENERAL

Índice general

Tus primeras macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1


Que es una macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Como pueden ayudarte las macros en tu trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Como se usan las macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Tu primer macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Introducción a VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Qué es VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Editor de VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Editar una grabación de macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Comentarios en el código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Introducción a la programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Tu primer macro usando VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Funciones o subrutinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Variables, constantes y tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Que son los arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Decisiones y operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Operaciones con variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Qué son los ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Interactuando con Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
¿Que son los objetos y clases? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Objetos de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Eventos de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Ejemplo practico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Extendiendo Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Crea tus propias funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Agrega documentación a tus fórmulas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Parámetros opcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

https://excel.facilparami.com
ÍNDICE GENERAL

Instalar y desinstalar complementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49


Crea tus propios complementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Corrigiendo Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Que tipos de errores podemos esperar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Como depurar código en el editor de VBA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Control de errores en tiempo de ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

Mensajes y cuadros de diálogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69


Mostrar mensajes en la barra de estado de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Mostrar mensajes usado MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Ventana de diálogo para trabajar con archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Crear formularios avanzados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75


Introducción a userforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Tu primer formulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Como utilizar botones de comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Como utilizar etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Como utilizar cuadros de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Como utilizar botones de radio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Como utilizar casillas de selección o checkbox . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Como utilizar listas de selección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Trabajando con eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Algunas macros para nuestro formulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Como leer la información de un formulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Como agregar validaciones a tu formulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Uso de Workbooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Crear un nuevo archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Abrir un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Abrir un archivo de Excel indicado por el usuario . . . . . . . . . . . . . . . . . . . . . . . . . 101
Verificar si un archivo está abierto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Cerrar un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Borrar un archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Guardar un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

Uso de WorkSheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108


Agregar hojas a un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Borrar una hoja de un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Mover una hoja de un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

https://excel.facilparami.com
ÍNDICE GENERAL

Copiar y pegar hojas de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110


Ocultar una hoja de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Cambiar el nombre de una hoja de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Proteger un archivo de Excel con contraseña . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Imprimir una hoja de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Trabajando con Rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116


Usando Rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Recorrer todos los valores de un rango . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Combinar múltiples rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Uso de Offset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Borrar rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Ocultar rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Rangos con nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Modificar tamaño de rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

https://excel.facilparami.com
Tus primeras macros
En este capítulo voy a introducirte al mundo de las macros, aprenderás que es una macro, por que
necesitas usarlas, como puedes usarlas y como crear macros sencillas.

Que es una macro


Una macro es una secuencia de comandos o pasos para realizar una tarea. En nuestro caso una macro
de Excel no es más que una serie de acciones que puedes realizar en Excel.
Por ejemplo, si te envían una hoja de cálculo y te piden preparar un reporte con esos datos, entonces
tú sigues una serie de paso o acciones en Excel para preparar ese reporte.
Si los pasos que sigues son siempre los mismos o muy similares, entonces puedes crear una macro
de Excel para que haga ese trabajo por ti.

Como pueden ayudarte las macros en tu trabajo


La mayor limitante de todos nosotros es nuestro tiempo, ese es tu recurso más valioso. Puedes usar
tu tiempo para ver una película, leer un libro, pasar tiempo con tus seres queridos, trabajando o en
lo que tú desees.
Por su puesto, todos necesitamos y debemos trabajar para poder sobrevivir, pero con la ayuda de las
computadoras y las macros de Excel, puedes hacer que la computadora haga gran parte del trabajo
en tu lugar, y así poder ganar un poco de tiempo extra para hacer algo que te guste más.
Por otra parte, también puede ayudarte a ser mucho más productivo en tu trabajo y sobresalir de
entre todos tus compañeros.

Como se usan las macros


Ahora vas a comenzar a trabajar con macros, para el resto del capítulo vamos a tomar un caso
hipotético: Imagina que tienes una hoja de Excel que frecuentemente debes compartir con otras
personas, no te afecta que las personas vean los datos, pero no quieres que conozcan las fórmulas
que usas para calcularlas (es algo secreto, como la fórmula de la Coca-Cola o algo así).
Entonces cada vez que debes enviar la hoja de cálculo a alguien, pasas todas las fórmulas a valores
absolutos. Pero para ahorrarte ese trabajo, has creado una macro.
Tus primeras macros 2

Como aún no hemos visto como crear macros, puedes descargar la macro de la que hablo haciendo
clic aquí¹
Ahora vamos a activar un menú secreto de Excel, primero haces clic en el menú Archivo

Menú Archivo

Luego seleccionas Opciones


¹https://my.pcloud.com/publink/show?code=XZN9jd7Z1hwPMri9O681FVEH44EWBjO6qVAV

https://excel.facilparami.com
Tus primeras macros 3

Opciones

Y seleccionas Personalizar cinta de opciones y marcas la casilla de selección que dice Programador,
finalmente haces clic en Aceptar y listo, ya has activado el menú secreto.

https://excel.facilparami.com
Tus primeras macros 4

Activar menú programador

Abre el archivo que descargaste y verás que en la celda C6 hay una formula (es una formula muy
sencilla, pero esto no es importante por ahora)
Si vas al nuevo menú Programador, luego presionas el botón que dice Macros veras que se abre una
ventana, selecciona la primera macro en la lista y presiona el botón Ejecutar, esto hará que todas
las fórmulas en esta hoja sean reemplazadas por su valor en texto, eliminado su fórmula, pero no su
resultado

https://excel.facilparami.com
Tus primeras macros 5

Ejecutar una macro

Existen otras formas para ejecutar una macro, pero por el momento vamos a utilizar esta.

Tu primer macro
Ahora que ya ejecutaste tu primera macro es hora de que crees tú primer macro. Crea un archivo
nuevo de Excel y en el menú Programador presiona el botón Grabar macro
Luego veras una ventana en la que tienes que colocar un nombre para la macro, una descripción y
presionar el botón Aceptar

Los nombres de macros no pueden llevar espacios en blanco, pero puedes usar guiones
para separar palabras. Tampoco puedes usar caracteres especiales.

https://excel.facilparami.com
Tus primeras macros 6

Grabar macros

Ahora Excel va a grabar todo lo que hagas, por ejemplo, selecciona primera fila de la hoja de cálculo
y coloca un color de fondo, puedes hacer cualquier cosa que desees. Cuando termines presiona el
botón Detener grabación

Detener grabación

Ya está, has creado tu primer macro. Puedes ejecutarla como lo hiciste con la macro que descargaste,

https://excel.facilparami.com
Tus primeras macros 7

pero para poder ver que repite todo, puedes seleccionar una hoja nueva.
Si intentas grabar este archivo, vas a recibir una advertencia, y es que las hojas de cálculo “normales”
no pueden contener macros. Para poder grabar y conservar tu macro debes de elegir el formato de
archivo Libro de Excel habilitado para macros

Archivo con macros

Hasta ahora las macros que crees, son parte del archivo en que estas trabajando, si el
archivo no está abierto, la macro no está disponible. En otros capítulos vamos a aprender
a hacer que tu macro este siempre disponible

Ejercicio
Ahora viene la parte práctica, imagina algo que has estado haciendo en Excel, y que repites una y
otra vez. Intenta crear una macro que automatice el trabajo y lo haga por ti.

https://excel.facilparami.com
Tus primeras macros 8

Tiene que ser algún muy sencillo como dar formato a algo, cambiar algún nombre, borrar columnas
que no usas o algo así, recuerda que estas comenzando, luego podrás hacer cosas más difíciles.

https://excel.facilparami.com
Introducción a VBA
En este capítulo aprenderás qué es VBA, cómo usar el editor de VBA para crear macros usando
código de programación y a editar macros grabadas con la grabadora de macros.

Qué es VBA
VBA significa Visual Basic for Applications, este es un lenguaje de programación hecho por
Microsoft para automatizar cualquier cosa en su suite de oficina Office. Está basado en Visual Basic,
por lo que sus comandos son prácticamente los mismos.
Cada opción, cada botón que presionas, cada cosa que haces en Excel Puede ser realizada mediante
código de VBA, de hecho, cuando grabas una macro usando la grabadora, cada acción que haces se
guarda como código de VBA.
Pero la grabadora de macros tiene sus limitaciones Cuando escribes código de VBA, no existen los
límites. Si puedes hacer algo en Excel, también puedes hacerlo usando VBA.
Este es un ejemplo de código de VBA:

1 Sub formula_a_valor()
2 ' Convierte todas las formulas a valores absolutos
3 '
4 Cells.Select
5 Selection.Copy
6 Range("A1").Select
7 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
8 :=False, Transpose:=False
9 Range("A1").Select
10 End Sub

Lo sé, se ve bastante confuso ahora, pero no te preocupes, aun si nunca has programado. Este libro
está diseñado no solo para enseñarte a utilizar VBA, sino también para enseñarte a programar.

Editor de VBA
Para ingresar al editor de VBA, abre alguna hoja de Excel y presiona las teclas ALT+F11, al hacer esto
verás una ventana como esta:
Introducción a VBA 10

Editor de VBA

Esta está dividida en varias secciones, no te preocupes si no puedes verlas todas en este momento,
esto se debe a que tu hoja de Excel aún no tiene macros.
En la parte superior izquierda verás el explorador de proyectos, cada libro de Excel o archivo se
trata como un proyecto, el código de VBA ira dentro de una carpeta llamada Módulos, dentro de
esta carpeta existirá uno o más archivos que a su vez contiene código de programación (macros). En
la parte derecha hay una ventana, ahí es en donde se puede visualizar el código de las macros.

Ver el código de programación

Existen varios menús y herramientas, pero los iremos viendo en detalle poco a poco para no saturarte

https://excel.facilparami.com
Introducción a VBA 11

con información.

Editar una grabación de macros


Ahora vamos a practicar con algo sencillo, ya sabes crear macros usando la grabadora, entonces crea
una macro sencilla, por ejemplo, una macro en la que cree o modifique los encabezados de una hoja
de cálculo colocando en la celda A1 la palabra Nombre y en la celda B1 Apellidos.
Luego de grabar la macro, abres el editor de VBA (presionando las teclas Alt+F11) y posiblemente
veas algo como esto:

Macro a editar

Ahora imagina que tu necesidad ha cambiado y en la columna C1 necesitas que diga Teléfono,
entonces en lugar de grabar otra macro, solo la abres en el editor y debes hacer dos cosas

• Seleccionara la celda C1
• Escribir el texto Teléfono

El código para eso sería:

1 Range("C1").Select
2 ActiveCell.FormulaR1C1 = "Teléfono"

Si lo agregas a la macro, ésta deberá verse así:

https://excel.facilparami.com
Introducción a VBA 12

1 Sub encabezados()
2 '
3 ' encabezados Macro
4 '
5
6 '
7 Range("A1").Select
8 ActiveCell.FormulaR1C1 = "Nombre"
9 Range("B1").Select
10 ActiveCell.FormulaR1C1 = "Apellidos"
11 Range("C1").Select
12 ActiveCell.FormulaR1C1 = "Teléfono"
13
14 End Sub

Ahora solo debes de probar la macro y tendrás que ver que automáticamente rellena las celdas A1,
B1 y C1 con los textos que has programado en tu macro.
Ya has modificado tu primera macro escribiendo código. Sé que este ejemplo es muy sencillo y
posiblemente te preguntas cómo sería hacer algo más complicado.
No te preocupes, a medida que avances en esta lectura, iras aprendiendo más trucos y los ejemplos
y ejercicios se irán complicando cada vez más, hasta que te conviertas en un experto.

Comentarios en el código
Si has puesto atención, cuando observas el código que genera la grabadora de macros de Excel,
genera algunos textos, que no son comandos en las macros, estos se llama comentarios y ayudan a
que el código sea más fácil de leer y entender por nosotros los humanos.
Los comentarios son parte fundamental de todo programa, pero muchos programadores no los usan
porque creen que les hace perder el tiempo. Pero en realidad es todo lo contrario, los comentarios
pueden ayudarte a no perder tu tiempo. Voy a explicarte por qué debes utilizar siempre comentarios
en todos los programas que escribas.
Nuestra memoria no siempre es confiable y cuando escribimos código, todo está claro en nuestra
mente, pero rara vez escribimos un programa y no volvemos a verlo o modificarlo nunca. Un
programa debe revisarse y corregirse a lo largo de toda su vida útil.
Entonces ¿qué pasa si debes agregar alguna funcionalidad a una macro 6 meses después de haberla
creado?, lo más probable es que no recuerdes cómo funciona alguna fórmula que usaste, de donde
tomas algún valor o por qué haces algo de una forma, en lugar de otra.
Todos estos problemas (y otros más) se resuelven al leer los comentarios que has escrito en el código.
Ahora que ya sabes por qué debes usar los comentarios, veamos cómo puedes usarlos.

https://excel.facilparami.com
Introducción a VBA 13

Si escribes una comilla simple ', eso indica que toda la línea es un comentario y será ignorada como
código. Y ya que los comentarios no se ejecutan, entonces otro uso que se le da a los comentarios es
el de deshabilitar temporalmente un bloque de código.
Pero si deseas convertir en comentario un bloque grande de código, no es práctico hacerlo línea por
línea, entonces debes activar una barra de herramientas de Excel que te ayude en este proceso.
Haz clic derecho sobre la barra de herramientas actual y selecciona la opción Edición como se
muestra en esta imagen:

Activar barra de herramientas Edición

Ahora para comentar un bloque, solo marcas el texto y presionas uno de los botones en la barra de
herramientas para comentar o descomentar el bloque. Intenta hacerlo tú mismo.

https://excel.facilparami.com
Introducción a VBA 14

Comentar bloque

Ejercicio
Tan solo hemos iniciado a conocer VBA, entonces el ejercicio de este capítulo es sencillo, debes
grabar una macro (usando la grabadora), haz algo sencillo, por ejemplo una macro que escriba “Hola
mundo” en la celda en donde te encuentres, luego entra al editor de VBA y explora la macro, revisa
el código que se generó e intenta modificar “Hola mundo” por cualquier otro texto, luego corre la
macro y comprueba que lo hiciste bien.

https://excel.facilparami.com
Introducción a la programación
Como has visto hasta ahora, puedes crear macros sin necesidad de programar, todo se ha hecho
usando la grabadora de macros.
Pero para sacar el máximo provecho de las macros de Excel, necesitas crear macros usando código de
VBA. Por eso ahora vas a crear tu primer macro desde cero y usando solo código de programación.
Pero no te preocupes si nunca has programado, porque este capítulo cubre todos los conceptos básicos
de programación.

Tu primer macro usando VBA


Ahora imagina que trabajas en una empresa en donde te dan una hoja de Excel con una lista de
productos y sus costos, tu trabajo es calcular los precios. Como política de la empresa, los precios se
calculan como el costo más un 30% extra.
Entonces básicamente lo que debes hacer es crear una nueva columna y calcular el precio como el
costo más 30%. Crea una hoja de Excel que se vea como esta:

Lista de productos

Ahora presiona las teclas Alt+F11 para abrir el editor de VBA y haz clic derecho sobre el proyecto
VBAProject con el nombre de tu hoja de cálculo y selecciona la opción de menú Insertar > Módulo
Introducción a la programación 16

Insertar modulo

Ahora vas a crear una subrutina, todas las macros que creas en la grabadora son subrutinas. Para
crearla solo debes escribir algo como esto:

1 Sub calcula_precios()
2
3 End Sub

En donde Sub y End Sub marcan el inicio y el fin de la subrutina, la palabra calcula_precios es el
nombre de tu macro y siempre va seguido de paréntesis. Dentro de los paréntesis pueden ir algunos
parámetros, pero vamos a dejarlo de esta forma por ahora.
Acabas de crear una macro vacía, para que funcione necesita algo de código (instrucciones de lo que
debe hacer), ahora puedes modificarla de forma que te quede así:

https://excel.facilparami.com
Introducción a la programación 17

1 Sub calcula_precios()
2
3 Dim costo
4 Dim fila As Integer
5
6 'Coloca encabcezado
7 Range("D1").FormulaR1C1 = "Precio"
8
9 'Recorrer todas las filas
10 fila = 2
11 costo = Range("C" & fila).FormulaR1C1
12 Do While IsNumeric(costo) 'Procesar mientras el costo sea un numero
13 'Calcular el precio
14 Range("D" & fila).FormulaR1C1 = costo * 1.3
15
16 'Pasar a las siguiente fila y leer el costo
17 fila = fila + 1
18 costo = Range("C" & fila).FormulaR1C1
19 Loop
20
21 End Sub

Hay mucho código nuevo aquí, no te preocupes por ahora, voy a ir explicando algunos conceptos
que necesitas para comprender todo. Por el momento puedes descargar la hoja de cálculo y hacer
unas pruebas ejecutando la macro.

Puedes descargar la hoja de Excel junto con su macro haciendo clic aquí².

Funciones o subrutinas
En VBA usualmente ingresas el código en una función o en una subrutina, ambos términos se
refieren a fragmentos de códigos que realizan una tarea específica y puede ser llamados las veces
que necesites. Realmente no hay una limitante sobre la cantidad de tareas que pueda realizar una
subrutina o una función, esto es simplemente una buena práctica, ya que de esta forma puedes
reutilizar el código fácilmente, es menos propenso a errores y es más fácil de modificar o mejorar.
Ahora, la diferencia entre una función y una subrutina es que la función puede regresar un valor,
por ejemplo, puedes crear una función que reciba como parámetro un código de cliente y regrese el
nombre del cliente. En cambio, las subrutinas no pueden regresar ningún valor.
El ejemplo más común de funciones son las funciones que vienen en Excel, por ejemplo, la función
SUMA que recibe un rango de celdas y regresa la suma de todos sus valores. Un ejemplo de una
²https://my.pcloud.com/publink/show?code=XZLyWE7ZsQiRtGafe8Y3Wp5zRw9FpVB9DgoX

https://excel.facilparami.com
Introducción a la programación 18

subrutina es una macro que genera un reporte de Excel, esta subrutina no regresa ningún valor, pero
si puede realizar cambios en una hoja de Excel. Las funciones también pueden hacer cambios en una
hoja de Excel, pero su uso habitual es devolver un valor.
Otra diferencia importante es que solo puedes llamar macros desde una hoja de Excel a aquellas
que has creado como subrutinas que no lleven ningún parámetro. Puedes hacer la prueba con la
subrutina que acabas de crear.

Insertar modulo

Variables, constantes y tipos de datos


Las variables son zonas de memoria en tu computadora, a las que puedes acceder para guardar o
consultar información. Para poder decirle a la computadora a que parte de la memoria te refieres,
usas un nombre para tu variable.

https://excel.facilparami.com
Introducción a la programación 19

Los nombres de variables no pueden llevar espacios y solo deben contener letras o números, pero
puedes usar algunos caracteres como el guion bajo para separar palabras. También hay algunos
nombres que no puedes usar, estos nombres se conocen como palabras reservadas.
Algunas de estas palabras que no puedes usar son: Function, Sub, Dim, etc. Para una lista completa
puedes consultar este artículo que detalla todas las palabras reservadas³.
Ahora, para declarar una variable utilizas la palabra Dim seguida del nombre de tu variable y
opcionalmente la palabra as seguida del tipo de datos, por ejemplo, para declarar una variable
llamada fila y de tipo numérico usamos un código como este:

1 Dim fila As Integer

Si has intentado aprender VBA por tu cuenta, quizá sepas que no es necesario declarar una variable
para poder usarla, pero si es una buena práctica hacerlo. Te recomiendo que siempre las declares, si no
lo haces podrías crear errores lógicos, los cuales son muy difíciles de corregir. Por ejemplo, imagina
que usas una variable llamada impuestos, luego haces algunos cálculos y tratas de consultar su valor,
pero te equivocas y escribes impuesto, es decir, olvidas colocar la letra s al final. Lo que pasará es
que no obtienes ningún error, pero leerás el contenido de una variable sin declarar y sin el valor que
esperas.
Para evitar este tipo de error puedes forzar a VBA a que siempre te pida declarar las variables, para
esto seleccionas el menú Herramientas > Opciones y en la pantalla que se muestre debes marcar la
opción Requerir declaración de variables.

Solicitar declaración de variables

³https://excel.facilparami.com/2019/04/palabras-reservadas-en-vba

https://excel.facilparami.com
Introducción a la programación 20

Ahora te verás obligado a declarar siempre cada variable que utilices, pero a cambio ahorrarás mucho
tiempo tratando de encontrar errores lógicos. Para declarar una variable puedes usar cualquiera de
estos tipos de datos:

Tipo de datos Rango de valores


Boolean True o False (Verdadero o Falso)
Integer números del –32,768 al 32,767
Long números del –2,147,483,648 al 2,147,483,647
Single números del –3.402823E38 al 1.401298E45
Double números del –1.79769313486232E308 al –4.94065645841247E-324
Double números del 4.94065645841247E–324 al 1.79769313486232E308
Date Fechas del 1/1/100 al 31/12/9999
String Cualquier texto
Object Cualquier objeto
Variant Cualquier valor de cualquier tipo
Currency –922,337,203,685,477.5808 a 922,337,203,685,477.5807

Nota: El tipo Double está dos veces, por que posee dos rangos, uno para valores negativos
y otro para valores positivos.

Ya sabes cómo declarar una variable, ahora, para asignarle un valor solo escribes el nombre de la
variable y escribes un signo = y el valor que deseas asignar, por ejemplo:

1 Dim fila as Integer


2 Dim texto as String
3
4 fila = 1
5 texto = "Hola mundo"

Como puedes notar los valores numéricos se colocan tal y como los ves, pero los valores de texto se
escriben entre comillas dobles. Ahora que tienes valores definidos en tus variables, puedes utilizarlos
en tu macro, veamos un ejemplo sencillo del uso de variables, donde tendremos una macro que
actualiza el contenido de una celda.

1 Sub variables()
2 Dim texto As String
3
4 texto = "Hola mundo"
5
6 'Accedemos y cambiamos el contenido de la celda activa
7 ActiveCell.FormulaR1C1 = texto
8
9 End Sub

https://excel.facilparami.com
Introducción a la programación 21

Intenta crear y ejecutar la macro anterior en una hoja de Excel, y verás que una vez que hayas
asignado un valor a la variable texto, podrás usarla y la macro entenderá que debe usar el valor
asignado en la variable. Modifica el valor de la variable texto y revisa lo que pasa cuando la ejecutas
de nuevo.
Una vez que crees la subrutina anterior puedes ejecutarla posicionando el cursor sobre cualquier
parte de su código y luego presionando la tecla F5 o presionando el botón Ejecutar.

Ejecutar una macro desde el editor de VBA

Nota: Con ActiveCell.FormulaR1C1 puedes acceder al valor de la celda actual, esto es algo
muy útil en muchas macros y a lo largo de este libro vas a aprender muchas otras cosas
que te serán de utilidad al crear macros.

El contenido de una variable puede ser modificado en cualquier momento, esta es la única diferencia
entre una variable y las constantes. Para declarar una constante utilizas la palabra Const seguida del
nombre de la constante, el tipo de datos y su valor. Aquí hay un ejemplo en que se define una
constante llamada FactorIVA de tipo single y con valor 0.13
Const FactorIVA As Single = 0.13

Quizá te preguntes por que declarar la constante anterior, si puedes usar su valor 0.13 y sabes que
no va a cambiar, bueno hay dos razones muy importantes por las que debes usar constantes en lugar
de los valores:
Para el caso anterior 0.13 es el factor para el IVA (un impuesto) y cuando estas leyendo el código de
tu macro es más fácil de entender cuando usas constantes mira estos dos ejemplos idénticos y piensa
cual es más legible:

https://excel.facilparami.com
Introducción a la programación 22

1 impuesto = precio * 0.13


2
3 impuesto = precio * FactorIVA

La segunda razón es porque, si bien es cierto que el valor de la constante no va a cambiar durante
toda la ejecución de tu macro, si puede darse el caso en que debes actualizar su valor, por ejemplo,
ahora el valor del impuesto (IVA) es del 13%, pero que pasaría si el gobierno decide subirlo a 15%,
en ese caso tendrías que leer todo tu código y evaluar si ese 0.13 se refiere al impuesto y si es así,
entonces cambiarlo en todas las líneas de código en los que lo has usado, pero si decidiste utilizar
una constante, solo debes modificar su valor y ya tienes todo arreglado.
Posiblemente también te preguntas, ¿por qué necesito la constante, si puedo hacer todo lo anterior
usando una variable?, la respuesta es sencilla, las constantes existen para evitar que por error
modifiques su valor en algún momento del programa. Como vimos puedes asignar un valor a una
constate en tu código, pero si intentas asignar un valor a una constante ya definida, veras un error
de compilación al intentar ejecutar tu macro.

Error al modificar una constante

Compilación es un proceso en el cual el código que escribes se traduce a código que la


computadora pueda entender y ejecutar.

Que son los arreglos


Un arreglo o array es un tipo especial de variable, que puede contener múltiples valores. Puedes
acceder a todo el conjunto de valores o a un valor individual al especificar su índice, también puedes
agregar o eliminar más valores al arreglo.
Puedes ver los arreglos como una lista de cosas, por ejemplo, una lista del supermercado, en la que
puedes agregar más cosas que deseas o borrar algo que ya no quieres, también puedes leer la lista de
forma secuencial, es decir, del primer ítem, hasta el último, o puedes consultar: “Cual es el primer
producto en mi lista” y leer solo ese, por que has dado su índice (el primero en la lista).

https://excel.facilparami.com
Introducción a la programación 23

Como declarar un arreglo


A diferencia de una variable normal, los arreglos siempre deben de ser declarados, otra regla que
debes de seguir es que debes declarar la cantidad de elementos que piensas almacenar. Para tener
todo más claro veamos un ejemplo de cómo declarar un arreglo con 25 ítems.

1 Dim ListaSupermercado(1 To 25) As String

Como vemos, el tamaño se declara 1 to 25 entre paréntesis, con eso indicamos que el índice va
desde 1 hasta 25.

Trabajar con los valores del arreglo


Ahora para asignar un valor a un arreglo, debemos hacer referencia a él, por su índice y luego asignar
su valor como se hace con cualquier otra variable.

1 Dim ListaSupermercado(1 To 25) As String


2 'Asignar un valor al indice #1
3 ListaSupermercado(1) = "Pollo"

Si declaraste un arreglo de 25 posiciones y tratas de utilizar un índice que no existe, por ejemplo, el
26, obtendrás un error como este:

Error en índice del arreglo

Si no conoces la cantidad de posiciones que vas a necesitar, puedes declarar un arreglo dinámico
sin detallar la cantidad de posiciones y luego redimensionarlo con la sentencia ReDim, aquí hay un
ejemplo:

https://excel.facilparami.com
Introducción a la programación 24

1 Sub Arreglos()
2
3 'Arreglo dinamico, no detallamos la cantidad de posiciones
4 Dim ListaSupermercado() As String
5
6 'Asignamos una cantidad inicial
7 ReDim ListaSupermercado(1 To 1)
8
9 ListaSupermercado(1) = "Pollo"
10
11 'Ahora lo cambiamos a 2 posiciones, pero usamos
12 'la palabra Preserve para no perder los datos
13 'que ya teniamos
14 ReDim Preserve ListaSupermercado(1 To 2)
15 ListaSupermercado(2) = "Queso"
16
17 MsgBox ListaSupermercado(1) & " y " & ListaSupermercado(2)
18
19 End Sub

Ahora puedes cambiar en cualquier momento la cantidad de elementos, pero ahora es más difícil
saber si estás haciendo referencia a un elemento que no existe, pero esto se puede solucionar con las
funciones LBound y UBound, las cuales regresan el índice inferior y superior, respectivamente. Veamos
de nuevo unos ejemplos:

1 Sub Arreglos()
2
3 'Arreglo dinamico, no detallamos la cantidad de posiciones
4 Dim ListaSupermercado() As String
5 Dim indice As Integer
6
7 'Asignamos una cantidad inicial
8 ReDim ListaSupermercado(1 To 2)
9
10 ListaSupermercado(1) = "Pollo"
11 ListaSupermercado(2) = "Queso"
12
13 'Obtener el indice inferior y superior para recorrer el arreglo
14 For indice = LBound(ListaSupermercado) To UBound(ListaSupermercado)
15 MsgBox ListaSupermercado(indice)
16 Next indice
17
18 End Sub

https://excel.facilparami.com
Introducción a la programación 25

También puedes usar estas funciones para obtener el primer y el último elemento de un arreglo o
para validar si el arreglo tiene un índice, antes de intentar leerlo.

Decisiones y operadores lógicos


Los programas deben de tomar decisiones y ejecutar un bloque de código u otro dependiendo de la
información que estén procesando. Las personas hacemos eso todo el tiempo, por ejemplo, si vas a
tomar un café, lo pruebas y tomas una decisión, si está muy caliente, esperas a que se enfríe, si no
entonces sigues tomando.
La forma de tomar decisiones es con bloques if, la estructura más general es la siguiente:

1 If evaluación Then
2 'Bloque de codigo si la condicion es cierta
3 Else
4 'Bloque de codigo si la condicion es falsa
5 End If

La evaluación debe ser una expresión que regrese falso o verdadero, la palabra else separa los
bloques de código que se ejecuta cuando la evaluación es verdadera o falsa y las palabras End If
marcan el fin de la decisión. Esto se verá mejor con un ejemplo, abre un archivo de Excel para crear
y ejecutar esta macro:

1 Sub decisiones()
2
3 Dim edad As Integer
4
5 edad = 15
6 If edad >= 18 Then
7 MsgBox "Ya eres mayor de Edad"
8 Else
9 MsgBox "Eres menor de edad"
10 End If
11
12 End Sub

En la macro anterior la decisión consiste en evaluar si la edad es mayor o igual a 18, luego usamos
la función MsgBox de VBA para mostrar un mensaje en la pantalla. Intenta cambiar el valor de la
variable edad para ver cómo se comporta.
En el código anterior usamos el signo >=, esta es una comparación entre dos valores. Las compara-
ciones que puedes hacer son:

https://excel.facilparami.com
Introducción a la programación 26

Operador Resultado
= Verdadero, si ambos valores son iguales, sino regresa Falso
<> Verdadero, si ambos valores son diferentes, sino regresa Falso
> Verdadero, si el primer valor es mayor que el segundo, sino regresa Falso
< Verdadero, si el primer valor es menor que el segundo, sino regresa Falso
>= Verdadero, si el primer valor es mayor o igual que el segundo, sino
regresa Falso
<= Verdadero, si el primer valor es menor o igual que el segundo, sino
regresa Falso

Tanto en la vida como en las macros, las decisiones no siempre son sencillas, puedes necesitar hacer
más de una evaluación y para esto necesitas operadores lógicos para unir todas las evaluaciones que
necesites.
Por ejemplo, si vas a aplicar un descuento especial y necesitas que la cantidad que compren sea
mayor a 10 unidades y que además el cliente sea de categoría “vip” entonces necesitas un operador
lógico para unir ambas condiciones. Veamos un ejemplo:

1 Sub OperadoresLogicos()
2 Dim categoria As String
3 Dim cantidad As Single
4 Dim precio As Currency
5
6 cantidad = 10
7 categoria = "vip"
8 precio = 100
9
10 'Evaluar descuento
11 If cantidad >= 10 And categoria = "vip" Then
12 'Aplicar 30% de descuento
13 precio = precio * 0.7
14 MsgBox "El nuevo precio es " & precio
15 End If
16 End Sub

Si buscas la sentencia (bloque de código) if veras que hay dos comparaciones unidas por una palabra
And, esta es un operador lógico. Intenta cambiar los valores de las variables cantidad y categoria
para ver si aplica el descuento.
En total existen 3 operadores lógicos los cuales son: And, Or y Not.
El operador And trabaja sobre dos expresiones a su izquierda y derecha y si ambas expresiones son
verdaderas entonces regresa verdadero, pero si cualquiera de las dos es falso, entonces regresa falso.
El operador Or también trabaja sobre dos expresiones a su izquierda y derecha y si cualquiera
de las expresiones es verdadero entonces regresa verdadero y regresa falso únicamente si ambas
expresiones son falsas.

https://excel.facilparami.com
Introducción a la programación 27

El operador Not trabaja solamente sobre la expresión a su derecha, lo que hace es invertirla o negarla,
por ejemplo, si la expresión es falsa, entonces regresa verdadero y si la expresión es verdadera
entonces regresa falso.
Veamos una tabla con algunos ejemplos:

Expresión Resultado
1 = 1 And 1=2 Falso (el primero bloque es cierto, pero el segundo es falso entonces
todo es falso)
1 = 1 And 2=2 Verdadero (ambas expresiones son verdaderas)
1 = 1 Or 1 = 2 Verdadero (la primera expresión es verdadera, entonces no importa
el resultado de la segunda)
1 = 2 Or 2 = 2 Verdadero (la segunda expresión es verdadera, entonces no importa
el resultado de la primera)
1 = 2 Or 2 = 1 Falso (Ambas expresiones son falsas)
Not 1 = 1 Falso (La expresión es verdadera, pero esta negada)
Not 1 = 2 Verdadero (La expresión es falsa, pero esta negada)

Cuando usamos una expresión if, la parte del else es opcional y también debes de saber que puedes
anidar sentencias if, para comprender mejor esto, veamos un ejemplo:

1 Sub OperadoresLogicos()
2 Dim categoria As String
3 Dim cantidad As Single
4 Dim precio As Currency
5
6 cantidad = 10
7 categoria = "vip"
8 precio = 100
9
10 'Evaluar descuento
11 If cantidad >= 10 Then
12 'If anidado: es un if dentro de otro if
13 If categoria = "vip" Then
14 'Aplicar 30% de descuento
15 precio = precio * 0.7
16 MsgBox "El nuevo precio es " & precio
17 End If
18 End If
19 End Sub

El if anidado es un bloque if, dentro de otro bloque if, puedes utilizarlo para tomar decisiones más
complicadas, sin embargo, anidar muchos if puede generar código difícil de leer. Para evitar este
problema existe otra sentencia llamada Select Case, en ella se evalúan varias condiciones y se
puede ejecutar un bloque de código por cada evaluación.

https://excel.facilparami.com
Introducción a la programación 28

Para comprender mejor cuando usar una sentencia if o Select Case veamos una misma macro en
las dos versiones. Imagina que te piden una macro para determinar el descuento que aplica a un
producto en base a la cantidad que compran aplicando estos criterios:

• Si la cantidad esta entre 0 y 20 no hay descuento


• Si la cantidad es mayor que 20 el descuento es de 10%
• Si la cantidad es mayor que 30 el descuento es de 15%
• Si la cantidad es mayor que 40 el descuento es de 20%
• Si la cantidad es mayor que 50 el descuento es de 25%

La macro usando if que resuelve este problema es la siguiente (como siempre debes crear y probarla
en tu computadora)

1 Sub DescuentoIf()
2 Dim cantidad As Single
3 Dim descuento As Single
4 cantidad = InputBox("Ingrese cantidad")
5
6
7 If cantidad > 50 Then
8 descuento = 25
9 Else
10 If cantidad > 40 Then
11 descuento = 20
12 Else
13 If cantidad > 30 Then
14 descuento = 15
15 Else
16 If cantidad > 20 Then
17 descuento = 10
18 End If
19 End If
20 End If
21 End If
22
23 MsgBox "El descuento es de " & descuento & "%"
24 End Sub

Como puedes observar, tantos if anidados puede ser algo confuso. También debes notar que he
introducido la función InputBox que permite preguntar al usuario un valor y guardarlo en una
variable, esto hará que sea más fácil probar esta macro. Después de probar esta macro intenta probar
la versión Select Case y verás que el resultado es el mismo, pero el código es más limpio y fácil de
entender.

https://excel.facilparami.com
Introducción a la programación 29

1 Sub DescuentoSelectCase()
2 Dim cantidad As Single
3 Dim descuento As Single
4 cantidad = InputBox("Ingrese cantidad")
5
6 Select Case cantidad
7 Case 0 To 20
8 descuento = 0
9 Case 21 To 30
10 descuento = 10
11 Case 31 To 40
12 descuento = 15
13 Case 41 To 50
14 descuento = 20
15 Case Else
16 descuento = 25
17 End Select
18
19 MsgBox "El descuento es de " & descuento & "%"
20 End Sub

Posiblemente ya descifraste la forma de usar la sentencia Select Case, pero si no lo has hecho, voy
a explicar con mayor detalle cómo se usa. Todo el bloque se define entre las palabras Select Case
Variable y finalizan con End Select, luego hay una o más sentencias Case con una expresión y su
respectivo bloque de código. Existe un caso Else que es el que se ejecuta si ninguno de los casos
anteriores fue ejecutado.
Como ya habrás notado, la sentencia Select Case es un poco más compleja que la sentencia if,
pero más fácil de leer cuando hay varias posibles opciones a una decisión. Pero la mejor forma de
dominar esta sentencia es por medio de algunos ejemplos prácticos, afortunadamente puedes leer
algunos en este artículo⁴.

Operaciones con variables


Trabajar con Excel es (la mayoría de las veces) realizar cálculos y para ello necesitas realizar sumas,
restas, etc. En esta tabla tenemos una lista de los operadores disponibles:

⁴https://excel.facilparami.com/2019/04/ejemplos-practicos-de-la-sentencia-select-case

https://excel.facilparami.com
Introducción a la programación 30

Operador Descripción
+ Suma
* Multiplicación
/ División
- Resta
^ Exponenciación
\ División entera (regresa solo la parte entera, sin decimales)
Mod Regresa el residuo de una división, por ejemplo 5 mod 2 = 1
& Concatenar dos cadenas de texto (unir dos textos)

Ya hemos utilizado algunos de estos operadores de los ejemplos anteriores, pero tener esta lista te
servirá como referencia.

Qué son los ciclos


Los ciclos son repeticiones de un bloque de código, regresando al ejemplo de las decisiones, cuando
te sirven una taza de café, primero lo pruebas si está muy caliente esperas un rato y lo vuelves a
probar, repites este paso de probar y decidir hasta que la temperatura sea de tu agrado para tomar
tu café.
Lo mismo sucede con los programas, un bloque de código puede necesitar repetirse un numero
conocido o desconocido de veces.
El ciclo for se usa cuando conoces la cantidad de veces que necesitas repetir el bloque de código, la
sintaxis (estructura) del bloque for es:

1 for variable = valorInicial to valorFinal Step 1


2 'Ejecutar codigo
3 Next variable

Debes declarar una variable que se usará como contador, luego defines un valor inicial y un valor
final, opcionalmente puedes definir el valor del incremento con la instrucción Step que de forma
predeterminada es 1, si piensas hacer incrementos de 1 puedes no usarla.
El ciclo funcionará así: si la variable tiene un valor inicial de 1, un valor final de 5 y un incremento
(step) de 1, entonces la primera vez que se ejecuta la variable contiene un 1, la segunda vez la variable
se incrementa a 2, luego a 3, luego a 4 y finalmente se incrementa a 5 y es la última vez que se ejecuta
el bloque de código.
Por ejemplo, imagina que debes generar una hoja de Excel que contiene el número de filas en la
columna A, y que inicia desde la celda A2, entonces la celda A2 tendrá 1, la celda A3 tendrá 2 y así
sucesivamente hasta llegar a 10. Entonces el código para hacer eso sería este:

https://excel.facilparami.com
Introducción a la programación 31

1 Sub CicloFor()
2 Dim fila As Integer
3
4 For fila = 1 To 10
5 Range("A" & fila + 1) = fila
6 Next fila
7
8 End Sub

La función Range se puede usar para hacer referencia a una celda de la hoja actual, recibe como
parámetro el nombre de la celda por ejemplo A1 pero como sabemos que es la columna A, pero
desconocemos el número de la fila, entonces usamos una concatenación de la A y el contenido de la
variable fila + 1 y le asignamos el contenido de la variable fila que en cada ciclo contendrá 1, 2,
3…10
El ciclo Do While ejecuta un bloque de código durante un número desconocido de veces, se hace
mientras se cumpla la condición que definimos, por ejemplo, mientras el café este muy caliente. La
sintaxis de este ciclo es:

1 Do While Condicion
2 ' Bloque de codigo
3 Loop

Como vemos, se colocan las palabras Do While seguidas de una condición y se cierra el bloque de
código con una palabra Loop. El bloque de código va a ejecutarse mientras la condición sea verdadera.
Usamos este ciclo en la macro que creamos al inicio del capítulo, aquí está de nuevo para que la
recuerdes:

1 Sub calcula_precios()
2
3 Dim costo
4 Dim fila As Integer
5
6 'Coloca encabcezado
7 Range("D1").FormulaR1C1 = "Precio"
8
9 'Recorrer todas las filas
10 fila = 2
11 costo = Range("C" & fila).FormulaR1C1
12 Do While IsNumeric(costo) 'Procesar mientras el costo sea un numero
13 'Calcular el precio
14 Range("D" & fila).FormulaR1C1 = costo * 1.3
15

https://excel.facilparami.com
Introducción a la programación 32

16 'Pasar a las siguiente fila y leer el costo


17 fila = fila + 1
18 costo = Range("C" & fila).FormulaR1C1
19 Loop
20 End Sub

Creamos una variable llamada costo con el contenido de la celda que corresponde la fila que
estamos procesando, luego usamos la función IsNumeric para preguntar si su valor es un número,
así sabremos si ya hemos terminado, porque no encontrará un número, sino una celda vacía cuando
termine de procesar todas las filas con datos.
También debes notar que ahora usamos Range("C" & fila).FormulaR1C1 en lugar de solo Range("C"
& fila), hacemos esto para poder usar la función IsNumeric ya que Range("C" & fila) convertirá
el valor vacío a un cero y entonces IsNumeric siempre va a regresar Verdadero. FormulaR1C1 regresa
el contenido de la celda sin hacer ninguna conversión.
Hay algo muy importante que debes conocer, como ves este ciclo se repite un valor indefinido de
veces y al final de este ciclo, he actualizado el valor de la variable costo, con el contenido de la
siguiente fila, si no hago esto entonces la comparación que hace el ciclo no va a cambiar nunca y el
resultado será siempre verdadero, no habrá forma de terminar el ciclo y esto se conoce como ciclo
infinito, tu computadora quedara atrapada en un ciclo sin fin hasta que reinicies tu computadora o
termines el proceso con el administrador de tareas.
También existen algunas variantes de este ciclo y son las siguientes:
Repetir mientras la condición sea falsa, se termina si la condición es verdadera.

1 Do Until Condicion
2 'Bloque de Codigo
3 Loop

Repetir al menos una vez sin importar la condición, y luego repetir mientras la condición sea
verdadera.

1 Do
2 'Bloque de Codigo
3 Loop While Condicion

Repetir al menos una vez sin importar la condición, y luego repetir mientras la condición sea falsa.

1 Do
2 'Bloque de Codigo
3 Loop Until Condicion

https://excel.facilparami.com
Introducción a la programación 33

Ejercicio
El ejercicio de este capítulo es sencillo, con la macro que creamos al inicio y con lo que has aprendido
trata de hacer algunas modificaciones, por ejemplo:

1. Cambia el factor de 1.3 a 1.25


2. Cambia el titulo Precio, por Precio Unitario
3. Agrega más filas de productos y mira que pasa
4. Cambia el ciclo Do While por un ciclo For y revisa si todo sigue funcionando.

Interactuando con Excel


En este capítulo aprenderás las bases para trabajar con las hojas de cálculo de Excel, podrás entender
los objetos de Excel, sus eventos y como acceder a los libros, hojas y celdas.

¿Que son los objetos y clases?


Excel fue desarrollado usando programación orientada a objetos, esto significa que utiliza objetos
para trabajar con las celdas, hojas y libros. Ahora debes estarte preguntando que son estos objetos,
así que voy a definir esto para que no tengas ninguna duda.
En la programación orientada a objetos se usan clases y objetos, la clase contiene una definición
general del objeto, en esta definición hay métodos, eventos y propiedades. Los métodos realizan
un proceso y las propiedades contienen información sobre el objeto, los eventos son señales que se
envían cuando ocurre algo previamente definido. Pero veamos una analogía de la vida real, digamos
que tenemos una clase que se llama vehículo, que describe de forma general un vehículo, entonces
tiene estos métodos:

1. Encender vehículo, esto realiza un proceso, envía gasolina al motor, y todo lo demás que se
necesita para encender el motor.
2. Acelerar, esto incrementa la velocidad
3. Frenar, esto disminuye la velocidad
4. Apagar vehículo, detiene el motor.

Y también tiene estas propiedades:

1. Estado del motor (puede ser encendido o apagado)


2. Velocidad del vehículo

Algunos eventos podrían ser:

https://excel.facilparami.com
Introducción a la programación 34

1. Motor sobre calentado: Envía señal informando que el motor está muy caliente.
2. Gasolina a nivel mínimo: Envía señal informando que la gasolina está por terminarse.

Esa fue la clase vehículo, entonces cuando quieres crear un vehículo en específico por ejemplo un
Mazda3, lo declaras como un objeto de la clase vehículo (como cuando declaras una variable) y este
obtiene toda la definición de la clase, puedes consultar su velocidad actual, acelerarlo, frenarlo y
apagarlo.
Ahora veamos cómo se aplica esto a Excel, existe una clase llamada Workbook (en español seria
Libro, es decir un archivo de Excel) y cada vez que se crea o se abre un archivo de Excel se crea un
objeto con la definición de esa clase. Este objeto va a tener muchos métodos, propiedades y eventos,
pero voy a mencionar solo un ejemplo de cada uno.

• Método Save: Guarda el libro, este método se usa cuando presionas el botón guardar.
• Propiedad Sheets: Guarda una referencia a todas las hojas de este libro, en este caso cada hoja
es otro objeto, entonces un objeto puede contener más objetos almacenados como propiedades.
• Evento BeforeSave: Este evento te avisa que el libro está a punto de ser guardado, usualmente
usamos este evento para validar que todo esté bien antes de guardar o para guardar información
adicional antes de guardar.

Objetos de Excel
Ahora que ya sabes que son los objetos, es hora de conocer los objetos más importantes para trabajar
con macros en Excel.

Application
Este objeto representa la aplicación de Excel, desde aquí puedes acceder a todo, a los libros, las
hojas de cada libro, las celdas y todo su contenido. Para nuestra conveniencia hay algunos objetos
que se puede acceder directamente sin hacer referencia a este objeto, aunque todos estén dentro de
este objeto Application, sin embargo, hay algunas opciones de configuración que solo puede ser
utilizadas desde aquí.

Workbooks
Es en realidad una colección de objetos, aquí se encuentran todos los objetos Workbook, los cuales
a su vez representan un libro o archivo de Excel. Desde aquí puedes acceder a todos los libros que
están abiertos y crear o abrir otros.

https://excel.facilparami.com
Introducción a la programación 35

Sheets
Se encuentra dentro de un objeto Workbook y es una colección que contiene todas las hojas del
libro al que pertenece, desde cada hoja individual puedes acceder a todo lo relacionado ella, como
su nombre y celdas, Además desde esta colección puedes crear, eliminar o modificar las hojas del
libro.

Range
Ya usamos anteriormente este objeto, y puede representar una celda individual o un rango de celdas
el cual puede abarcar todas las celdas de la hoja a la que pertenece.
Para dejar todo más claro aquí hay una imagen con la jerarquía de cómo están organizados todos
estos objetos.

Representación de objetos en Excel

## Referencias a objetos
La forma larga para acceder a cada objeto es a través de la jerarquía que vimos anteriormente, por
ejemplo, para acceder a la celda A1 de la primera hoja, del primer libro abierto seria esta:

1 Application.Workbooks(1).Sheets(1).Range("A1")

https://excel.facilparami.com
Introducción a la programación 36

Como Workbooks es una colección de libros, debemos decir entre paréntesis, a cuál libro queremos
referenciar, y lo hacemos por el número de 1 a n, o también por su nombre, aunque lo más probable
es que no vamos a conocer el nombre del libro. Lo mismo ocurre con el objeto Sheets.
La buena noticia es que existen referencias o atajos para no tener que escribir tanto para llegar al
objeto que necesitamos, las referencias a objetos más utilizadas son:

• ActiveWorkbook: Hace referencia al libro con el que estás trabajando actualmente.


• ActiveSheet: Hace referencia a la hoja en la que estás trabajando.
• ActiveCell: Hace referencia a la celda en la que estás trabajando.
• Range: Si no escribes su ruta completa, asume que estás trabajando en la hoja actual, es lo
mismo que decir ActiveSheet.Range

Eventos de Excel
Hasta ahora ya sabes cómo ejecutar una macro manualmente y como lo mencione antes, los eventos
de un objeto envían un mensaje de que algo ha ocurrido. Lo que debes de saber ahora es que el
evento también te permite ejecutar una macro o cualquier código de VBA de forma automática en
respuesta a ese evento.
Básicamente hay dos tipos de eventos: los eventos de libros (Workbook) y los eventos de hojas
(Worksheet), cada uno tiene varios eventos, aunque lo más probable es que nunca llegues a usar
más de 5 eventos, es bueno que los conozcas todos, porque nunca sabes cuándo podrían serte útil.

Eventos más usados en Libros

Evento Cuando se ejecuta


Activate El libro es activado, por ejemplo, estabas en otra ventaja y
regresa al libro de Excel
AddinInstall Cuando instalas un complemento
AddinUninstall Cuando desinstalas un complemento
BeforeClose Justo antes de cerrar el libro
BeforePrint Justo antes de imprimir
BeforeSave Justo antes de guardar
Deactivate Cuando cambias a otro libro u otro programa que no sea
Excel
NewSheet Creas una nueva hoja
Open Cuando abres el libro
SheetActivate Cuando cambias de hoja
SheetBeforeDoubleClick Antes de dar doble clic sobre una celda
SheetBeforeRightClick Antes de dar clic derecho en una celda
SheetCalculate Cuando la hoja calcula las formulas
SheetChange Cuando escribes algo en una celda
SheetDeactivate Cuando dejas de usar una hoja, porque cambias a otra

https://excel.facilparami.com
Introducción a la programación 37

Evento Cuando se ejecuta


SheetFollowHyperlink Cuando haces clic sobre un enlace
SheetSelectionChange Cuando cambias la selección de celdas
WindowActivate Cuando cambias de libro
WindowDeactivate Cuando dejas de usar un libro, porque cambias a otro
WindowResize Cuando la ventana o pantalla en que estás viendo un
libro, cambia de tamaño.

Eventos más usados en hojas

Evento Cuando se ejecuta


Activate Cuando cambias de hoja
BeforeDoubleClick Antes de hacer doble clic sobre una celda
BeforeRightClick Antes de hacer clic derecho sobre una celda
Calculate Cuando la hoja calcula las formulas
Change Cuando el contenido de una celda cambia
Deactivate Cuando cambias de hoja
FollowHyperlink Haces clic en un enlace
SelectionChange Cuando cambias la selección de celdas

Como acceder a los eventos


Para ingresar código en estos eventos, primero debes ir al editor de VBA, luego haces doble clic ya
sea en cualquier hoja de las que están en la ventana de proyecto (a la izquierda) o en ThisWorkbook
(dependiendo de si deseas trabajar con un evento de hoja o libro, respectivamente). Luego en parte
central en donde escribes el código selecciona de la lista desplegable Workbook o Worksheet, y en
la lista que está a la par, seleccionas el evento con el que deseas trabajar, tal y como se muestra en
esta imagen:

https://excel.facilparami.com
Introducción a la programación 38

Agregar un evento

Al hacer eso, Excel va a generar una plantilla para el evento como esta:

1 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)


2
3 End Sub

En este caso hay algunos parámetros entre paréntesis, puedes notar que el primero inicia con ByVal,
eso significa que puedes hacer uso de lectura de ese parámetro (ByVal significa por valor), el segundo
parámetro no tiene esa palabra, eso significa que tienes acceso total y puedes leerla y modificarla.
Entonces vamos a modificar ese parámetro Cancel, si lo hacemos igual a True, entonces el proceso
se cancela y Excel no va a guardar el documento, esto puede ser útil para realizar alguna validación.
Validemos que la celda A1 deba tener algún valor antes de guardar, escribiendo este código:

1 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)


2 If Range("A1").FormulaR1C1 = "" Then
3 MsgBox "Antes de guardar debe ingresar un valor valido, en la celda A1"
4 Cancel = True
5 End If
6 End Sub

Si tienes algún problema para crear la macro, puedes descargarla haciendo clic aquí⁵. Para probarla
debes borrar el valor en la celda A1 e intentar guardar los cambios.
⁵https://my.pcloud.com/publink/show?code=XZc8iE7ZsBUoilhT0UyjDe8C9inQqm5VkyAX

https://excel.facilparami.com
Introducción a la programación 39

Ejemplo practico
Ya tenemos bastante teoría hasta ahora, ya es tiempo de ver cómo aplicar todo esto mediante un
ejemplo. Imagina que tienes un libro de Excel con 3 listas de precios: Clientes regulares, Clientes al
mayoreo y Clientes VIP. Cada lista de precios está en una hoja diferente, pero en el mismo libro y si
un cliente te solicita la lista de precios no puedes enviarle las 3 listas, además la lista contiene una
columna de costo y no quieres que el cliente conozca tus costos, pero si tus precios.

Puedes descargar una hoja con la macro ya hecha para que puedas probarla, haciendo clic
en este enlace⁶

Estos son los problemas que necesitas solucionar:

1. Debes generar un archivo por cada lista de precios (cada hoja en el libro.)
2. Pedir al usuario en donde guardar los libros nuevos.
3. Debes eliminar la columna de costo, pero solo en el archivo que vas a enviar, sin afectar tu
archivo, por que tú si necesitas el costo.

Primero vamos a necesitar una macro para poder solicitar al usuario en que carpeta guardar los
archivos nuevos, para esto vamos a usar una macro genérica que podremos reutilizar en otros
proyectos.

1 ' Pedir a usuario que seleccione una carpeta


2 Function SolicitarCarpeta() As String
3 Dim dialogoArchivo As FileDialog
4 Set dialogoArchivo = Application.FileDialog(msoFileDialogFolderPicker)
5
6 dialogoArchivo.Title = "Select a Folder"
7 dialogoArchivo.AllowMultiSelect = False
8 dialogoArchivo.InitialFileName = Application.DefaultFilePath
9 If dialogoArchivo.Show <> -1 Then
10 SolicitarCarpeta = ""
11 Else
12 SolicitarCarpeta = dialogoArchivo.SelectedItems(1)
13 End If
14
15 End Function

Ahora vamos a crear la macro que haga el resto del trabajo, el código es el siguiente:

⁶https://my.pcloud.com/publink/show?code=XZNO7O7ZDo7kOteNyVbcpxdJymoktphcqsKy

https://excel.facilparami.com
Introducción a la programación 40

1 'Genera un archivo por cada hoja en este libro


2 Sub GeneraArchivosPrecios()
3 Dim carpeta As String
4 Dim i As Integer
5 Dim LibroNuevo As Workbook
6 Dim LibroActual As Workbook
7
8 'Preguntar en que carpeta colocar este archivo
9 carpeta = SolicitarCarpeta
10
11 If carpeta = "" Then
12 MsgBox "No selecciono la carpeta en donde se guardaran los archivos"
13 Else
14 Set LibroActual = ActiveWorkbook
15
16 'Se deshabilita la actualizacion de la pantalla
17 'para evitar ver un parpadeo en la pantalla
18 Application.ScreenUpdating = False
19 For i = 1 To LibroActual.Sheets.Count
20 'creamos un libro nuevo.....
21 Set LibroNuevo = Workbooks.Add
22
23 'Hacemos la copia de toda la hoja en el nuevo libro
24 LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1)
25
26 'Eliminar columna de costo (C)
27 LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete
28
29 'Guardar libro en la carpeta definida y con el nombre de la hoja
30 LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name
31
32 'Cerrar el libro
33 LibroNuevo.Close
34 Next i
35 'Habilitar de nuevo la actualizacion de pantalla
36 Application.ScreenUpdating = true
37 End If
38
39 End Sub

En el código anterior, primero declaramos algunas variables, en las que LibroNuevo y LibroActual
son de la clase Workbook, en ese caso van a ser objetos y para asignar objetos no es suficiente utilizar
el signo = también tienes que anteponer la palabra let tal y como se ve en la línea:

https://excel.facilparami.com
Introducción a la programación 41

1 Set LibroActual = ActiveWorkbook

La macro es realmente sencilla, pero los más probable es que te estés preguntando, como harías para
saber que métodos o propiedades utilizar si quisieras hacer otra cosa, por ejemplo, imprimir una
hoja.
Con el tiempo y la práctica vas a conocer muy bien todos estos objetos, pero para comenzar puedes
usar la documentación, para acceder a ella, desde el editor de VBA presionas la tecla F2 y veras una
pantalla como esta:

Examinador de objetos

En la parte izquierda se encuentra una lista de todas las clases (yo use la clase Sheets para acceder a
las hojas) y cuando seleccionas una clase, en la parte derecha puedes ver la lista de propiedades (las
que tienen un icono con una mano) y métodos (los que tienen un icono con un rectángulo verde).
Si tienes dudas de cómo usar algún método, puedes hacer clic derecho y seleccionara Ayuda del
menú contextual. Eso te llevara a una página web como ésta, con más detalle:

https://excel.facilparami.com
Introducción a la programación 42

Ayuda de clases

Ejercicio
En el capítulo 3 hicimos una macro que calculaba el precio en base a un costo, modifica esa macro
para que además de generar la columna de precios, también genere dos hojas más, en ese mismo
archivo con diferentes precios basados en márgenes de 30%, 25% y 20%.

https://excel.facilparami.com
Extendiendo Excel
Ahora que ya tienes conocimientos más profundos sobre VBA y los objetos de Excel, es hora de
extender un poco a Excel y agregar algunas cosas que nos ayuden a trabajar más rápido, como
empaquetar algunos cálculos que realices con frecuencia y convertirlos en funciones o ir un poco
más allá y convertir macros en complementos de Excel que puedas usar en todas las hojas de Excel.

Crea tus propias funciones


Posiblemente la función Suma de Excel sea la función más utilizada por todos, pero en tu caso
particular podría haber fórmulas o cálculos que uses con frecuencia, por ejemplo, el cálculo de precio
en base a un costo y luego agregar el impuesto de ventas.
Vamos a una función que haga eso, va a recibir un valor (el costo) y a hacer el cálculo del precio
final, crea un archivo de Excel y agrega un módulo y este código:

1 Function calculaPrecio(costo As Currency)


2 Dim precio As Currency
3
4 'Agregar 30% de margen
5 precio = costo * 1.3
6
7 'Agregar 13% de IVA (Impuesto de ventas)
8 precio = precio * 1.13
9
10 'El mismo nombre de la funcion tambien funciona como
11 'variable en donde se asigna el valor a devolver
12 calculaPrecio = precio
13 End Function

Ahora si regresamos a la hoja de Excel, podemos seleccionar una celda y hacer clic sobre el botón
para insertar una función. En el cuadro de diálogo que aparezca podemos seleccionar la categoría
Definida por el usuario y luego se nos presenta la lista de funciones disponibles. Podemos
seleccionar la que acabamos de crear y utilizarla para calcular el precio (la función recibe un único
parámetro y es el costo)
Extendiendo Excel 44

Función definida por el usuario

Entonces para crear tus propias funciones, solo debes crear una función en VBA que reciba los
parámetros que necesites y que regrese un valor, ese valor que regrese será el valor que se muestre
en la celda que uses.
Ahora hay algunos problemas que debemos resolver, tú conoces muy bien la fórmula que creaste y
sabes para que sirve y que parámetros usas, pero otras personas no lo saben y es por eso que debes
agregar descripciones a la función y a sus parámetros.

https://excel.facilparami.com
Extendiendo Excel 45

Función sin descripciones

Agrega documentación a tus fórmulas


Para agregar las descripciones a la fórmula, vamos a utilizar el evento Open para el libro (Workbook).
Primero hacemos doble clic sobre ThisWorkbook en el panel de proyecto (a la izquierda), luego en
las listas desplegables elegimos Workbook y Open respectivamente. Esto creara una macro en blanco,
ahí debemos escribir el código para decirle a Excel las descripciones de nuestra función.

https://excel.facilparami.com
Extendiendo Excel 46

Descripción de funciones

Vamos a usar como ejemplo la función que ya creamos, sigue los pasos anteriores y la macro debe
de quedar de esta forma:

1 Private Sub Workbook_Open()


2 'Declarar un array para las descripciones de cada argumento
3 Dim Param(1 To 1) As String
4 'Asignar la descripcion
5 Param(1) = "Costo del producto"
6
7 'Registrar la descripcion de la macro y de los parametros
8 Application.MacroOptions Macro:="calculaPrecio", _
9 Description:="Calcula un precio en base a un costo y agrega el impuesto de venta\
10 s", _
11 ArgumentDescriptions:=Param
12 End Sub

Primero declaramos un arreglo, en este caso será de 1 a 1, porque solo hay un parámetro, luego
asignamos la descripción del parámetro al elemento 1 del arreglo. Finalmente usamos la función
Application.MacroOptions con 3 parámetros: (1) el nombre de la macro, (2) la descripción de la
macro y (3) el arreglo que contiene las descripciones de los parámetros.
Ahora, como esta macro se creó en el evento Open, deberás cerrar el libro y volver a abrirlo para
que tome los cambios o ejecutar el evento manualmente la primera vez.

Nota: VBA no tiene ningún signo que defina el fin de línea, como un punto o punto y
coma, entonces se entiende que la instrucción o sentencia termina cuando haces un salto
de línea, pero puedes escribir una sentencia en varias líneas si escribes un guion bajo
para indicar que la sentencia continua en la siguiente línea, tal y como lo hice en la macro
anterior. Esto hace que la macro sea más legible en los casos en que el código es demasiado
largo para verse completamente en la pantalla.

https://excel.facilparami.com
Extendiendo Excel 47

Veamos como seria ahora, si tuviéramos que registrar dos o más macros y con más de un parámetro.
La forma más ordenada seria creando una macro para generar las descripciones de cada macro y
luego llamarlas desde el evento Open de esta forma:

Descripción para varias funciones

Puedes descargar este ejemplo con las dos funciones haciendo clic aquí⁷.

Parámetros opcionales
En ocasiones podemos tener una función con parámetros opcionales, imaginemos una función para
aplicar un descuento que recibe el precio y el tipo de cliente. Dependiendo de si el tipo de cliente es
VIP o no, se aplicará un descuento diferente, si no se define un tipo de cliente entonces se aplica el
descuento mínimo que es 5%.
Para definir que el parámetro es opcional se antepone la palabra Optional al nombre del parámetro
y al final se puede definir un valor predeterminado, el cual se asigna automáticamente cuando
omitimos su valor al llamar a la función. Veamos la definición de los parámetros en este ejemplo:

⁷https://my.pcloud.com/publink/show?code=XZt1YO7ZLsiRr5DGnwRDr58Ha5su0RC4O3Ck

https://excel.facilparami.com
Extendiendo Excel 48

1 'Calcula un descuento de acuerdo al tipo de cliente


2 Function aplicaDescuento(precio As Currency, Optional tipoCliente As String = "regul\
3 ar")
4 Dim precioConDescuento As Currency
5
6 Select Case tipoCliente
7 Case "vip"
8 precioConDescuento = precio * 0.7
9 Case "silver"
10 precioConDescuento = precio * 0.9
11 Case Else
12 precioConDescuento = precio * 0.95
13 End Select
14
15 aplicaDescuento = precioConDescuento
16 End Function

Ahora, si usas esa función, verás que, si no defines el segundo parámetro, toma el valor predetermi-
nado y aplica el 5% de descuento.

Función con parámetros opcionales

https://excel.facilparami.com
Extendiendo Excel 49

Instalar y desinstalar complementos


Como abras notado, todas las macros que creas están disponibles únicamente cuando tienes abierto
el libro en donde las creaste, si el libro está cerrado, no hay forma de poder utilizar tus macros. Pero
esto se soluciona creando complementos.
Los complementos son programas que extienden o complementa las funcionalidades de Excel,
puedes crear complementos usando código de otros lenguajes de programación como Visual Basic
o C#, pero también puedes crearlos usando VBA y reutilizando las macros que ya creaste.
Veamos primero como instalar un complemento en tu Excel, imagina que haces facturas o recibos
en Excel y debes de escribir una cantidad en números y en letras, por ejemplo $130.00 en una celda
y CIENTO TREINTA CON 00/100 DOLARES en otra celda y piensas que sería bueno tener un
complemento que escriba la cantidad en letras en tu lugar, y de hecho existe uno en mis blogs:
https://excel.facilparami.com⁸. Para continuar el ejercicio descargar el complemento haciendo clic
aquí⁹.
Ahora en el menú Programador haces clic en la opción Complementos de Excel y en la ventana
que se mostrará, haces clic sobre el botón Examinar... y buscas y selecciones el complemento que
acabas de descargar y finalmente haces clic en el botón Aceptar.

Instalar complementos

⁸https://excel.facilparami.com
⁹https://my.pcloud.com/publink/show?code=XZlMxz7Zvw3VmJyECY4BOueWgSR9RJnlvLt7

https://excel.facilparami.com
Extendiendo Excel 50

Ahora tienes el complemento instalado, has ganado la función numletras y puedes usarla en
cualquier hoja de Excel.

Probar complemento

Nota: En ocasiones puede suceder que cuando cierras Excel y lo abres de nuevo, el
complemento desaparece o deja de funcionar, eso pasa por que la ubicación en donde
guardaste el complemento no es de confianza. Puedes solucionar eso siguiendo los pasos
que están en este articulo: Qué hacer si un complemento desaparece cada vez que cierras
Excel¹⁰

Si por alguna razón te cansas de un complemento y quieres desinstarlo puedes ir al menú


Programador y luego a Complementos de Excel y en la lista de complementos solo debes desmarcar
el cheque del complemento que ya no deseas y hacer clic en el botón Aceptar.
¹⁰https://excel.facilparami.com/2018/04/que-hacer-si-un-complemento-desaparece-cada-vez-que-cierras-excel/

https://excel.facilparami.com
Extendiendo Excel 51

desinstalar-complemento

Crea tus propios complementos


Ahora que has visto los complementos de Excel y lo que pueden hacer, es hora de crear tu propio
complemento. Esto es muy sencillo, solamente necesitas un archivo con macros en él. Vamos a tomar
como ejemplo el archivo que creamos con las funciones para calcular el precio y descuento.
Abres el archivo y le das guardar como... y te aseguras de elegir el tipo Complemento de Excel
(*.xlam) eso va a generar tu código como un complemento que puedes instalar en cualquier
computadora y dejar que tus macros estén disponibles, siempre.

https://excel.facilparami.com
Extendiendo Excel 52

Crear complemento

## Ejercicio
Toma la macro que hiciste en el ejercicio del capítulo 4 y convierte esa hoja en un complemento,
luego instala el complemento en tu Excel y prueba si funciona correctamente.

https://excel.facilparami.com
Corrigiendo Errores
Somos humanos y siempre cometemos errores, lo importante es que aprendemos de ellos y hacemos
lo posible por no repetirlos, entonces es de esperar que al inicio nuestras macros tengan muchos
errores, pero con el tiempo eso va a cambiar. Sin embargo, todo código escrito por humanos
podría contener errores y todos los lenguajes de programación nos proveen de herramientas para
minimizarlos.
En este capítulo voy a explicarte los tipos de errores que puedes esperar y como encontrarlos y
corregirlos.

Que tipos de errores podemos esperar


Cuando programamos, nuestro código puede tener 3 tipos de errores: de sintaxis, errores en tiempo
de ejecución y errores lógicos.

Errores de sintaxis
Estos errores son los más sencillos de detectar y corregir, ya que el mismo editor de VBA nos advierte
y no permite ejecutar la macro hasta que lo corregimos. Los errores de sintaxis se dan porque nos
hemos equivocado al usar alguna instrucción o no hemos seguido las reglas. Por ejemplo, observa
esta macro y trata de encontrar el error.

1 Sub TengoUnError()
2 Dim numero As Integer
3 If numero >= 0
4 'Hacer algo
5 End If
6 End Sub

La sintaxis de la instrucción if es:

1 If numero >= 0 then


2 'Hacer algo
3 End If

Entonces nos equivocamos al omitir la palabra then. Para evitar estos errores vamos a necesitar
obtener un conocimiento de las sentencias de VBA y eso solo nos lo puede dar la práctica, entre más
código escribas, mejor te volverás.
Corrigiendo Errores 54

Errores en tiempo de ejecución


Estos errores se dan por que el programa se encuentra con datos para los que no estaba preparado,
el ejemplo clásico de esto es la división entre cero, ninguna computadora puede realizar este cálculo
y por lo tanto genera un error.

División entre cero

Una forma de eliminar estos errores es validando los datos antes de usarlos, aquí está el código
anterior con su corrección:

1 Sub divisionEntreCero()
2 Dim precio As Currency
3 Dim cantidadPagos As Single
4 Dim cuota As Currency
5
6 precio = 125
7
8 If cantidadPagos > 0 Then
9 cuota = precio / cantidadPagos
10 Else
11 cuota = precio 'Todo en una sola cuota
12 End If
13
14 End Sub

En este caso resolvimos el error asignado un valor predeterminado para cuando la cantidad de pagos
sea cero, en otros casos no hay forma de asignar un valor predeterminado, entonces lo mejor es
detener la ejecución y emitir un mensaje de error.

https://excel.facilparami.com
Corrigiendo Errores 55

1 Sub divisionEntreCero()
2 Dim precio As Currency
3 Dim cantidadPagos As Single
4 Dim cuota As Currency
5
6 precio = 125
7
8 If cantidadPagos > 0 Then
9 cuota = precio / cantidadPagos
10
11 '... continuar con el codigo
12
13 Else
14 '... detener todo y emitir mensaje de error
15 MsgBox "Por favor defina una cantidad de pagos para continuar"
16 End If
17
18 End Sub

Los errores en tiempo de ejecución son difíciles de predecir, la mejor forma de evitarlos es realizando
pruebas del código con valores que no esperamos, por ejemplo, si tu macro calcula la edad de una
persona y solicita como parámetro la fecha de nacimiento, intenta enviarle una fecha futura como
12/12/2099 y mira cómo se comporta. En el mundo real nuestros programas no siempre obtienen
datos validos o los datos que esperan.

Errores lógicos
Estos son los errores más difíciles de detectar y corregir, se dan por que el programa ha implemento
un código equivocado, por ejemplo, imagina que debes calcular el margen de un producto y sabes
que la fórmula para eso es:

1 margen = ingresos - costos

Entonces si implementas esa fórmula, pero terminas con un código como este:

1 Function margen(ingresos As Currency, costos As Currency)


2 margen = costos - ingresos
3 End Function

No vas a obtener un error visible, simplemente un mal cálculo por haber invertido (por error) las
variables de la fórmula. Nuevamente, la única forma de detectar estos errores es probando tu código y
revisando si genera los resultados esperados. Una vez detectas que tu programa tiene errores lógicos,
lo que sigue es realizar un proceso de depuración.

https://excel.facilparami.com
Corrigiendo Errores 56

Como depurar código en el editor de VBA.


La depuración en programación es el proceso por el cual se detectan y corrigen errores en el código,
esto se hace usualmente ejecutando el código instrucción por instrucción y revisando los valores de
las variables.
Para comprender como es el proceso de depuración y las herramientas que tenemos disponibles,
vamos a tomar como ejemplo, una función que debe calcular un descuento. Imagina que te han
reportado que en ocasiones no calcula el descuento de forma correcta y los clientes se molestan,
entonces te han pedido que revises el código y resuelvas el problema. Como regla del negocio todos
los clientes vip tiene 30% de descuento, los clientes silver tienen un 15% y los demás tienen un 5%
de descuento. La función que debes revisar es esta:

1 'Calcula un descuento de acuerdo al tipo de cliente


2 Function aplicaDescuento(precio As Currency, _
3 Optional tipoCliente As String = "regular") _
4 As Currency
5 Dim precioConDescuento As Currency
6
7 Select Case tipoCliente
8 Case "vip" '30% de descuento
9 precioConDescuento = precio * 0.7
10 Case "silver" '15% de descuento
11 precioConDescuento = precio * 0.9
12 Case Else '5% de descuento
13 precioConDescuento = precio * 0.95
14 End Select
15
16 aplicaDescuento = precioConDescuento
17 End Function

Lo primero que debes de saber es que no puedes iniciar la depuración con una función, si deseas
depurar la función entonces necesitas crear una subrutina que llame a la función e iniciar la
depuración ejecutando la subrutina. Entonces agregas este código:

https://excel.facilparami.com
Corrigiendo Errores 57

1 'Subrutina para llamar a la funcion de descuentos


2 Sub depurarFuncionDescuentos()
3 Dim descuento As Currency
4
5 'Probar descuentos VIP
6 descuento = aplicaDescuento(100, "vip")
7
8 'Probar descuentos Silver
9 descuento = aplicaDescuento(100, "silver")
10
11 'Probar otros descuentos
12 descuento = aplicaDescuento(100, "")
13
14 End Sub

Ejecutar código paso a paso


Ahora para iniciar el proceso de depuración puedes colocar el cursor o hacer clic sobre la
subrutina que debes corregir y elegir el menú Depuración y la opción Paso a paso por
instrucciones.

https://excel.facilparami.com
Corrigiendo Errores 58

Depurar paso a paso

Ahora has iniciado la ejecución de código paso a paso, para avanzar puedes presionar las teclas F8,
Mayus+F8, Cltr+Mayus+F8 o Ctrl+F8.

Opciones de ejecución

Cada tecla o combinación hacen algo diferente, si presionas F8 iras avanzado instrucción por
instrucción y si la instrucción es la llamada a otra función o subrutina, entonces ingresarás a esa

https://excel.facilparami.com
Corrigiendo Errores 59

función o subrutina y avanzaras instrucción por instrucción.


Si presionas Mayus+F8 entonces avanzaras instrucción por instrucción, pero si la instrucción es la
llamada a una función o subrutina, pasas a la siguiente instrucción sin ingresar al detalle de esa
función o subrutina.
Si presionas Ctrl+Mayus+F8, entonces vas a saltar directo a al final de la función o subrutina actual.
Si presionas Ctrl+F8 entonces avanzas hasta donde este posicionado el cursor.

Nota: Para comprender mejor todo esto, lo mejor es que lo intentes tú mismo, puedes
descargar esta hoja de ejemplo en este enlace¹¹.

Puntos de interrupción
Los puntos de interrupción son líneas de código que marcas para que cuando la ejecución del código
llegue a esa línea, el programa se interrumpa e inicie el modo de depuración justo desde esa línea.
Para establecer un punto de interrupción solo debes hacer clic en la barra gris que está a la izquierda
del código, cuando lo hagas se activará un punto de interrupción justo en la línea de código que este
en esa altura. Sabrás que hay un punto de interrupción cuando veas un círculo rojo en esa barra.
Debes saber que solamente se pueden crear puntos de interrupción para líneas de código ejecutables,
es decir, no puedes hacerlo para líneas como declaraciones de variables. Para desactivar un punto
de interrupción solo debes de hacer clic sobre el círculo rojo que corresponde al que deseas eliminar.
Has unas pruebas, para que veas como funciona esta parte

Punto de interrupción
¹¹https://my.pcloud.com/publink/show?code=XZq3xO7ZXfM6ec7doVSQAV1sqRd65LXPpuPX

https://excel.facilparami.com
Corrigiendo Errores 60

Inspeccionar variables
La inspección de variables permite visualizar el contenido de las variables, solo debes de estar en
modo de depuración. Existen dos formas para ver el valor de la variable, la primera es colocando el
puntero del mouse sobre la variable y esto hará que aparezca un mensaje tipo “tooltip” para mostrar
la variable y su valor actual, tal y como se ve en esta pantalla:

Inspeccionar un valor

La segunda forma es agregando un punto de inspección, para esto haces clic derecho sobre la variable
que desees y seleccionas la opción de menú Agregar inspección...

https://excel.facilparami.com
Corrigiendo Errores 61

Agregar inspección

Y en la siguiente pantalla solo haces clic en el botón Aceptar.

Agregar inspección

Ahora se abrirá una ventana con todas las variables que estés inspeccionando y mostrará su valor
actual. De esta otra forma puedes monitorear un conjunto de variables. Esto te ayudará a revisar si
tu código está calculando los valores de la forma en que tú esperas que lo haga.

https://excel.facilparami.com
Corrigiendo Errores 62

Inspecciones

Mostrar mensajes de depuración


Otra forma de depurar código es mostrando mensajes de depuración, puedes imprimir en pantalla
información como valores de variables, cálculos o mensajes que indiquen el camino que el código
siguió, por ejemplo, si ingresó en un bloque if. Para esto utilizas la función Debug.Print, esta se usa
igual que la función msgbox, veamos un ejemplo, ahora la función muestra un mensaje indicando
que tipo de descuento va a calcular.

1 'Calcula un descuento de acuerdo al tipo de cliente


2 Function aplicaDescuento(precio As Currency, _
3 Optional tipoCliente As String = "regular") _
4 As Currency
5 Dim precioConDescuento As Currency
6
7 Select Case tipoCliente
8 Case "vip" '30% de descuento
9 Debug.Print "Calcula descuento VIP"
10 precioConDescuento = precio * 0.7
11 Case "silver" '15% de descuento

https://excel.facilparami.com
Corrigiendo Errores 63

12 Debug.Print "Calcula descuento silver"


13 precioConDescuento = precio * 0.9
14 Case Else '5% de descuento
15 Debug.Print "Calcula descuento para cliente regular"
16 precioConDescuento = precio * 0.95
17 End Select
18
19 aplicaDescuento = precioConDescuento
20 End Function

Para poder ver estos mensajes primero debes mostrar la ventana Inmediato, esto se logra con el
menú Ver y la opción Ventana Inmediato

ventana-inmediato

Ahora si ejecutas el código, verás los mensajes de depuración, en esta macro se llamó a la función 3
veces con diferentes parámetros y en la ventana inmediato, está el resultado de cada llamado.

https://excel.facilparami.com
Corrigiendo Errores 64

Ventana inmediato - ejemplo

En la función Debug.Print también puedes usar el signo & para unir textos y variables, para crear
mensajes más informativos, por ejemplo:

1 Debug.Print "El precio con descuento es: " & precioConDescuento

Control de errores en tiempo de ejecución


En ocasiones no importa lo que hagamos, los errores van a ser inevitables, por ejemplo, ¿recuerdas
la macro que hicimos en el capítulo 4 para generar un archivo de Excel por cada hoja en un libro?,
la macro solicita una carpeta y ahí crea un archivo por cada hoja, el nombre de cada archivo
corresponde al nombre de la hoja. Si una hoja se llama “Lista Precios A” entonces genera el archivo
“Lista Precios A.xlsx”, la macro pareciera funcionar sin problemas, pero cuando nombras una hoja
con una letra no valida por ejemplo usando el signo |, la macro genera un error en tiempo de
ejecución.

https://excel.facilparami.com
Corrigiendo Errores 65

Error en ejecución

Como puedes ver el mensaje no es nada amigable y el usuario solo podrá pensar que el programa
“no sirve” y que no puede hacer nada para solucionar este problema, cuando la verdad es que el
mismo usuario puede solucionar el problema con solo cambiar el nombre de la hoja, pero no lo hace
porque no sabe que ese es el problema.
Tenemos dos opciones para tratar este problema, la primera es detener toda la ejecución y mostrar
un mensaje indicando el problema, y la segunda es, ignorar el error y continuar con la ejecución del
código restante. La decisión que tomes va a depender de lo critico que consideres que sea el error,
solo responde esta pregunta: ¿El no haber ejecutado esta instrucción afectará el comportamiento del
código que hace falta ejecutar o dará un resultado equivocado al usuario?
Una vez tomes la decisión, la forma para ignorar el error y continuar con la ejecución es colocando
esta instrucción al inicio de la subrutina o función:

1 On Error Resume Next

El código completo quedará así:

https://excel.facilparami.com
Corrigiendo Errores 66

1 'Genera un archivo por cada hoja en este libro


2 Sub GeneraArchivosPrecios_IgnoraError()
3 Dim carpeta As String
4 Dim i As Integer
5 Dim LibroNuevo As Workbook
6 Dim LibroActual As Workbook
7
8 On Error Resume Next
9
10 'Preguntar en que carpeta colocar este archivo
11 carpeta = SolicitarCarpeta
12
13 If carpeta = "" Then
14 MsgBox "No selecciono la carpeta en donde se guardaran los archivos"
15 Else
16 Set LibroActual = ActiveWorkbook
17 Application.ScreenUpdating = False
18 For i = 1 To LibroActual.Sheets.Count
19 'creamos un libro nuevo.....
20 Set LibroNuevo = Workbooks.Add
21
22 'Hacemos la copia de toda la hoja en el nuevo libro
23 LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1)
24
25 'Eliminar columna de costo (C)
26 LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete
27
28 'Guardar libro en la carpeta definida y con el nombre de la hoja
29 LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name
30
31 'Cerrar el libro
32 LibroNuevo.Close
33 Next i
34 Application.ScreenUpdating = True
35 End If
36
37 End Sub

Para terminar el programa y mostrar un mensaje de error, debes colocar esta línea de código al inicio
de la función o subrutina:

https://excel.facilparami.com
Corrigiendo Errores 67

1 On Error GoTo ControlErrores

La palabra ControlErrores es una etiqueta puede tener el nombre que desees, pero sin espacios en
blanco. Luego al final de la función o subrutina colocas estas líneas de código:

1 'Asegurarse que en ejecución normal


2 'no se llegue mas lejos de aqui
3 Exit Sub
4
5 ControlErrores:
6 MsgBox "Ocurrio este error al generar los archivos: " & Err.Description

Si usas una función cambia las palabras Exit Sub por Exit Function, si usaste otra etiqueta que
no sea ControlErrores, recuerda también cambiarla en esta parte dejando siempre los : en la parte
derecha (ControlErrores:). También debes personalizar el mensaje que se muestra con MsgBox, la
variable Err.Description contiene el mensaje de error que genera el sistema, eso ayudara al usuario
a saber cúal es el problema. El código final deberá verse como este:

1 'Genera un archivo por cada hoja en este libro


2 Sub GeneraArchivosPrecios_MuestraError()
3 Dim carpeta As String
4 Dim i As Integer
5 Dim LibroNuevo As Workbook
6 Dim LibroActual As Workbook
7
8 On Error GoTo ControlErrores
9
10 'Preguntar en que carpeta colocar este archivo
11 carpeta = SolicitarCarpeta
12
13 If carpeta = "" Then
14 MsgBox "No selecciono la carpeta en donde se guardaran los archivos"
15 Else
16 Set LibroActual = ActiveWorkbook
17 Application.ScreenUpdating = False
18 For i = 1 To LibroActual.Sheets.Count
19 'creamos un libro nuevo.....
20 Set LibroNuevo = Workbooks.Add
21
22 'Hacemos la copia de toda la hoja en el nuevo libro
23 LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1)
24

https://excel.facilparami.com
Corrigiendo Errores 68

25 'Eliminar columna de costo (C)


26 LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete
27
28 'Guardar libro en la carpeta definida y con el nombre de la hoja
29 LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name
30
31 'Cerrar el libro
32 LibroNuevo.Close
33 Next i
34 Application.ScreenUpdating = True
35 End If
36
37 'Asegurarse que en ejecució normal
38 'no se llegue mas lejos de aqui
39 Exit Sub
40
41 ControlErrores:
42 MsgBox "Ocurrio este error al generar los archivos: " & Err.Description
43 End Sub

Puedes descargar una hoja con estos ejemplos¹², para que los pruebes y veas la diferencia,
existen 3 macros para que puedas observar cómo funciona sin control de errores
(GeneraArchivosPrecios), ignorando el error (GeneraArchivosPrecios_IgnoraError) y
mostrando el mensaje de error (GeneraArchivosPrecios_MuestraError).

Ejercicio
¿Recuerdas el caso del error que mencionamos al inicio y que nunca resolvimos?: “Imagina que te
han reportado que en ocasiones no calcula el descuento de forma correcta y los clientes se molestan,
entonces te han pedido que revises el código y resuelvas el problema. Como regla del negocio todos
los clientes vip tiene 30% de descuento, los clientes silver tienen un 15% y los demás tienen un 5%
de descuento.”. Descarga esta hoja de Excel¹³, revisa la macro depurarFuncionDescuentos, encuentra
y resuelve el problema aplicando lo que has aprendido en este capitulo
¹²https://my.pcloud.com/publink/show?code=XZs0wO7ZvscEhVoCXTBjwJPVWlcVpFpkqpHy
¹³https://my.pcloud.com/publink/show?code=XZq3xO7ZXfM6ec7doVSQAV1sqRd65LXPpuPX

https://excel.facilparami.com
Mensajes y cuadros de diálogo
En este capítulo aprenderás algunas formas en las que puedes comunicarte con las personas que
usan tus macros, veremos como mostrar mensajes y cómo capturar información para utilizar en tus
programas.

Mostrar mensajes en la barra de estado de Excel


La barra de estado en Excel, está ubicada en la parte inferior de la ventana, en la siguiente imagen
puede apreciarse con el mensaje “Procesando macro…”

Mensaje en barra de estado


Mensajes y cuadros de diálogo 70

Usualmente se usan estos mensajes para mantener al usuario informado del proceso de la macro,
cuando la misma se está tardando mucho tiempo, por ejemplo, mostrando el porcentaje de avance.
También puedes usarla para otros tipos de mensajes como “Datos guardados”, “Archivo generado”.
Para mostrar mensajes en la barra de estados puedes utilizar el siguiente código y solo debes de
modificar el texto entre comillas, por el texto que desees.
Sub msgStatusBar() Application.StatusBar = "Procesando macro..." End Sub

Mostrar mensajes usado MsgBox


Anteriormente habíamos utilizado MsgBox, para mostrar mensajes, pero existen algunos parámetros
extra que puedes utilizar en esta función. MsgBox tiene tres parámetros que nos interesan:

• Prompt: Es el mensaje que mostramos al usuario


• Buttons: Es un número que representa los botones y los iconos que van a mostrarse
• Title: Es el título de la ventaja en donde se muestra el mensaje, de esta forma podemos
personalizar aún más, nuestros mensajes.

Lista de valores posibles para el parámetro Buttons

Constante Valor Descripción


vbOKOnly 0 Muestra el botón OK.
vbOKCancel 1 Muestra los botones OK y Cancel.
vbAbortRetryIgnore 2 Muestra los botones Abortar, Reintentar y el botón
Ignorar.
vbYesNoCancel 3 Muestra los botones Si, No y Cancelar.
vbYesNo 4 Muestra los botones Si y No.
vbRetryCancel 5 Muestra los botones Reintentar y Cancelar.
vbCritical 16 Muestra un icono de mensaje critico.
vbQuestion 32 Muestra un icono de pregunta.
vbExclamation 48 Muestra un icono de Exclamación.
vbInformation 64 Muestra un icono de información.
vbDefaultButton1 0 Hace que el primer botón que se muestra sea el
predeterminado*.
vbDefaultButton2 256 Hace que el segundo botón que se muestra sea el
predeterminado*.
vbDefaultButton3 512 Hace que el tercer botón que se muestra sea el
predeterminado*.
vbDefaultButton4 768 Hace que el cuarto botón que se muestra sea el
predeterminado*.
vbApplicationModal 0 Aplicación Modal: Excel se bloquea y no permite
seguir trabajando hasta que se presione alguno de los
botones del mensaje
vbSystemModal 4096 Sistema Modal: Todos los programas se bloquean y
no permite seguir trabajando hasta que se presione
alguno de los botones del mensaje
https://excel.facilparami.com
Mensajes y cuadros de diálogo 71

*El botón predeterminado se activa al presionar la tecla Enter.


Podemos combinar los valores anteriores a nuestro antojo sumando las constantes, por ejemplo, para
mostrar un mensaje con los botones Ok y Cancelar y colocar un icono de Exclamación, utilizamos
este código:
Sub msgbox1() MsgBox "Este proceso va a sobre-escribir el libro", vbExclamation +
vbOKCancel End Sub

y el resultado será este:

msgbox1

Hacer una pregunta utilizando MsgBox


En el ejemplo anterior hicimos una pregunta utilizando MsgBox, pero no capturamos ninguna
respuesta. Como lo he dicho antes, ésta es una función y las funciones regresan un valor, en este
caso regresa el código del botón que presiono el usuario. Ahora solo necesitas un bloque if, para
determinar que hacer.

1 `Sub msgbox2()
2 If MsgBox("Este proceso va a sobre-escribir el libro", vbExclamation + vbOKCancel) \
3 = vbOK Then
4 'El usuario acepta continuar
5 Else
6 'El usuario cancela la operacion
7 End If
8 End Sub`

Debes de notar, que para que la función regrese el valor, debes colocar todos los parámetros entre
paréntesis. En este caso preguntamos si el valor de retorno es vbOK (el usuario presiono el botón
Ok), para una lista completa de los valores de retorno puedes consultar esta lista:

https://excel.facilparami.com
Mensajes y cuadros de diálogo 72

Constante Valor Descripción


vbOK 1 Botón OK (o Aceptar)
vbCancel 2 Botón Cancelar
vbAbort 3 Botón Abortar
vbRetry 4 Botón Reintentar
vbIgnore 5 Botón Ignorar
vbYes 6 Botón Si
vbNo 7 Botón No

Ventana de diálogo para trabajar con archivos


Cuando utilizas algún programa y necesitas abrir o guardar un archivo, estos programas te muestran
una ventana o formulario para que elijas el archivo y su ubicación. Puedes hacer esto mismo con
tus macros, cuando necesites abrir o guardar un archivo. Veamos algunos ejemplos:

Mostrar un formulario para seleccionar un archivo


Aquí hay un ejemplo de una función que regresa el nombre y ruta del archivo que seleccione un
usuario a través del cuadro de diálogo Abrir archivo. El código se limita a regresar el nombre del
archivo seleccionado, pero no realiza la lectura de este.

1 Function AbrirArchivo()
2 ' Crear un objeto de tipo FileDialog.
3 Dim fd As Office.FileDialog
4 Set fd = Application.FileDialog(msoFileDialogFilePicker)
5
6 ' Titulo del formulario
7 fd.Title = "Seleccione un archivo de texto"
8
9 ' Podemos agregar filtros para que solo muestre ciertas
10 ' extensiones de archivos
11 ' El metodo Add, recibe dos parametros:
12 ' 1: Una descripcion
13 ' 2: Un filtro, en este caso *.txt
14 fd.Filters.Add "Archivos de texto", "*.txt"
15
16 ' Mostrar el cuadro de dialog.
17 If fd.Show = True Then
18 If fd.SelectedItems.Count > 0 Then
19 Debug.Print fd.SelectedItems(1) ' Obtiene el archivo y ruta.
20 Debug.Print Dir(fd.SelectedItems(1)) ' Solo el nombre del archivo.
21

https://excel.facilparami.com
Mensajes y cuadros de diálogo 73

22 ' Regresa el archivo con su ruta


23 AbrirArchivo = fd.SelectedItems(1)
24 End If
25 End If
26 End Function

Mostrar un formulario para seleccionar una carpeta


Con esta macro podemos pedir al usuario que seleccione una carpeta, luego podemos trabajar
creando o leyendo archivos dentro de esa carpeta. Usamos la macro únicamente para que el usuario
elija en que carpeta vamos a trabajar.

1 Function SeleccionarCarpeta()
2 ' Crear un objeto de tipo FileDialog.
3 Dim fd As Office.FileDialog
4 Set fd = Application.FileDialog(msoFileDialogFolderPicker)
5
6 ' Titulo del formulario
7 fd.Title = "Seleccione una carpeta"
8
9 ' Mostrar el cuadro de dialog.
10 If fd.Show = True Then
11 If fd.SelectedItems.Count > 0 Then
12 Debug.Print fd.SelectedItems(1) ' Carpeta seleccionada.
13
14 ' Regresa el archivo con su ruta
15 SeleccionarCarpeta = fd.SelectedItems(1)
16 End If
17 End If
18 End Function

Mostrar un formulario de tipo Guardar como…


Si lo que necesitas es guardar un archivo, puedes solicitar a las personas, el nombre y ruta en donde
desean guardar algún archivo utilizando esta macro:

https://excel.facilparami.com
Mensajes y cuadros de diálogo 74

1 Function GuardarArchivo()
2 ' Crear un objeto de tipo FileDialog.
3 Dim fd As Office.FileDialog
4 Set fd = Application.FileDialog(msoFileDialogSaveAs)
5
6 ' Titulo del formulario
7 fd.Title = "Seleccione un archivo"
8
9 ' Mostrar el cuadro de dialog.
10 If fd.Show = True Then
11 If fd.SelectedItems.Count > 0 Then
12 Debug.Print fd.SelectedItems(1) ' Obtiene el archivo y ruta.
13 Debug.Print Dir(fd.SelectedItems(1)) ' Solo el nombre del archivo.
14
15 ' Regresa el archivo con su ruta
16 GuardarArchivo = fd.SelectedItems(1)
17 End If
18 End If
19 End Function

Ejercicio
Ahora necesitas practicar como comunicarte con los usuarios de tus macros. Crea una macro que
solicite seleccionar una carpeta, si el usuario completa el proceso y selecciona una carpeta, debes
mostrar la selección en la barra de estados. Si el usuario presiona el botón cancelar y no selecciona
ninguna carpeta, debes mostrar un mensaje de error con el icono vbCritical e indicar que no
selecciono alguna carpeta.

https://excel.facilparami.com
Crear formularios avanzados
En este capítulo aprenderás a crear formularios; los formularios son ventanas en las que puedes
utilizar cajas de textos, botones, listas desplegables, etc., con todo lo que necesitas para crear
interfaces de usuario muy avanzadas.

Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace:
https://my.pcloud.com/publink/show?code=XZgSS4kZT0a9HhsI6bQOIk1dQwKvFQCQtCpy

Introducción a userforms
Este tema es bastante extenso y lleno de nuevos conceptos, es por eso que iré explicando todo
mientras ponemos cada concepto en práctica. Vamos a desarrollar un formulario para el ingreso
de productos, el cual tendrá estas características:

1. Usaremos los controles más comunes para capturar información


2. Vamos a validar que los datos se ingresen correctamente
3. Los datos capturados se usarán para llenar una hoja de Excel

Al finalizar, el formulario se verá de esta manera:

Vamos a crear un formulario como este


Crear formularios avanzados 76

Tu primer formulario
Para crear un formulario, debes hacer clic derecho sobre tu proyecto y seleccionar el menú Insertar
> UserForm

Crear un formulario

Ahora ya tienes tu primer formulario, hay algunas cosas básicas que debes de saber: En los extremos
del formulario verás unos pequeños cuadros, si acercas el puntero del mouse a ellos y haces clic,
puedes arrastrarlos para cambiar el tamaño del formulario.
También veras una pequeña ventana llamada Cuadro de Herramientas, en ella esta los controles
que puedes usar en tus formularios, solo tienes que hacer clic sobre alguno de ellos para seleccionarlo
y luego clic en la zona del formulario en donde deseas que aparezcan. Si no puedes ver el Cuadro
de Herramientas, puedes hacerlo visible si seleccionas el menú Ver > Cuadro de Herramientas
Y por último, pero no menos importante, se encuentran las propiedades del formulario o controles,
desde aquí puedes configurar los formularios y controles para que se adapten a tus necesidades.

https://excel.facilparami.com
Crear formularios avanzados 77

Editar un formulario

Vamos a hacer algunos cambios a este formulario, primero vamos darle un nombre, actualmente se
llama UserForm1, pero es importante darle un nombre que podamos usar para identificarle fácil-
mente. Usualmente utilizamos un prefijo para indicar el tipo de objeto y un nombre nemotécnico,
por ejemplo, frmProducto (frm nos recuerda que es un formulario y Producto nos recuerda que se
usa para insertar un producto). Para cambiar el nombre, hacemos clic sobre el formulario (en caso de
que no esté seleccionado previamente) y luego escribimos el nombre (frmProducto) al lado derecho
de la propiedad Name

https://excel.facilparami.com
Crear formularios avanzados 78

Cambiar el nombre

Ahora vamos a cambiar el título del formulario, actualmente dice “UserForm1” pero vamos a
cambiarlo por “Productos”. Para hacer esto, seleccionamos el formulario y cambiamos la propiedad
Caption, escribiendo “Productos”.

https://excel.facilparami.com
Crear formularios avanzados 79

Cambiar el titulo

Como has visto, es muy sencillo adaptar el formulario por medio de sus propiedades, algunas
propiedades son sencillas de comprender, por ejemplo, utilizando Font puedes modificar el tipo de
letra que se usa. Intenta modificar algunas propiedades y observa cómo afectan al formulario, así
podrás familiarizarte mucho mejor con todas estas opciones.

Como utilizar botones de comando


Los botones de comandos permiten ejecutar algún código cuando el usuario los presiona. En este
ejemplo vamos a crear dos botones, uno para agregar los datos en la hoja de cálculo y otro para
cerrar el formulario sin hacer nada.
Ahora vamos a insertar los botones, para esto necesitamos el cuadro de herramientas, si no puedes
verlo, debes activarlo en menú Ver > Cuadro de herramientas.

https://excel.facilparami.com
Crear formularios avanzados 80

Cuadro de herramientas

Para agregar los botones, haces clic sobre el icono de “Botón de comando” para seleccionarlo y
luego haces clic sobre el formulario, después debes usar esos pequeños cuadros blancos del botón de
comando para cambiar su tamaño. Repite este proceso para crear un segundo botón.

https://excel.facilparami.com
Crear formularios avanzados 81

Agregar un botón

Para mover un botón o cualquier otro control a la posición que deseemos, primero hay que
seleccionarlo haciendo clic sobre él, luego hacemos clic sobre ese borde con muchos puntos y sin
soltar el botón del mouse, lo arrastramos hasta donde necesitemos que se encuentre.

https://excel.facilparami.com
Crear formularios avanzados 82

Mover un botón

De la misma forma en que cambiaste las propiedades del formulario, debes cambiar el nombre y el
texto de los botones, utiliza esta tabla como referencia:
Nombre (name) Texto (Caption)
boton1 cmdAceptar Aceptar
boton2 cmdCancelar Cancelar

Como lo mencione antes, los botones se usan para ejecutar algún código. Aún no estamos listos para
crear el código del botón Aceptar, pero podemos escribir el código para el botón Cancelar, para esto
debes hacer doble clic sobre el botón Cancelar. Esto te llevará a la ventana de edición de código del
formulario y al evento click de botón cmdCancelar, el código que escribas aquí se ejecutará cuando
alguien haga clic sobre el botón cmdCancelar.

Evento Click

Vamos a hacer que el formulario se cierre cuando alguien hace clic sobre este botón, para eso debes
completar el código de esta forma:

https://excel.facilparami.com
Crear formularios avanzados 83

1 Private Sub cmdCancelar_Click()


2 Me.Hide
3 End Sub

Existe un objeto predeterminado llamado Me, éste hace referencia al formulario, entonces en el código
anterior usamos el método Hide del formulario para esconderlo (cerrarlo) cuando el usuario presione
el botón Cancelar.
Como ya tenemos un botón y algo de código, podemos probar el formulario, en este caso solo
tenemos un formulario, pero en el caso de tener más de uno, podemos asegurarnos de que vamos a
ejecutar el formulario correcto, regresando a la vista de diseño del formulario, para hacer eso solo
hacemos doble clic sobre el nombre del formulario en la ventana de proyecto y para ejecutarlo,
presiona el botón Ejecutar o presiona la tecla F5

Ejecutar un formulario

Ahora verás el formulario en acción, para cerrarlo solo debes hacer clic sobre el botón cancelar y si
se cierra es por qué has hecho todo bien hasta ahora.

Como utilizar etiquetas


Las etiquetas son esos textos que se encuentra la izquierda de los campos de texto, estas ayudan a
que las personas tengan claridad de que información se les está solicitando.
Para insertar una etiqueta haces clic sobre el icono con una letra A, en el cuadro de herramientas, y
luego haces clic en el formulario.

https://excel.facilparami.com
Crear formularios avanzados 84

Agregar una etiqueta

Ahora debes ajustar el nombre y el texto, esto se hace cambiando las propiedades name y caption
respectivamente, tal y como se ve en esta imagen. El prefijo lbl en el nombre, es por label (etiqueta
en inglés)

https://excel.facilparami.com
Crear formularios avanzados 85

Propiedades de la etiqueta

Repite el proceso anterior para crear 3 etiquetas adicionales y cambias sus propiedades para que
tengan estos valores

Nombre Texto
lblNombre Nombre
lblCantidad Cantidad
lblUnidad Unidad

Como utilizar cuadros de texto


Los cuadros de texto se utilizan para agregar información, de esta forma puedes solicitar al usuario
que ingrese un dato y luego trabajar con ese dato.
Para agregar un cuadro de texto, haces clic sobre el icono que se muestra en la siguiente imagen, y
luego haces clic sobre el formulario.

https://excel.facilparami.com
Crear formularios avanzados 86

Agregar un cuadro de texto

En este caso, solo debemos cambiar el nombre del control, vamos a colocarle txtCodigo, txt es por
Texto y Codigo es para recordarnos que contiene el código del producto.

Propiedades del cuadro de texto

Ahora debes agregar dos cuadros de texto adicionales con estos nombres: txtNombre y txtCantidad

https://excel.facilparami.com
Crear formularios avanzados 87

Como utilizar botones de radio


Los botones de radio se utilizan para solicitar al usuario que seleccione una sola opción de entre una
cantidad pequeña de opciones, por ejemplo, si deseas conocer el género de la persona, puedes crear
dos botones de radio, uno para masculino y otro para femenino. En este caso lo vamos a utilizar para
preguntar si el producto se encuentra activo o inactivo.
Debido a que un formulario puede tener más de un grupo de botones de radio, para información
o preguntas diferentes, entonces es necesario poder agruparlos. Para agruparlos usamos un control
especial llamado marco.
Para agregar un marco hacemos clic sobre este icono y luego hacemos clic sobre el formulario.

Agregar un marco

Ahora vamos a cambiar dos de sus propiedades: Nombre (Name) y Texto (Caption), tal y como lo
vemos en esta imagen y también vamos a hacerlo un poco más grande para que quepan dos botones
de radio.

https://excel.facilparami.com
Crear formularios avanzados 88

Propiedades del marco

Ahora vamos a agregar dos botones de radio sobre este marco para esto seleccionamos el icono que
vemos en la figura de abajo, y luego hacemos clic dentro del marco que creamos anteriormente. Es
importante que agreguemos el botón de radio dentro del marco, ya que de esta forma VBA va a
saber que todos los botones de radio dentro del marco, pertenecen a un mismo grupo.

Agregar un botón de radio

Repetimos el paso anterior para tener dos botones de radio y cambiamos sus propiedades de acuerdo
a la siguiente tabla:

https://excel.facilparami.com
Crear formularios avanzados 89

Nombre (Name) Texto (Caption)


optActivo Activo
optInactivo Inactivo

Al final tendrás algo como esto:

Ejemplo de botones de radio

Si ejecutas el formulario en este momento (presionando la tecla F5), podrás observar que cuando
seleccionas un botón de radio, el otro se desmarca, de forma que solamente uno puede estar
seleccionado.

Como utilizar casillas de selección o checkbox


Las casillas de selección o checkbox se usan para preguntar algo cuya respuesta es Si o No. En nuestro
caso, haremos uso de ellas para preguntar si el producto permite realizar descuentos.
Para agregar la casilla de selección debes marcar el icono que se muestra en la imagen y luego hacer
clic sobre el formulario.

Agregar una casilla de selección

Luego lo acomodas en la posición que desees y cambias su nombre y texto, como se muestra en esta
imagen:

https://excel.facilparami.com
Crear formularios avanzados 90

Opciones para la casilla de selección

Como utilizar listas de selección


Las listas de selección (también conocida como Combo Box en inglés) se utilizan para seleccionar
una opción de entre muchas otras opciones. En este ejemplo vamos a utilizarla para seleccionar la
unidad de medida del producto, la cual podría ser: Cajas, Unidad, Docenas, Litros, etc.
Para crear una lista de selección, haz clic en el icono Cuadro Combinado y luego haces clic sobre el
formulario

Combo box o lista de selección

https://excel.facilparami.com
Crear formularios avanzados 91

Cuando agregues este control debes cambiar su nombre a cboUnidad, para poder ejecutar el código
que vamos a escribir más adelante.
Si has seguido todos los pasos, ya tienes todos los controles que necesitamos para hacer funcionar el
formulario. Si aún no has ordenado todos los controles en su lugar y con su tamaño respectivo, aquí
está de nuevo la imagen de cómo debe de lucir:

Formulario

Trabajando con eventos


Cada vez que realizas una acción sobre un formulario, esta se procesa como un evento, por ejemplo,
hacer clic sobre un botón, escribir sobre un cuadro de texto, seleccionar un botón de radio, etc. Estos
eventos ejecutan un código o conjunto de instrucciones para responder a ese evento.
Hasta ahora nuestro formulario se ve muy bien, pero no hace nada útil. Vamos a comenzar usando
el evento Activate del formulario para llenar los valores de la lista de unidades, el evento activate
se dispara cada vez que el formulario se “Activa” o se torna visible, usualmente porque lo llamas por
primera vez o por que estabas en otra aplicación y regresas a tu macro.
Para ingresar al evento, primero haces doble clic sobre cualquier parte del formulario para ingresar
al código, luego verás dos listas en la parte superior, en la primera seleccionas UserForm, que es el
formulario, y en la segunda lista seleccionas Activate, que es el evento Activate del formulario.

https://excel.facilparami.com
Crear formularios avanzados 92

Seleccionar un evento

Ahora ingresas este código en el evento:

1 Me.cboUnidad.Clear
2 Me.cboUnidad.AddItem ("Unidad")
3 Me.cboUnidad.AddItem ("Caja 12 unidades")

Como vamos a trabajar con la lista de opciones (combo box), primero escribimos Me que representa
al formulario, luego escribimos un . y el nombre de la lista (cboUnidad), luego otro . y el método (o
función) Clear, el cual borra todas las opciones que existan en la lista, hacemos esto para limpiar la
lista de cualquier otro valor.
Luego escribimos un código similar, pero ahora llamamos al método AddItem de la lista y entre
paréntesis le enviamos los nombres de las opciones que necesitamos agregar.
Si ejecutamos el formulario ahora, podremos ver que la lista ya tiene opciones para seleccionar.

https://excel.facilparami.com
Crear formularios avanzados 93

Al ejecutar el evento

Algunas macros para nuestro formulario


Ahora que ya tenemos nuestro formulario bien diseñado, vamos a la parte de crear el código. Primero
vamos a crear una macro para llamar a este formulario y luego vamos a crear una función que inserte
líneas en la hoja de cálculo.
Entonces abrimos el editor de VBA y creamos una macro con este código:

1 Sub MostrarFormularioProducto()
2 Dim f As New frmProducto
3 f.Show
4 End Sub

En la primera línea declaramos una variable de tipo frmProducto, este es el nombre de nuestro
formulario, también usamos la palabra New para inicializar la variable. Luego en la siguiente línea
usamos el método show del formulario para mostrarlo.

https://excel.facilparami.com
Crear formularios avanzados 94

Como mostrar un formulario

Ahora creamos la macro para insertar una línea de contenido en la hoja de cálculo, usando este
código:

1 Sub InsertarProducto(codigo As String, nombre As String, Estado As String, Cantidad \


2 As String, unidad As String, Descuentos As String)
3 Dim fila As Long
4
5 'Buscar ultima linea vacia.
6 fila = 2
7 While Sheets("Lista de productos").Range("A" & fila).Value <> ""
8 fila = fila + 1
9 Wend
10
11 Sheets("Lista de productos").Range("A" & fila).Value = codigo
12 Sheets("Lista de productos").Range("B" & fila).Value = nombre
13 Sheets("Lista de productos").Range("C" & fila).Value = Estado
14 Sheets("Lista de productos").Range("D" & fila).Value = Cantidad
15 Sheets("Lista de productos").Range("E" & fila).Value = unidad
16 Sheets("Lista de productos").Range("F" & fila).Value = Now()
17 Sheets("Lista de productos").Range("G" & fila).Value = Descuentos
18
19 End Sub

Para este momento el código anterior debe ser bastante familiar para ti, pero hay algunas partes que
aún debo explicar. Primero declaro una variable llamada fila, para encontrar y guardar el número
de la primera fila vacía que encuentre, debido a que la primera fila contiene el encabezado, entonces
inicio buscando desde la fila número 2.

https://excel.facilparami.com
Crear formularios avanzados 95

Utilizo un ciclo While para recorrer la hoja de cálculo, porque no sé cuántas filas debo revisar hasta
encontrar una celda vacía. Cuando encuentro una celda vacía, entonces el ciclo termina y ya tengo
mi primera fila vacía.
Luego comienzo a llenar cada celda de esa fila, con los valores que recibí como parámetro. La
columna F contiene la fecha de creación, esta fecha no se recibe como parámetro, así que se toma la
fecha del sistema, usando la función Now().

Como leer la información de un formulario


Ahora que tenemos la función para agregar filas a la hoja de cálculo, vamos a leer la información
del formulario e ingresarla en la hoja de Excel.
Primero abrimos el formulario y hacemos doble clic sobre el botón aceptar para ingresar este código.

1 Dim Estado As String


2 Dim Descuentos As String
3
4 If obActivo.Value Then
5 Estado = "Activo"
6 Else
7 Estado = "Inactivo"
8 End If
9
10 If ckDescuentos.Value Then
11 Descuentos = "Si"
12 Else
13 Descuentos = "No"
14 End If
15
16 InsertarProducto txtCodigo.Value, txtNombre.Value, Estado, txtCantidad.Value, cbUnid\
17 ad.Value, Descuentos
18
19 Me.Hide

Primero declaro dos variables para poder leer los valores de los botones de radio y de las casillas de
selección. En general para leer el valor de un control, usamos la propiedad Value de cada control.
Por ejemplo, txtCodigo.Value me regresa el código del producto.
Pero en el caso de los botones de radio y las casillas de selección, esa propiedad va a regresar un
valor True si está marcada y False si no lo está. Por eso usamos un bloque IF para darle sentido y
luego almaceno su interpretación en una variable.
Finalmente, en las últimas dos líneas del código, se llama a la función InsertarProducto para agregar
la fila y luego se usa el método Hide para cerrar el formulario.

https://excel.facilparami.com
Crear formularios avanzados 96

Hasta ahora el código de tu formulario debe verse igual a esta imagen:

Código del formulario

Y la buena noticia es que ya tienes un formulario completamente funcional. Puedes ejecutar la macro
que creamos MostrarFormularioProducto para llamar a tu formulario cuando lo necesites desde tu
hoja de cálculo.

Como agregar validaciones a tu formulario


El formulario que has creado funciona muy bien, pero si alguien ingresa información con errores,
entonces tu hoja de cálculo va a tener información sucia. Para evitar esto, debemos crear validaciones
que no permitan ingresar datos equivocados.
Para validar los datos, vamos a reemplazar el código del botón Aceptar, por este otro código:

1 Dim EsCorrecto As Boolean


2 Dim Estado As String
3 Dim Descuentos As String
4
5 EsCorrecto = True
6
7 If txtCodigo.Value = "" Then
8 MsgBox "Debe ingresar un codigo"
9 EsCorrecto = False
10 End If

https://excel.facilparami.com
Crear formularios avanzados 97

11
12 If txtNombre.Value = "" Then
13 MsgBox "Debe ingresar un nombre"
14 EsCorrecto = False
15 End If
16
17 If txtCantidad.Value = "" Then
18 MsgBox "Debe ingresar la cantidad"
19 EsCorrecto = False
20 Else
21 If Not IsNumeric(txtCantidad.Value) Then
22 MsgBox "La cantidad debe ser numerica"
23 EsCorrecto = False
24 End If
25 End If
26
27 If cbUnidad.Value = "" Then
28 MsgBox "Debe ingresar una unidad"
29 EsCorrecto = False
30 End If
31
32 If obActivo.Value Then
33 Estado = "Activo"
34 Else
35 Estado = "Inactivo"
36 End If
37
38 If ckDescuentos.Value Then
39 Descuentos = "Si"
40 Else
41 Descuentos = "No"
42 End If
43
44 If EsCorrecto Then
45 InsertarProducto txtCodigo.Value, txtNombre.Value, Estado, txtCantidad.Value\
46 , cbUnidad.Value, Descuentos
47 Me.Hide
48 End If

Básicamente usamos instrucciones IF para preguntar si el dato de cada control es correcto, y si no lo


es, entonces mostramos un mensaje de error y hacemos que una variable llamada EsCorrecto, sea
falsa. Finalmente preguntamos si el valor de la variable EsCorrecto es verdadero, si es así entonces
llamamos a la función e ingresamos los datos en la hoja de cálculo.

https://excel.facilparami.com
Crear formularios avanzados 98

Ejercicio
Imagina que alguien te pide que agregues el precio del producto, a esta hoja de cálculo. Observas
detenidamente todo el desarrollo y miras que para hacer eso debes realizar estos cambios (y por
supuestos los realizas)

1. Agregar una columna en la hoja de Excel, posiblemente la columna H


2. Agregar un cuadro de texto en el formulario
3. Modificar la función InsertarProducto para que tome el precio como parámetro y además lo
inserte en la columna H
4. Modificar el código del botón aceptar para enviar este nuevo parámetro en la función
InsertarProducto.

https://excel.facilparami.com
Uso de Workbooks
En el capítulo 4 aprendimos sobre el modelo de objetos de Excel y que eran los Workbooks, en este
capítulo vamos a profundizar un poco más en este tema, mientras vemos algunos ejemplos acerca
de su utilización.

Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace:
https://my.pcloud.com/publink/show?code=XZ2SS4kZLjL4xaQXM6pPKajhuCLDCyK59tEX

Crear un nuevo archivo de Excel


Podemos crear y guardar un archivo de Excel usando el objeto Workbooks y sus métodos Add y
SaveAs respectivamente.

Vamos a crear un archivo que nos servirá para hacer los demás ejemplos, para hacerlo puedes utilizar
una macro como esta:

1 Sub CrearArchivo()
2 Dim NombreArhivo As String
3 Dim Libro As Workbook
4
5 'Nombre del archivo
6 NombreArhivo = "demo.xlsx"
7
8 'Crear un nuevo libro, usando metodo add
9 Set Libro = Workbooks.Add()
10
11 'Guardar el libro con el nombre que digamos
12 'Si no definimos una ruta, se guarda
13 'en la carpeta en donde esta este archivo con macros
14 Libro.SaveAs NombreArhivo
15
16 End Sub

Cuando creamos un libro usando Workbooks.Add() podemos guardar una referencia al nuevo libro
creado, al asignarlo en una variable de tipo Workbook y usando la palabra reservada Set.
Uso de Workbooks 100

Abrir un archivo de Excel


Para abrir un archivo de Excel podemos usar el método Open del objeto Workbooks, como parámetro
obligatorio debemos pasar el nombre del archivo de Excel y su ruta completa, si omitimos la ruta,
entonces Excel va a buscar el archivo en la misma carpeta en donde se encuentra.
Un ejemplo de cómo hacerlo es mediante la macro que mostraré a continuación, solo debes de tener
en cuenta de que debe haber un archivo llamado demo.xlsx en la misma carpeta.

1 Sub AbrirWorkbook()
2 Workbooks.Open Filename:="demo.xlsx"
3 End Sub

Como puedes ver, al método Open le podemos pasar parámetros indicando el nombre del parámetro
seguido de := y el valor del parámetro, que en este caso es el nombre del archivo.
Si ejecutas el código anterior y el archivo no existe, entonces verás un error que quizá podría hacer
pensar que la macro no funciona, cuando en realidad el problema es que el archivo no existe.

Error al abrir archivo si no existe

Podemos arreglar esto incluyendo una validación, como en este código:

1 Sub AbrirWorkbook2()
2 Dim Archivo As String
3
4 Archivo = "demo.xlsx"
5
6 If Dir(Archivo) <> "" Then
7 Workbooks.Open Filename:=Archivo
8 Else
9 MsgBox ("El archivo " & Archivo & " no existe")

https://excel.facilparami.com
Uso de Workbooks 101

10 End If
11 End Sub

Como puedes ver ahora el nombre del archivo se encuentra en una variable, y usamos la función de
VBA Dir para probar el nombre del archivo, si el resultado es diferente de una cadena vacía entonces
abrimos el archivo, si no mostramos un error.
La función Dir evalúa una cadena de texto en donde se encuentre el nombre o parte del nombre de
un archivo y regresa el nombre del archivo que coincida con la búsqueda, por ejemplo, podrías usar
un comodín como el * de esta forma:

1 Archivo = Dir("demo.x*")

Si la función no encuentra ningún archivo entonces regresa una cadena vacía.

Abrir un archivo de Excel indicado por el usuario


El código anterior funciona muy bien, pero debes conocer el nombre archivo con el que vas a trabajar.
En ocasiones debes permitir que el usuario busque el archivo que necesita, por ejemplo, si tu macro
va a procesar los datos que se encuentra en un archivo de Excel.
Vamos a necesitar una forma sencilla de pedir al usuario que nos de la ruta completa del archivo
que necesita, en nuestro caso es mejor crear una función, de esta forma podemos reutilizar esta
funcionalidad cuando lo necesitemos. Vamos a crear una función con este código:

1 Function AbrirArchivo()
2 Dim Arch As Variant
3 Arch = Application.GetOpenFilename(FileFilter:="Excel, *.xlsx", Title:="Archivos\
4 de Excel...")
5
6 If Arch <> False Then
7 AbrirArchivo = Arch
8 End If
9 End Function

Usaremos la función GetOpenFilename del objeto Application, primero le pasamos el parámetro


FileFilter para mostrar solo archivos de Excel con extensión *.xlsx, luego le pasamos el parámetro
Title para definir un título para la ventana que abrimos para solicitar el archivo.
Como puedes observar usamos la variable Arch para obtener el resultado de la función y la hemos
definido como Variant, este tipo de datos es un tipo que puede cambiar, por ejemplo, si la función
GetOpenFilename se ejecuta y el usuario la cancela sin seleccionar un archivo, entonces regresa un
valor False (Boolean) y si no regresa el nombre completo del archivo (String)
Puedes modificar el filtro para buscar otro tipo de archivos, modificando la extensión en el filtro,
por ejemplo, para mostrar solo archivos de texto puedes usar este código:

https://excel.facilparami.com
Uso de Workbooks 102

1 Arch = Application.GetOpenFilename(FileFilter:="Texto, *.txt")

La parte del filtro antes de la , es solo una descripción, lo que hace que el filtro funcione es lo que
va después, en este caso *.txt
Ahora veamos cómo debe de quedar la macro completa

1 Function AbrirArchivo()
2 Dim Arch As Variant
3 Arch = Application.GetOpenFilename(filefilter:="Excel, *.xlsx", Title:="Archivos\
4 de Excel...")
5
6 If Arch <> False Then
7 AbrirArchivo = Arch
8 End If
9 End Function
10
11
12 Sub AbrirWorkbook3()
13 Dim Archivo As String
14
15 Archivo = AbrirArchivo()
16
17 If Dir(Archivo) <> "" Then
18 Workbooks.Open Filename:=Archivo
19 Else
20 MsgBox ("El archivo " & Archivo & " no existe")
21 End If
22 End Sub

Verificar si un archivo está abierto


Antes de intentar trabajar con un archivo, es una buena práctica, verificar si el archivo ya está
abierto, de otra forma podríamos obtener un error. Por ejemplo si necesitamos obtener datos de un
archivo, podemos verificar si ya lo abrimos, antes de intentar leerlo.
El objeto Application.Workbooks contiene una referencia a todos los libros o archivos abiertos en
Excel, podemos recorrerlos todos y verificar si ya está abierto el que necesitamos.
Vamos a utilizar el ciclo For Each, este ciclo va a recorrer todos los elementos que se encuentren
en un conjunto de datos. En el código siguiente, el ciclo For Each va a recorrer el contenido en
Application.Workbooks y guardará temporalmente cada elemento en la variable libro para que
podamos evaluar su contenido.

https://excel.facilparami.com
Uso de Workbooks 103

1 Function LibroAbierto(NombreLibro) As Boolean


2 Dim libro As Workbook
3
4 'Remover la ruta y dejar solo el nombre del archivo
5 NombreLibro = Dir(NombreLibro)
6
7 'Inicializamos a falso mientras no comprobar que existe
8 LibroAbierto = False
9 For Each libro In Application.Workbooks
10 If libro.Name = NombreLibro Then
11 LibroAbierto = True
12 'Salimos, ya no hay necesidad de seguir buscando
13 Exit For
14 End If
15 Next
16 End Function

La función anterior regresa True si el archivo se encuentra abierto, vamos a modificar la macro para
abrir un libro, de modo que verifique si el libro ya se encuentra abierto, antes de intentar abrirlo
nuevamente. El código completo quedará de esta forma:

1 Function LibroAbierto(NombreLibro) As Boolean


2 Dim libro As Workbook
3
4 'Remover la ruta y dejar solo el nombre del archivo
5 NombreLibro = Dir(NombreLibro)
6
7 'Inicializamos a falso mientras no comprobar que existe
8 LibroAbierto = False
9 For Each libro In Application.Workbooks
10 If libro.Name = NombreLibro Then
11 LibroAbierto = True
12 'Salimos, ya no hay necesidad de seguir buscando
13 Exit For
14 End If
15 Next
16 End Function
17
18 Sub AbrirWorkbook4()
19 Dim Archivo As String
20
21 Archivo = AbrirArchivo()
22

https://excel.facilparami.com
Uso de Workbooks 104

23 If Dir(Archivo) <> "" Then


24 'Revisar si ya esta abierto...
25 If LibroAbierto(Archivo) Then
26 MsgBox "El archivo ya esta abierto"
27 Else
28 Workbooks.Open Filename:=Archivo
29 End If
30 Else
31 MsgBox ("El archivo " & Archivo & " no existe")
32 End If
33
34 End Sub

Cerrar un archivo de Excel


Una vez, terminemos de trabajar con un archivo, podemos cerrarlo. Como vimos anteriormente en
el objeto Workbooks se encuentra una referencia a todos los libros abiertos, entonces, podemos usar
su método Close para cerrar cualquier libro que necesitemos.
Esta es una función que permite cerrar el libro que le enviemos como parámetro, antes de intentar
cerrarlo vamos a utilizar la función que creamos anteriormente para verificar que el libro está abierto,
antes de intentar cerrarlo.

1 Sub CerrarLibro(libro As String)


2 'Remover la ruta
3 libro = Dir(libro)
4
5 'Verificar si el libro esta abierto antes de intentar cerrarlo
6 If LibroAbierto(libro) Then
7 Workbooks(libro).Close
8 End If
9 End Sub

Vamos a modificar la macro de abrir un libro para que luego de procesar todo, cierre el libro que
abre. El código completo es este:

https://excel.facilparami.com
Uso de Workbooks 105

1 Sub CerrarLibro(libro As String)


2 'Remover la ruta
3 libro = Dir(libro)
4
5 'Verificar si el libro esta abierto antes de intentar cerrarlo
6 If LibroAbierto(libro) Then
7 Workbooks(libro).Close
8 End If
9 End Sub
10
11 Sub AbrirCerrarWorkbook()
12 Dim Archivo As String
13
14 Archivo = AbrirArchivo()
15
16 If Dir(Archivo) <> "" Then
17 'Revisar si ya esta abierto...
18 If LibroAbierto(Archivo) Then
19 MsgBox "El archivo ya esta abierto"
20 Else
21 Workbooks.Open Filename:=Archivo
22 End If
23
24 CerrarLibro (Archivo)
25 Else
26 MsgBox ("El archivo " & Archivo & " no existe")
27 End If
28
29 End Sub

Borrar un archivo
Para borrar permanentemente un archivo podemos utilizar la función Kill de VBA, esta función
recibe como parámetro el nombre del archivo que necesitamos eliminar, si no especificamos la ruta
completa (carpetas), entonces buscara el archivo en la carpeta en donde está el archivo con la macro
que estamos ejecutando.

https://excel.facilparami.com
Uso de Workbooks 106

1 Sub BorrarArchivo()
2
3 Kill ("demo.xlsx")
4 End Sub

Guardar un archivo de Excel


Para guardar un archivo puedes usar cualquiera de los métodos Save o SaveAs del objeto Workbook.
Ya hemos usado este método, pero ahora vamos a explorar otras opciones o parámetros que puedes
utilizar.
El método Save no tiene ningún parámetro, simplemente guardar el libro en el formato actual,
ubicación actual, etc. Pero el método SaveAs tiene los siguientes parámetros:

Parámetro Descripción
FileName Nombre completo del archivo incluyendo la ruta
completa. Si no incluyes la ruta, Excel toma como
referencia la carpeta actual.
FileFormat Es una constate para indicar el tipo de archivo que
necesitamos usar para grabar la hoja de cálculo, por
ejemplo, xlsm, xlsx, txt, etc. Para una lista completa,
puedes consultar esta dirección
https://docs.microsoft.com/en-
us/office/vba/api/excel.xlfileformat
Password Puedes enviar aquí una clave de hasta 15 caracteres para
proteger el archivo con contraseña.
WriteResPassword Puedes indicar una clave para poder abrir el archivo en
modo de escritura, si la persona no tiene la clave, puede
optar por abrirlo en modo de solo lectura.
ReadOnlyRecommended Si enviamos True, se mostrará un mensaje de que el
archivo debería abrirse en modo de solo lectura.
CreateBackup Si enviamos True, Excel creara una copia de respaldo.

Existen otras opciones, y los más probable es que nunca las uses en toda tu vida, sin embargo, si aún
sientes curiosidad puedes consultarlas en este enlace: https://docs.microsoft.com/en-us/office/vba/a-
pi/excel.workbook.saveas
Cuando utilizamos estas opciones, lo más recomendable es usar sus nombres, por ejemplo, para
guardar el archivo usando una clave podemos usar este código:

1 Sub GuardarConClave()
2 ThisWorkbook.SaveAs Password:="MiClave"
3 End Sub

Hay que tener en cuenta, que no hemos especificado el nombre, entonces Excel va a guardar una

https://excel.facilparami.com
Uso de Workbooks 107

copia de este archivo, usando el mismo nombre, pero en la carpeta predefinida de Excel o en la
carpeta de trabajo, lo más probables es que lo cree en la carpeta Documentos.

Ejercicio
Ahora que ya sabes trabajar con el objeto Workbook, intenta crear una macro que guarde una copia
de cada archivo abierto, pero protegido con una contraseña para poder abrirlo en modo de escritura
(usa la opción WriteResPassword)

https://excel.facilparami.com
Uso de WorkSheets
En este capítulo vamos a aprender a trabajar con Hojas de Excel, como ya sabemos cada Libro de
Excel está compuesto de Hojas y ahora veremos varios ejemplos como agregar, borrar, imprimir,
proteger hojas, etc.

Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace:
https://my.pcloud.com/publink/show?code=XZRSS4kZFWYWuP7SIh03y8uk8CKVCuy7zmby

Agregar hojas a un archivo de Excel


Para agregar hojas en un libro, puedes usar el método Add de algún objeto Sheets. Este método puede
tomar alguno de estos parámetros, los cuales son todos opcionales:

Parámetro Descripción
Before Un objeto de tipo Sheet, que indica que deseas agregar la nueva hoja,
antes de esta hoja.
After Un objeto de tipo Sheet, que indica que deseas agregar la nueva hoja,
después de esta hoja.
Count El número de hojas que deseas agregar, si omites este parámetro, se
agrega una hoja.
Type Indica el tipo de hoja que deseas agregar, por ejemplo, una hoja
normal, un gráfico, etc. Para ver una lista completa, puedes consultar
esta dirección:
https://docs.microsoft.com/en-us/office/vba/api/excel.xlsheettype

Si no definimos ninguno de los parámetros Before o After, la nueva hoja se agrega antes de la hoja
activa. Veamos un ejemplo de cómo agregar una hoja al final de todas:

1 Sub AgregarHoja()
2 ActiveWorkbook.Sheets.Add After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksh\
3 eets.Count)
4 End Sub

Para poder decirle a Excel que necesitamos agregar una hoja al final de todas, debemos usar el
parámetro After. Como mencione en la tabla anterior, debemos incluir una referencia a la hoja en
los parámetros After y Before.
Usando ActiveWorkbook.Worksheets() podemos hacer referencia a una de las hojas en el libro
actual, pero necesitamos el nombre o la posición (de 1 hasta el número de hojas) para hacer
Uso de WorkSheets 109

referencia a una hoja en específico y ya que necesitamos la última hoja, entonces podemos usar
ActiveWorkbook.Worksheets.Count para saber cuál es la última hoja.

Ahora, veamos un ejemplo más, imagina que además de definir una hoja, necesitas realizar algún
cambio sobre ella, como escribir algo sobre sus celdas o cambiar su nombre. En ese caso necesitas
capturar una referencia a la nueva hoja y luego trabajar usando sus propiedades y métodos. Aquí
hay un ejemplo sencillo:

1 Sub AgregarHoja2()
2 'Definir una variable de tipo Worksheet
3 Dim hoja As Worksheet
4
5 'Capturar una referencia a la nueva hoja
6 Set hoja = ActiveWorkbook.Sheets.Add()
7
8 'Cambiar el nombre de la hoja
9 hoja.Name = "Hoja con nombre"
10 End Sub

Debes de tener en cuenta que cuando vas a capturar una referencia de la hoja que agregas, debes
llamar al método Add usando paréntesis al final, si no vas a capturar una referencia, entonces no
debes usar los paréntesis.

Borrar una hoja de un archivo de Excel


Puedes eliminar cualquier hoja en un libro de Excel siempre y cuando el libro no esté protegido
contra cambios o se encuentre en modo de solo lectura, tampoco puedes borrar una hoja si ya no
hay otras hojas (No puedes dejar un libro de Excel, sin ninguna hoja). Para borrar una hoja puedes
usar el método Delete del objeto Sheets.
Cada hoja puede ser referenciada por su nombre o por su número de índice (un número desde 1
hasta la cantidad de hojas que existan), a continuación, hay un ejemplo para borrar la hoja llamada
“Hoja con nombre” del libro activo.

1 Sub BorrarHoja()
2 ActiveWorkbook.Sheets("Hoja con nombre").Delete
3 End Sub

Mover una hoja de un archivo de Excel


Puedes cambiar de posición una hoja dentro de un libro, al utilizar el método Move del objeto Sheets.
Este método recibe 2 parámetros opcionales: Before y After para indicar que lo quieres mover antes

https://excel.facilparami.com
Uso de WorkSheets 110

o después de alguna hoja en específico, si omites ambos parámetros, entonces Excel creara un nuevo
libro y moverá la hoja a dicho libro.
Aquí hay un ejemplo para mover la hoja actual hasta la primera posición. ActiveSheet hace
referencia al objeto de la hoja activa, podemos usarla con el método Move y para hacer referencia
a la que ya es la primera hoja, vamos a usar el índice 1 de la colección de objetos Sheets del libro
activo.

1 Sub MoverHoja()
2 ActiveSheet.Move Before:=ActiveWorkbook.Sheets(1)
3 End Sub

Copiar y pegar hojas de Excel


Para copiar y pegar hojas de Excel en un libro, puedes usar el método Copy del objeto Sheets. Al
igual que el método Move, este método tiene 2 parámetros opcionales Before y After, si omitimos
ambos parámetros entonces Excel crea un nuevo libro con la hoja que estamos copiando.
Aquí hay un ejemplo para copiar una hoja y colocarla justo después de la hoja que copiamos.

1 Sub CopiarHoja()
2 ActiveSheet.Copy After:=ActiveSheet
3 End Sub

Ocultar una hoja de Excel


Puedes ocultar una hoja cambiando a False, la propiedad Visible de cualquier objeto Sheets. Esto
puede ser muy útil para ocultar hojas con datos de configuración para tus macros y que no desees
que las personas vean. No debes usar esto para intentar proteger hojas, ya que cualquier persona
puede volver a colocarla como visible muy fácilmente.
Puedes ocultar la hoja activa con este código:

1 Sub OcultarHoja()
2 ActiveSheet.Visible = False
3 End Sub

Una vez oculta, puedes volver a mostrar la hoja haciendo clic derecho sobre cualquiera de las hojas
visibles y luego seleccionando del menú, la opción Mostrar...

https://excel.facilparami.com
Uso de WorkSheets 111

Mostrar hojas ocultas

Luego verás una lista de las hojas ocultas, entonces solo seleccionas una de la lista y presionas el
botón Aceptar.

Lista de hojas ocultas

Si no quieres que las personas puedan hacer visibles las hojas ocultas muy fácilmente, puedes elegir
la opción Muy Oculta, así, la única forma de hacer visible la hoja, será haciendo uso de VBA o el
editor de VBA.

https://excel.facilparami.com
Uso de WorkSheets 112

Puedes hacer esto con una macro como esta y utilizando la constante predefinida xlSheetVeryHidden.

1 Sub OcultarHoja2()
2 ActiveSheet.Visible = xlSheetVeryHidden
3 End Sub

Cambiar el nombre de una hoja de Excel


Puedes cambiar el nombre de una hoja de Excel, cambiando la propiedad Name del objeto Sheets.
Aquí hay un ejemplo, en el que abrimos una ventana para solicitar un nombre, luego asignamos ese
nombre a la hoja activa.

1 Sub NombreHoja()
2 Dim nombre As String
3
4 nombre = InputBox("Ingrese el nuevo nombre para esta hoja")
5 ActiveSheet.Name = nombre
6 End Sub

Proteger un archivo de Excel con contraseña


Si deseas restringir el acceso a una o más hojas de un libro, puedes proteger estas hojas y seleccionar
de entre un grupo de opciones, que pueden hacer y que no pueden. Para esto puedes usar el método
Protect del objeto Sheets.

El método Protect tiene muchos parámetros y todos son opcionales. El parámetro Password es la
clave que deseas colocar y todos los demás parámetros esperan un valor True para ser activados o
un valor False para ser desactivados, aquí hay una lista de cada uno de ellos:

Parámetro Descripción
Password Es la clave que deseas colocar para la hoja, si la omites
las personas podrán desproteger la hoja sin escribir
ninguna clave. Es importante saber que, si pierdes esta
clave, no hay forma de poder recuperarla.
DrawingObjects True para proteger las formas. El valor predeterminado
es True.
Contents True para proteger el contenido. En un gráfico, protege
todo el gráfico. En una hoja de cálculo, protege las
celdas bloqueadas. El valor predeterminado es True.
Scenarios True para proteger los escenarios. Este argumento solo
es válido para las hojas de cálculo. El valor
predeterminado es True.
https://excel.facilparami.com
Uso de WorkSheets 113

Parámetro Descripción
UserInterfaceOnly True para proteger la interfaz de usuario, pero no las
macros. Si omite este argumento, la protección se aplica
tanto a las macros como a la interfaz de usuario.
AllowFormattingCells True permite al usuario dar formato a cualquier celda
de una hoja de cálculo protegida. El valor
predeterminado es False.
AllowFormattingColumns True permite al usuario dar formato a cualquier
columna de una hoja de cálculo protegida. El valor
predeterminado es False.
AllowFormattingRows True permite al usuario dar formato a cualquier fila de
una hoja de cálculo protegida. El valor predeterminado
es False.
AllowInsertingColumns True permite al usuario insertar columnas en la hoja de
cálculo protegida. El valor predeterminado es False.
AllowInsertingRows True permite al usuario insertar filas en la hoja de
cálculo protegida. El valor predeterminado es False.
AllowInsertingHyperlinks True permite al usuario insertar hipervínculos en la hoja
de cálculo protegida. El valor predeterminado es False.
AllowDeletingColumns True permite al usuario eliminar columnas en la hoja de
cálculo protegida, donde todas las celdas de la columna
que se va a eliminar se desbloquearán. El valor
predeterminado es False.
AllowDeletingRows True permite al usuario eliminar filas en la hoja de
cálculo protegida, donde todas las celdas de la fila que se
va a eliminar se desbloquearán. El valor predeterminado
es False.
AllowSorting True permite al usuario ordenar la hoja de cálculo
protegida. Se deben desbloquear o desproteger todas las
celdas del rango de ordenación. El valor predeterminado
es False.
AllowFiltering True permite al usuario establecer filtros en la hoja de
cálculo protegida. Los usuarios pueden cambiar los
criterios del filtro, pero no puede habilitar o deshabilitar
un filtro automático. Los usuarios pueden establecer
filtros en un filtro automático existente. El valor
predeterminado es False.
AllowUsingPivotTables True permite al usuario usar informes de tabla dinámica
en la hoja de cálculo protegida. El valor predeterminado
es False.
Existe una gran cantidad de parámetros, pero para la mayoría de los casos posiblemente solo vas a
necesitar el parámetro Password y dejar todas las demás opciones con sus valores predeterminados.
Aquí hay una macro como ejemplo:

https://excel.facilparami.com
Uso de WorkSheets 114

1 Sub ProtegerHoja()
2 ActiveSheet.Protect Password:="123"
3 End Sub

Si ejecutas la macro y luego intentas modificar la hoja, verás un mensaje de error como este:

Error al escribir en celdas protegidas

También puedes eliminar la protección de la hoja usando el método Unprotect, aquí hay una macro
de ejemplo:

1 Sub DesprotegerHoja()
2 ActiveSheet.Unprotect Password:="123"
3 End Sub

Imprimir una hoja de Excel


Puedes utilizar el método PrintOut para imprimir las hojas que desees. Al ejecutar este método
puedes utilizar estos parámetros:

Parámetro Descripción
From Número de la página en la que comienza la impresión. Si no se
especifica este argumento, la impresión empieza por el principio.
To Número de la última página que se va a imprimir. Si no se
especifica este argumento, la impresión finaliza en la última
página.
Copies Número de copias que se imprimirán. Si no se especifica este
argumento, se imprime una sola copia.
Preview True para que Microsoft Excel invoque la vista preliminar antes
de imprimir el objeto. False (u omitido) para imprimir el objeto
inmediatamente.
ActivePrinter Establece el nombre de la impresora activa.
PrintToFile True para imprimir a un archivo. Si no se especifica
PrToFileName , Excel solicita al usuario que escriba el nombre
del archivo de salida.
Collate True para intercalar varias copias.
PrToFileName Si PrintToFile se establece en true, este argumento especifica el
nombre del archivo en el que desea imprimir.
IgnorePrintAreas True para omitir las áreas de impresión e imprimir todo el objeto.

https://excel.facilparami.com
Uso de WorkSheets 115

Aquí hay un ejemplo de cómo imprimir la hoja actual mostrando la vista previa:

1 Sub ImprimirHoja()
2 ActiveSheet.PrintOut Preview:=True
3 End Sub

Para poder ejecutar esta macro sin problemas, la hoja activa debe de tener algún contenido. Si la
hoja está vacía, entonces Excel simplemente no hace nada.

Ejercicio
Para practicar un poco lo que has visto en este capítulo, intenta crear un macro que recorra todas
las hojas del libro activo (ActiveWorkbook) y oculte todas las hojas excepto la primera.

https://excel.facilparami.com
Trabajando con Rangos
Ahora vamos a trabajar con rangos, un rango es un conjunto de celdas que bien pueden ser columnas,
filas, cualquier grupo de celdas o incluso una sola celda.

Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace:
https://my.pcloud.com/publink/show?code=XZJSS4kZJ85FEedg0qF8QXXloPVSkmO1I1ay

Usando Rangos
Para trabajar con rangos podemos usar el objeto Range, recordemos que este es un conjunto de
celdas, entonces al usarlo, también tenemos que decir con cual celda vamos a trabajar, por ejemplo
Range("A1:A3"). Select selecciona las celdas A1 a la A3.

Selección de rango de celdas

Usar Range, también equivale a usar Application.Range o ActiveSheet.Range , ya que asume que
estás trabajando con la hoja activa. Si deseas trabajar con otra hoja u otro libro entonces debes
especificarlo, por ejemplo, con un código como este:
Trabajando con Rangos 117

1 Sub SeleccionarCelda2()
2 'Hacer visible la hoja2 antes de seleccionar sus celdas
3 ActiveWorkbook.Sheets("Hoja2").Select
4 ActiveWorkbook.Sheets("Hoja2").Range("A1:A3").Select
5 End Sub

En el código anterior, primero seleccionamos la Hoja2, con esto hacemos que la Hoja2 se convierta
en la hoja activa y este visible, si no hacemos esto, entonces no podríamos seleccionar ninguna de
sus celdas por que la macro mostraría un error.
Al usar rangos, puedes consultar y modificar cualquier cosa que esté relacionada a las celdas en el
rango, como cambiar su formato o su contenido. Por ejemplo, veamos esta macro que cambia el
formato de un rango de celdas a numérico con dos decimales separados por un punto:

1 Sub ModificarFormatoCelda()
2 'Formato de numero con dos decimales
3 Range("A1:A3").NumberFormat = "0.00"
4
5 End Sub

Recorrer todos los valores de un rango


Ya que un rango es un conjunto de celdas, podemos utilizar un ciclo for each para poder recorrer
cada una de ellas, esto es muy útil cuando necesitamos realizar alguna operación sobre las celdas en
un rango.
Existe un rango especial llamado Selection, el cual representa todas las celdas que esta seleccionadas
en Excel, por ejemplo, estas 8 celdas seleccionadas, están contenidas en el objeto Selection

https://excel.facilparami.com
Trabajando con Rangos 118

rango-inicial

Ahora veamos una macro que recorre todas las celdas seleccionadas y muestra su contenido en un
mensaje usando la función MsgBox

1 Sub RecorrerRango()
2 Dim celda As Range
3 For Each celda In Selection
4 MsgBox celda.FormulaR1C1
5 Next
6
7 End Sub

En el código anterior, primero declaramos una variable llamada celda, luego en el ciclo for each
pedimos que se recorra cada elemento del objeto Selection y se coloque su contenido en la variable
celda, luego usamos la propiedad FormulaR1C1 de acceder al contenido de la celda.

Combinar múltiples rangos


Se puede ahorrar tiempo al trabajar con diferentes rangos con una sola instrucción; para esto
debemos combinar los rangos haciendo uso de la función Union.

https://excel.facilparami.com
Trabajando con Rangos 119

La función Union recibe como parámetros 1 o hasta 30 rangos y los combina en uno solo. Veamos
este ejemplo, en donde se definen 3 rangos y luego se unen en uno solo, para después cambiar su
color de fondo a amarillo.

1 Sub UnirRangos()
2 Dim Rango1 As Range
3 Dim Rango2 As Range
4 Dim Rango3 As Range
5 Dim MisRangos As Range
6
7 Set Rango1 = Range("A:A") 'Seleccionar toda la columna A
8 Set Rango2 = Range("C:C")
9 Set Rango3 = Range("E:E")
10
11 'Unir los 3 rangos
12 Set MisRangos = Union(Rango1, Rango2, Rango3)
13
14 'Cambiar el color de fondo
15 MisRangos.Interior.Color = RGB(255, 255, 0)
16 End Sub

El resultado será algo como esto:

https://excel.facilparami.com
Trabajando con Rangos 120

Unir rangos

Como puedes ver en el código anterior usamos la instrucción Let para asignar el valor a las variables
por que se declararon como tipo Range el cual es un objeto. Cuando trabajes con tipos de datos de
objetos debes usar siempre la palabra Let al asignarles un valor.
Otra parte que puede ser confusa, es la forma en que le asignamos un color, en lugar de un código
como Color = Amarillo, usamos Color = RGB(255, 255, 0). RGB es una función de VBA que permite
definir un color como las mezclas de rojo, verde y azul, la intensidad de cada color se representa
como un numero de 0 (ausencia del color) a 255 (color puro). Pero no necesitas dominar los colores
en RGB, puedes usar páginas como https://www.w3schools.com/colors/colors_picker.asp en donde
puedes generar códigos RGB de forma gráfica.

https://excel.facilparami.com
Trabajando con Rangos 121

Colores RGB

Uso de Offset
Al utilizar el método offset podemos definir un rango basado en el desplazamiento de otro rango.
Aunque offset puede funcionar con rangos, es más usada cuando trabajamos con una sola celda,
por ejemplo, si ya tienes la referencia de una celda y deseas ingresar algún dato en la celda que
esta a la derecha, entonces solo te desplazas una columna a la derecha. Esto puede parecer un poco
confuso al inicio así que vamos a ver algunos ejemplos y con eso lo comprenderás sin problemas.
La función offset utiliza estos parámetros

Parámetro Descripción
RowOffset Número de filas que debe desplazarse, un número positivo indica
que debe desplazarse hacia abajo, y un número negativo indica que
debe desplazarse hacia arriba.

https://excel.facilparami.com
Trabajando con Rangos 122

Parámetro Descripción
ColumnOffset Número de columnas que debe desplazarse, un número positivo
indica que debe desplazarse hacia la derecha, y un número negativo
indica que debe desplazarse hacia la izquierda.

Ahora veamos un ejemplo, imagina que vas a escribir un valor monetario en la celda activa
(ActiveCell) y en la celda que está a su derecha, debes escribir la moneda. El problema de hacer
esto, es que no sabes cúal es la celda activa, podrías usar algo como Range("B2"), pero no puedes
decir que vas a usar la celda B2 porque no sabes cúal es la celda activa. Existen formas de conseguir
cual es la dirección de la celda activa, pero en casos como este, lo mejor es hacer referencia a una
celda basada en otra celda. Veamos la solución más sencilla para este problema:

1 Sub EjemploOffset()
2 'Colocar un valor en la celda activa
3 ActiveCell.Formula2R1C1 = 25.2
4
5 'Usamos offset para movernos cero filas
6 'y 1 columna a la derecha, luego escribimos un valor
7 ActiveCell.Offset(0, 1).Formula2R1C1 = "$"
8 End Sub

Para tener una mejor idea de cómo usar offset, aquí hay grafico de cómo usarlo para seleccionar
algunas celdas que están alrededor de una celda

Ejemplos de Offset

Ahora veamos cómo se comporta Offset al usarse con rangos, imagina que tienes seleccionadas las
celdas A1:A3, que piensas que pasaría si ejecutas un código como este:

https://excel.facilparami.com
Trabajando con Rangos 123

1 Sub EjemploOffsetRangos()
2 Dim rango As Range
3
4 Set rango = Range("A1:A3")
5
6 rango.Offset(0, 1).Select
7 End Sub

El rango completo se desplaza una columna a la derecha y el resultado es que seleccionas las 3
primeras celdas de la columna B, en lugar de la columna A.

Resultado del código anterior

Borrar rangos
Los rangos poseen un método llamado Delete, puedes usarlo para borrar un rango completo de
celdas. De la misma forma en que sucede en Excel, cuando borras una o más celdas, Excel reorganiza
las demás celdas para cubrir el espacio, por ejemplo, si borras la columna B, entonces mueve todas
las columnas a la izquierda, y los datos de la columna C, pasan a la columna B.
Aprovechando el ejemplo anterior, voy a introducir un nuevo rango predeterminado: Columns, con
este objeto puedes hacer referencia a una columna completa, por medio de su índice, por ejemplo,
la columna B es la segunda columna, entonces su índice es 2.
Con este código puedes borrar la columna B, pero antes de probarla, asegúrate de agregar algunos
datos en las columnas B y C, para que puedas apreciar el resultado.

https://excel.facilparami.com
Trabajando con Rangos 124

1 Sub BorrarRango()
2 Columns(2).Delete
3 End Sub

Ocultar rangos
Ahora veremos cómo ocultar rangos. Una tarea habitual en Excel es ocultar filas o columnas que no
usas o que tienen datos que no deseas que este visibles porque no son importantes. Para ocultar o
mostrar una fila, podemos cambiar la propiedad Hidden a true para ocultar y a false para mostrar.
Ahora voy a introducir el objeto Rows, este objeto puede hacer referencia a cualquier fila de la hoja
de cálculo, por medio de su índice. Por ejemplo, el siguiente código oculta la fila 2, si necesitas volver
a hacerla visible, recuerda que solo debes cambiar la propiedad Hidden de true a false.

1 Sub OcultarRango()
2 Rows(2).Hidden = True
3 End Sub

Rangos con nombres


Excel permite asignar nombres a celdas y rangos, los nombres son más fáciles de recordar e
interpretar que las direcciones como “A23”. Si no has escuchado hablar sobre los nombres de
rangos puedes leer este articulo breve: https://excel.facilparami.com/2012/06/trabajar-con-nombres-
de-celdas-y-o-rangos/
En VBA puedes usar la propiedad Name de un rango para asignarle un nombre, para explicar esto,
vamos a crear dos macros: la primera va a asignar un nombre a una celda, en esta celda se encuentra
el porcentaje de impuestos que debe pagar un producto. En la segunda macro vamos a completar
una celda con el valor del impuesto para un producto.
Macro para asignar el nombre a la celda B1, ésta contiene el porcentaje de impuestos:

1 Sub AsignarNombre()
2 Range("B1").Name = "Impuesto"
3 End Sub

Ahora la macro para consultar este valor y hacer un cálculo usándolo:

https://excel.facilparami.com
Trabajando con Rangos 125

1 Sub CalcularImpuesto()
2 Dim Impuesto As Single
3
4 'Obtener el valor del impuesto, esta
5 'configurado en la celda Impuesto
6 Impuesto = Range("Impuesto").Formula2R1C1
7
8 'Calcular el impuesto para un producto que vale 100
9 Range("A5").Formula2R1C1 = 100 * Impuesto
10
11 End Sub

Modificar tamaño de rangos


Se puede modificar el tamaño en filas y columnas de un rango, usando su método Resize, este
método permite definir nuevamente la cantidad de filas y columnas que abarca.
Por ejemplo, veamos este rango que inicia en la celda B1 y luego se extiende 4 filas hacia abajo y dos
columnas a la derecha, hasta llegar a la celda C4.

https://excel.facilparami.com
Trabajando con Rangos 126

Rango de 4 filas y 2 columnas

Entonces, si usamos el método Resize, indicando 10 filas y 2 columnas de esta forma: rango.Resize(10,
2) estamos diciendo que el rango debe modificarse y que a partir de la celda de referencia que siempre
es la esquina superior izquierda, en este caso B1 debe contar 10 filas hacia abajo y 2 columnas a la
derecha, dejando un rango como este:

https://excel.facilparami.com
Trabajando con Rangos 127

Rango final, luego de aplicar Resize

El código de ejemplo es este:

1 Sub IncremetarRango()
2 Dim rango As Range
3
4 Set rango = Range("B1:C4")
5
6 Set rango = rango.Resize(10, 2)
7
8 rango.Select
9
10 End Sub

Como puedes ver, simplemente hemos definido nuevamente los límites del rango, pero también
puedes lograr un código más genérico, como por ejemplo incrementar el rango en una fila más o
una columna más. Para esto podemos usar las propiedades Rows.Count y Rows.Count del rango para

https://excel.facilparami.com
Trabajando con Rangos 128

conocer cuantas filas y columnas utiliza el rango y luego definir un incremento basado en esos
números, por ejemplo, para incrementar el rango en 1 fila, podes usar este código:

1 Sub IncremetarFilaRango()
2 Dim rango As Range
3
4 Set rango = Range("B1:C4")
5
6 Set rango = rango.Resize(rango.Rows.Count + 1, rango.Columns.Count)
7
8 rango.Select
9
10 End Sub

Ejercicio
Ahora que conoces los rangos y como realizar operaciones con ellos, crea una macro llamada
Aplica20Descuento y que cambie el contenido de todas las celdas seccionadas al multiplicar su valor
por 0.8, los valores de las celdas que seleccione la persona que llama la macro, deben ser numéricos.
Puedes validar si una celda tiene un valor numérico , usando con un código como este:

1 If IsNumeric(celda.Formula2R1C1) Then
2 'Es un numero
3 End If

En donde celda es una referencia a la celda que necesitas validar.

https://excel.facilparami.com

También podría gustarte