Subido por florial rodriguez

macros de excel

Anuncio
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 . . . . . . . . . . . . . . . . . . .
Que es una macro . . . . . . . . . . . . . . . . . .
Como pueden ayudarte las macros en tu trabajo
Como se usan las macros . . . . . . . . . . . . . .
Tu primer macro . . . . . . . . . . . . . . . . . . .
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Introducción a VBA . . . . . . . . .
Qué es VBA . . . . . . . . . . . .
Editor de VBA . . . . . . . . . . .
Editar una grabación de macros
Comentarios en el código . . . .
Ejercicio . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
1
1
5
7
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 9
. 9
. 9
. 11
. 12
. 14
Introducción a la programación . . . . . .
Tu primer macro usando VBA . . . . .
Funciones o subrutinas . . . . . . . . .
Variables, constantes y tipos de datos .
Que son los arreglos . . . . . . . . . . .
Decisiones y operadores lógicos . . . .
Operaciones con variables . . . . . . .
Qué son los ciclos . . . . . . . . . . . . .
Ejercicio . . . . . . . . . . . . . . . . . .
Interactuando con Excel . . . . . . . . .
¿Que son los objetos y clases? . . . . .
Objetos de Excel . . . . . . . . . . . . .
Eventos de Excel . . . . . . . . . . . . .
Ejemplo practico . . . . . . . . . . . . .
Ejercicio . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
15
15
17
18
22
25
29
30
33
33
33
34
36
39
42
Extendiendo Excel . . . . . . . . . . . . . .
Crea tus propias funciones . . . . . . .
Agrega documentación a tus fórmulas
Parámetros opcionales . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
43
43
45
47
https://excel.facilparami.com
ÍNDICE GENERAL
Instalar y desinstalar complementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Crea tus propios complementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Corrigiendo Errores . . . . . . . . . . . . . . . .
Que tipos de errores podemos esperar . . .
Como depurar código en el editor de VBA.
Control de errores en tiempo de ejecución .
Ejercicio . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
53
56
64
68
Mensajes y cuadros de diálogo . . . . . . . . . . . .
Mostrar mensajes en la barra de estado de Excel
Mostrar mensajes usado MsgBox . . . . . . . . .
Ventana de diálogo para trabajar con archivos .
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
69
69
70
72
74
Crear formularios avanzados . . . . . . . . . . . .
Introducción a userforms . . . . . . . . . . . . .
Tu primer formulario . . . . . . . . . . . . . . .
Como utilizar botones de comando . . . . . . .
Como utilizar etiquetas . . . . . . . . . . . . . .
Como utilizar cuadros de texto . . . . . . . . .
Como utilizar botones de radio . . . . . . . . .
Como utilizar casillas de selección o checkbox
Como utilizar listas de selección . . . . . . . . .
Trabajando con eventos . . . . . . . . . . . . . .
Algunas macros para nuestro formulario . . .
Como leer la información de un formulario . .
Como agregar validaciones a tu formulario . .
Ejercicio . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
75
75
76
79
83
85
87
89
90
91
93
95
96
98
Uso de Workbooks . . . . . . . . . . . . . . . . . . . . .
Crear un nuevo archivo de Excel . . . . . . . . . .
Abrir un archivo de Excel . . . . . . . . . . . . . . .
Abrir un archivo de Excel indicado por el usuario
Verificar si un archivo está abierto . . . . . . . . .
Cerrar un archivo de Excel . . . . . . . . . . . . . .
Borrar un archivo . . . . . . . . . . . . . . . . . . . .
Guardar un archivo de Excel . . . . . . . . . . . . .
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
99
99
100
101
102
104
105
106
107
Uso de WorkSheets . . . . . . . . . . . . . . .
Agregar hojas a un archivo de Excel . .
Borrar una hoja de un archivo de Excel
Mover una hoja de un archivo de Excel
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
108
108
109
109
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
https://excel.facilparami.com
ÍNDICE GENERAL
Copiar y pegar hojas de Excel . . . . . . . . .
Ocultar una hoja de Excel . . . . . . . . . . . .
Cambiar el nombre de una hoja de Excel . .
Proteger un archivo de Excel con contraseña
Imprimir una hoja de Excel . . . . . . . . . . .
Ejercicio . . . . . . . . . . . . . . . . . . . . . .
Trabajando con Rangos . . . . . . . . . . .
Usando Rangos . . . . . . . . . . . . . .
Recorrer todos los valores de un rango
Combinar múltiples rangos . . . . . . .
Uso de Offset . . . . . . . . . . . . . . .
Borrar rangos . . . . . . . . . . . . . . .
Ocultar rangos . . . . . . . . . . . . . .
Rangos con nombres . . . . . . . . . . .
Modificar tamaño de rangos . . . . . .
Ejercicio . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
110
110
112
112
114
115
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
116
116
117
118
121
123
124
124
125
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.
2
Tus primeras macros
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
3
Tus primeras macros
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
4
Tus primeras macros
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
5
Tus primeras macros
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
6
Tus primeras macros
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
7
Tus primeras macros
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
8
Tus primeras macros
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
2
3
4
5
6
7
8
9
10
Sub formula_a_valor()
' Convierte todas las formulas a valores absolutos
'
Cells.Select
Selection.Copy
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
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:
10
Introducción a VBA
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
11
Introducción a VBA
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
2
Range("C1").Select
ActiveCell.FormulaR1C1 = "Teléfono"
Si lo agregas a la macro, ésta deberá verse así:
https://excel.facilparami.com
12
Introducción a VBA
1
2
3
4
Sub encabezados()
'
' encabezados Macro
'
5
6
7
8
9
10
11
12
'
Range("A1").Select
ActiveCell.FormulaR1C1 = "Nombre"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Apellidos"
Range("C1").Select
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
13
Introducción a VBA
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
14
Introducción a VBA
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
16
Introducción a la programación
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
17
Introducción a la programación
1
Sub calcula_precios()
2
3
4
Dim costo
Dim fila As Integer
5
6
7
'Coloca encabcezado
Range("D1").FormulaR1C1 = "Precio"
8
9
10
11
12
13
14
'Recorrer todas las filas
fila = 2
costo = Range("C" & fila).FormulaR1C1
Do While IsNumeric(costo) 'Procesar mientras el costo sea un numero
'Calcular el precio
Range("D" & fila).FormulaR1C1 = costo * 1.3
15
16
17
18
19
'Pasar a las siguiente fila y leer el costo
fila = fila + 1
costo = Range("C" & fila).FormulaR1C1
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
18
Introducción a la programación
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
19
Introducción a la programación
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
20
Introducción a la programación
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
Boolean
Integer
Long
Single
Double
Double
Date
String
Object
Variant
Currency
Rango de valores
True o False (Verdadero o Falso)
números del –32,768 al 32,767
números del –2,147,483,648 al 2,147,483,647
números del –3.402823E38 al 1.401298E45
números del –1.79769313486232E308 al –4.94065645841247E-324
números del 4.94065645841247E–324 al 1.79769313486232E308
Fechas del 1/1/100 al 31/12/9999
Cualquier texto
Cualquier objeto
Cualquier valor de cualquier tipo
–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
2
Dim fila as Integer
Dim texto as String
3
4
5
fila = 1
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
2
Sub variables()
Dim texto As String
3
4
texto = "Hola mundo"
5
6
7
'Accedemos y cambiamos el contenido de la celda activa
ActiveCell.FormulaR1C1 = texto
8
9
End Sub
https://excel.facilparami.com
21
Introducción a la programación
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
22
Introducción a la programación
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
23
Introducción a la programación
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
2
3
Dim ListaSupermercado(1 To 25) As String
'Asignar un valor al indice #1
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
24
Introducción a la programación
1
Sub Arreglos()
2
3
4
'Arreglo dinamico, no detallamos la cantidad de posiciones
Dim ListaSupermercado() As String
5
6
7
'Asignamos una cantidad inicial
ReDim ListaSupermercado(1 To 1)
8
9
ListaSupermercado(1) = "Pollo"
10
11
12
13
14
15
'Ahora lo cambiamos a 2 posiciones, pero usamos
'la palabra Preserve para no perder los datos
'que ya teniamos
ReDim Preserve ListaSupermercado(1 To 2)
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
4
5
'Arreglo dinamico, no detallamos la cantidad de posiciones
Dim ListaSupermercado() As String
Dim indice As Integer
6
7
8
'Asignamos una cantidad inicial
ReDim ListaSupermercado(1 To 2)
9
10
11
ListaSupermercado(1) = "Pollo"
ListaSupermercado(2) = "Queso"
12
13
14
15
16
'Obtener el indice inferior y superior para recorrer el arreglo
For indice = LBound(ListaSupermercado) To UBound(ListaSupermercado)
MsgBox ListaSupermercado(indice)
Next indice
17
18
End Sub
https://excel.facilparami.com
25
Introducción a la programación
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
2
3
4
5
If evaluación Then
'Bloque de codigo si la condicion es cierta
Else
'Bloque de codigo si la condicion es falsa
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
6
7
8
9
10
edad = 15
If edad >= 18 Then
MsgBox "Ya eres mayor de Edad"
Else
MsgBox "Eres menor de edad"
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 comparaciones que puedes hacer son:
https://excel.facilparami.com
26
Introducción a la programación
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
2
3
4
Sub OperadoresLogicos()
Dim categoria As String
Dim cantidad As Single
Dim precio As Currency
5
6
7
8
cantidad = 10
categoria = "vip"
precio = 100
9
10
11
12
13
14
15
16
'Evaluar descuento
If cantidad >= 10 And categoria = "vip" Then
'Aplicar 30% de descuento
precio = precio * 0.7
MsgBox "El nuevo precio es " & precio
End If
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
27
Introducción a la programación
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
1 = 1 And 1=2
1 = 1 And 2=2
1 = 1 Or 1 = 2
1 = 2 Or 2 = 2
1 = 2 Or 2 = 1
Not 1 = 1
Not 1 = 2
Resultado
Falso (el primero bloque es cierto, pero el segundo es falso entonces
todo es falso)
Verdadero (ambas expresiones son verdaderas)
Verdadero (la primera expresión es verdadera, entonces no importa
el resultado de la segunda)
Verdadero (la segunda expresión es verdadera, entonces no importa
el resultado de la primera)
Falso (Ambas expresiones son falsas)
Falso (La expresión es verdadera, pero esta negada)
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
2
3
4
Sub OperadoresLogicos()
Dim categoria As String
Dim cantidad As Single
Dim precio As Currency
5
6
7
8
cantidad = 10
categoria = "vip"
precio = 100
9
10
11
12
13
14
15
16
17
18
19
'Evaluar descuento
If cantidad >= 10 Then
'If anidado: es un if dentro de otro if
If categoria = "vip" Then
'Aplicar 30% de descuento
precio = precio * 0.7
MsgBox "El nuevo precio es " & precio
End If
End If
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
28
Introducción a la programación
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
2
3
4
Sub DescuentoIf()
Dim cantidad As Single
Dim descuento As Single
cantidad = InputBox("Ingrese cantidad")
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
If cantidad > 50 Then
descuento = 25
Else
If cantidad > 40 Then
descuento = 20
Else
If cantidad > 30 Then
descuento = 15
Else
If cantidad > 20 Then
descuento = 10
End If
End If
End If
End If
22
23
24
MsgBox "El descuento es de " & descuento & "%"
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
29
Introducción a la programación
1
2
3
4
Sub DescuentoSelectCase()
Dim cantidad As Single
Dim descuento As Single
cantidad = InputBox("Ingrese cantidad")
5
6
7
8
9
10
11
12
13
14
15
16
17
Select Case cantidad
Case 0 To 20
descuento = 0
Case 21 To 30
descuento = 10
Case 31 To 40
descuento = 15
Case 41 To 50
descuento = 20
Case Else
descuento = 25
End Select
18
19
20
MsgBox "El descuento es de " & descuento & "%"
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
30
Introducción a la programación
Operador
+
*
/
^
\
Mod
&
Descripción
Suma
Multiplicación
División
Resta
Exponenciación
División entera (regresa solo la parte entera, sin decimales)
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
2
3
for variable = valorInicial to valorFinal Step 1
'Ejecutar codigo
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
31
Introducción a la programación
1
2
Sub CicloFor()
Dim fila As Integer
3
4
5
6
For fila = 1 To 10
Range("A" & fila + 1) = fila
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
2
3
Do While Condicion
' Bloque de codigo
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
4
Dim costo
Dim fila As Integer
5
6
7
'Coloca encabcezado
Range("D1").FormulaR1C1 = "Precio"
8
9
10
11
12
13
14
'Recorrer todas las filas
fila = 2
costo = Range("C" & fila).FormulaR1C1
Do While IsNumeric(costo) 'Procesar mientras el costo sea un numero
'Calcular el precio
Range("D" & fila).FormulaR1C1 = costo * 1.3
15
https://excel.facilparami.com
32
Introducción a la programación
16
17
18
19
20
'Pasar a las siguiente fila y leer el costo
fila = fila + 1
costo = Range("C" & fila).FormulaR1C1
Loop
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
2
3
Do Until Condicion
'Bloque de Codigo
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
Loop While Condicion
3
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
Loop Until Condicion
3
https://excel.facilparami.com
33
Introducción a la programación
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.
2.
3.
4.
Cambia el factor de 1.3 a 1.25
Cambia el titulo Precio, por Precio Unitario
Agrega más filas de productos y mira que pasa
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
34
Introducción a la programación
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
35
Introducción a la programación
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
36
Introducción a la programación
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
Activate
AddinInstall
AddinUninstall
BeforeClose
BeforePrint
BeforeSave
Deactivate
NewSheet
Open
SheetActivate
SheetBeforeDoubleClick
SheetBeforeRightClick
SheetCalculate
SheetChange
SheetDeactivate
Cuando se ejecuta
El libro es activado, por ejemplo, estabas en otra ventaja y
regresa al libro de Excel
Cuando instalas un complemento
Cuando desinstalas un complemento
Justo antes de cerrar el libro
Justo antes de imprimir
Justo antes de guardar
Cuando cambias a otro libro u otro programa que no sea
Excel
Creas una nueva hoja
Cuando abres el libro
Cuando cambias de hoja
Antes de dar doble clic sobre una celda
Antes de dar clic derecho en una celda
Cuando la hoja calcula las formulas
Cuando escribes algo en una celda
Cuando dejas de usar una hoja, porque cambias a otra
https://excel.facilparami.com
37
Introducción a la programación
Evento
SheetFollowHyperlink
SheetSelectionChange
WindowActivate
WindowDeactivate
WindowResize
Cuando se ejecuta
Cuando haces clic sobre un enlace
Cuando cambias la selección de celdas
Cuando cambias de libro
Cuando dejas de usar un libro, porque cambias a otro
Cuando la ventana o pantalla en que estás viendo un
libro, cambia de tamaño.
Eventos más usados en hojas
Evento
Activate
BeforeDoubleClick
BeforeRightClick
Calculate
Change
Deactivate
FollowHyperlink
SelectionChange
Cuando se ejecuta
Cuando cambias de hoja
Antes de hacer doble clic sobre una celda
Antes de hacer clic derecho sobre una celda
Cuando la hoja calcula las formulas
Cuando el contenido de una celda cambia
Cuando cambias de hoja
Haces clic en un enlace
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
38
Introducción a la programación
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
2
3
4
5
6
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Range("A1").FormulaR1C1 = "" Then
MsgBox "Antes de guardar debe ingresar un valor valido, en la celda A1"
Cancel = True
End If
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
39
Introducción a la programación
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
2
3
4
' Pedir a usuario que seleccione una carpeta
Function SolicitarCarpeta() As String
Dim dialogoArchivo As FileDialog
Set dialogoArchivo = Application.FileDialog(msoFileDialogFolderPicker)
5
6
7
8
9
10
11
12
13
dialogoArchivo.Title = "Select a Folder"
dialogoArchivo.AllowMultiSelect = False
dialogoArchivo.InitialFileName = Application.DefaultFilePath
If dialogoArchivo.Show <> -1 Then
SolicitarCarpeta = ""
Else
SolicitarCarpeta = dialogoArchivo.SelectedItems(1)
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
40
Introducción a la programación
1
2
3
4
5
6
'Genera un archivo por cada hoja en este libro
Sub GeneraArchivosPrecios()
Dim carpeta As String
Dim i As Integer
Dim LibroNuevo As Workbook
Dim LibroActual As Workbook
7
8
9
'Preguntar en que carpeta colocar este archivo
carpeta = SolicitarCarpeta
10
11
12
13
14
If carpeta = "" Then
MsgBox "No selecciono la carpeta en donde se guardaran los archivos"
Else
Set LibroActual = ActiveWorkbook
15
'Se deshabilita la actualizacion de la pantalla
'para evitar ver un parpadeo en la pantalla
Application.ScreenUpdating = False
For i = 1 To LibroActual.Sheets.Count
'creamos un libro nuevo.....
Set LibroNuevo = Workbooks.Add
16
17
18
19
20
21
22
'Hacemos la copia de toda la hoja en el nuevo libro
LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1)
23
24
25
'Eliminar columna de costo (C)
LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete
26
27
28
'Guardar libro en la carpeta definida y con el nombre de la hoja
LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name
29
30
31
32
33
34
35
36
37
'Cerrar el libro
LibroNuevo.Close
Next i
'Habilitar de nuevo la actualizacion de pantalla
Application.ScreenUpdating = true
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
41
Introducción a la programación
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
42
Introducción a la programación
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
2
Function calculaPrecio(costo As Currency)
Dim precio As Currency
3
4
5
'Agregar 30% de margen
precio = costo * 1.3
6
7
8
'Agregar 13% de IVA (Impuesto de ventas)
precio = precio * 1.13
9
10
11
12
13
'El mismo nombre de la funcion tambien funciona como
'variable en donde se asigna el valor a devolver
calculaPrecio = precio
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)
44
Extendiendo Excel
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
45
Extendiendo Excel
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
46
Extendiendo Excel
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
2
3
4
5
Private Sub Workbook_Open()
'Declarar un array para las descripciones de cada argumento
Dim Param(1 To 1) As String
'Asignar la descripcion
Param(1) = "Costo del producto"
6
7
8
9
10
11
12
'Registrar la descripcion de la macro y de los parametros
Application.MacroOptions Macro:="calculaPrecio", _
Description:="Calcula un precio en base a un costo y agrega el impuesto de venta\
s", _
ArgumentDescriptions:=Param
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
47
Extendiendo Excel
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
48
Extendiendo Excel
1
2
3
4
'Calcula un descuento de acuerdo al tipo de cliente
Function aplicaDescuento(precio As Currency, Optional tipoCliente As String = "regul\
ar")
Dim precioConDescuento As Currency
5
6
7
8
9
10
11
12
13
Select Case tipoCliente
Case "vip"
precioConDescuento = precio * 0.7
Case "silver"
precioConDescuento = precio * 0.9
Case Else
precioConDescuento = precio * 0.95
End Select
14
15
16
aplicaDescuento = precioConDescuento
End Function
Ahora, si usas esa función, verás que, si no defines el segundo parámetro, toma el valor predeterminado y aplica el 5% de descuento.
Función con parámetros opcionales
https://excel.facilparami.com
49
Extendiendo Excel
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
50
Extendiendo Excel
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
51
Extendiendo Excel
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
52
Extendiendo Excel
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
2
3
4
5
6
Sub TengoUnError()
Dim numero As Integer
If numero >= 0
'Hacer algo
End If
End Sub
La sintaxis de la instrucción if es:
1
2
3
If numero >= 0 then
'Hacer algo
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.
54
Corrigiendo Errores
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
2
3
4
Sub divisionEntreCero()
Dim precio As Currency
Dim cantidadPagos As Single
Dim cuota As Currency
5
6
precio = 125
7
8
9
10
11
12
If cantidadPagos > 0 Then
cuota = precio / cantidadPagos
Else
cuota = precio 'Todo en una sola cuota
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
55
Corrigiendo Errores
1
2
3
4
Sub divisionEntreCero()
Dim precio As Currency
Dim cantidadPagos As Single
Dim cuota As Currency
5
6
precio = 125
7
8
9
If cantidadPagos > 0 Then
cuota = precio / cantidadPagos
10
'... continuar con el codigo
11
12
13
14
15
16
Else
'... detener todo y emitir mensaje de error
MsgBox "Por favor defina una cantidad de pagos para continuar"
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
2
3
Function margen(ingresos As Currency, costos As Currency)
margen = costos - ingresos
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
56
Corrigiendo Errores
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
2
3
4
5
'Calcula un descuento de acuerdo al tipo de cliente
Function aplicaDescuento(precio As Currency, _
Optional tipoCliente As String = "regular") _
As Currency
Dim precioConDescuento As Currency
6
7
8
9
10
11
12
13
14
Select Case tipoCliente
Case "vip" '30% de descuento
precioConDescuento = precio * 0.7
Case "silver" '15% de descuento
precioConDescuento = precio * 0.9
Case Else '5% de descuento
precioConDescuento = precio * 0.95
End Select
15
16
17
aplicaDescuento = precioConDescuento
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
57
Corrigiendo Errores
1
2
3
'Subrutina para llamar a la funcion de descuentos
Sub depurarFuncionDescuentos()
Dim descuento As Currency
4
5
6
'Probar descuentos VIP
descuento = aplicaDescuento(100, "vip")
7
8
9
'Probar descuentos Silver
descuento = aplicaDescuento(100, "silver")
10
11
12
'Probar otros descuentos
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
58
Corrigiendo Errores
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
59
Corrigiendo Errores
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
60
Corrigiendo Errores
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
61
Corrigiendo Errores
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
62
Corrigiendo Errores
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
2
3
4
5
'Calcula un descuento de acuerdo al tipo de cliente
Function aplicaDescuento(precio As Currency, _
Optional tipoCliente As String = "regular") _
As Currency
Dim precioConDescuento As Currency
6
7
8
9
10
11
Select Case tipoCliente
Case "vip" '30% de descuento
Debug.Print "Calcula descuento VIP"
precioConDescuento = precio * 0.7
Case "silver" '15% de descuento
https://excel.facilparami.com
63
Corrigiendo Errores
12
13
14
15
16
17
Debug.Print "Calcula descuento silver"
precioConDescuento = precio * 0.9
Case Else '5% de descuento
Debug.Print "Calcula descuento para cliente regular"
precioConDescuento = precio * 0.95
End Select
18
19
20
aplicaDescuento = precioConDescuento
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
64
Corrigiendo Errores
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
65
Corrigiendo Errores
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
66
Corrigiendo Errores
1
2
3
4
5
6
'Genera un archivo por cada hoja en este libro
Sub GeneraArchivosPrecios_IgnoraError()
Dim carpeta As String
Dim i As Integer
Dim LibroNuevo As Workbook
Dim LibroActual As Workbook
7
8
On Error Resume Next
9
10
11
'Preguntar en que carpeta colocar este archivo
carpeta = SolicitarCarpeta
12
13
14
15
16
17
18
19
20
If carpeta = "" Then
MsgBox "No selecciono la carpeta en donde se guardaran los archivos"
Else
Set LibroActual = ActiveWorkbook
Application.ScreenUpdating = False
For i = 1 To LibroActual.Sheets.Count
'creamos un libro nuevo.....
Set LibroNuevo = Workbooks.Add
21
'Hacemos la copia de toda la hoja en el nuevo libro
LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1)
22
23
24
'Eliminar columna de costo (C)
LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete
25
26
27
'Guardar libro en la carpeta definida y con el nombre de la hoja
LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name
28
29
30
31
32
33
34
35
'Cerrar el libro
LibroNuevo.Close
Next i
Application.ScreenUpdating = True
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
67
Corrigiendo Errores
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
2
3
'Asegurarse que en ejecución normal
'no se llegue mas lejos de aqui
Exit Sub
4
5
6
ControlErrores:
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
2
3
4
5
6
'Genera un archivo por cada hoja en este libro
Sub GeneraArchivosPrecios_MuestraError()
Dim carpeta As String
Dim i As Integer
Dim LibroNuevo As Workbook
Dim LibroActual As Workbook
7
8
On Error GoTo ControlErrores
9
10
11
'Preguntar en que carpeta colocar este archivo
carpeta = SolicitarCarpeta
12
13
14
15
16
17
18
19
20
If carpeta = "" Then
MsgBox "No selecciono la carpeta en donde se guardaran los archivos"
Else
Set LibroActual = ActiveWorkbook
Application.ScreenUpdating = False
For i = 1 To LibroActual.Sheets.Count
'creamos un libro nuevo.....
Set LibroNuevo = Workbooks.Add
21
22
23
'Hacemos la copia de toda la hoja en el nuevo libro
LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1)
24
https://excel.facilparami.com
68
Corrigiendo Errores
25
26
'Eliminar columna de costo (C)
LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete
27
28
29
'Guardar libro en la carpeta definida y con el nombre de la hoja
LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name
30
31
32
33
34
35
'Cerrar el libro
LibroNuevo.Close
Next i
Application.ScreenUpdating = True
End If
36
37
38
39
'Asegurarse que en ejecució normal
'no se llegue mas lejos de aqui
Exit Sub
40
41
42
43
ControlErrores:
MsgBox "Ocurrio este error al generar los archivos: " & Err.Description
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
70
Mensajes y cuadros de diálogo
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
vbOKOnly
vbOKCancel
vbAbortRetryIgnore
Valor
0
1
2
vbYesNoCancel
vbYesNo
vbRetryCancel
vbCritical
vbQuestion
vbExclamation
vbInformation
vbDefaultButton1
3
4
5
16
32
48
64
0
vbDefaultButton2
256
vbDefaultButton3
512
vbDefaultButton4
768
vbApplicationModal
0
vbSystemModal
4096
Descripción
Muestra el botón OK.
Muestra los botones OK y Cancel.
Muestra los botones Abortar, Reintentar y el botón
Ignorar.
Muestra los botones Si, No y Cancelar.
Muestra los botones Si y No.
Muestra los botones Reintentar y Cancelar.
Muestra un icono de mensaje critico.
Muestra un icono de pregunta.
Muestra un icono de Exclamación.
Muestra un icono de información.
Hace que el primer botón que se muestra sea el
predeterminado*.
Hace que el segundo botón que se muestra sea el
predeterminado*.
Hace que el tercer botón que se muestra sea el
predeterminado*.
Hace que el cuarto botón que se muestra sea el
predeterminado*.
Aplicación Modal: Excel se bloquea y no permite
seguir trabajando hasta que se presione alguno de los
botones del mensaje
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
71
Mensajes y cuadros de diálogo
*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
2
3
4
5
6
7
8
`Sub msgbox2()
If MsgBox("Este proceso va a sobre-escribir el libro", vbExclamation + vbOKCancel) \
= vbOK Then
'El usuario acepta continuar
Else
'El usuario cancela la operacion
End If
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
72
Mensajes y cuadros de diálogo
Constante
vbOK
vbCancel
vbAbort
vbRetry
vbIgnore
vbYes
vbNo
Valor
1
2
3
4
5
6
7
Descripción
Botón OK (o Aceptar)
Botón Cancelar
Botón Abortar
Botón Reintentar
Botón Ignorar
Botón Si
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
2
3
4
Function AbrirArchivo()
' Crear un objeto de tipo FileDialog.
Dim fd As Office.FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
5
6
7
' Titulo del formulario
fd.Title = "Seleccione un archivo de texto"
8
9
10
11
12
13
14
' Podemos agregar filtros para que solo muestre ciertas
' extensiones de archivos
' El metodo Add, recibe dos parametros:
'
1: Una descripcion
'
2: Un filtro, en este caso *.txt
fd.Filters.Add "Archivos de texto", "*.txt"
15
16
17
18
19
20
' Mostrar el cuadro de dialog.
If fd.Show = True Then
If fd.SelectedItems.Count > 0 Then
Debug.Print fd.SelectedItems(1)
' Obtiene el archivo y ruta.
Debug.Print Dir(fd.SelectedItems(1)) ' Solo el nombre del archivo.
21
https://excel.facilparami.com
73
Mensajes y cuadros de diálogo
22
23
24
25
26
' Regresa el archivo con su ruta
AbrirArchivo = fd.SelectedItems(1)
End If
End If
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
2
3
4
Function SeleccionarCarpeta()
' Crear un objeto de tipo FileDialog.
Dim fd As Office.FileDialog
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
5
6
7
' Titulo del formulario
fd.Title = "Seleccione una carpeta"
8
9
10
11
12
' Mostrar el cuadro de dialog.
If fd.Show = True Then
If fd.SelectedItems.Count > 0 Then
Debug.Print fd.SelectedItems(1)
' Carpeta seleccionada.
13
14
15
16
17
18
' Regresa el archivo con su ruta
SeleccionarCarpeta = fd.SelectedItems(1)
End If
End If
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
74
Mensajes y cuadros de diálogo
1
2
3
4
Function GuardarArchivo()
' Crear un objeto de tipo FileDialog.
Dim fd As Office.FileDialog
Set fd = Application.FileDialog(msoFileDialogSaveAs)
5
6
7
' Titulo del formulario
fd.Title = "Seleccione un archivo"
8
9
10
11
12
13
' Mostrar el cuadro de dialog.
If fd.Show = True Then
If fd.SelectedItems.Count > 0 Then
Debug.Print fd.SelectedItems(1)
' Obtiene el archivo y ruta.
Debug.Print Dir(fd.SelectedItems(1)) ' Solo el nombre del archivo.
14
15
16
17
18
19
' Regresa el archivo con su ruta
GuardarArchivo = fd.SelectedItems(1)
End If
End If
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
76
Crear formularios avanzados
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
77
Crear formularios avanzados
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ácilmente. 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
78
Crear formularios avanzados
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
79
Crear formularios avanzados
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
80
Crear formularios avanzados
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
81
Crear formularios avanzados
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
82
Crear formularios avanzados
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:
boton1
boton2
Nombre (name)
cmdAceptar
cmdCancelar
Texto (Caption)
Aceptar
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
83
Crear formularios avanzados
1
2
3
Private Sub cmdCancelar_Click()
Me.Hide
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
84
Crear formularios avanzados
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
85
Crear formularios avanzados
Propiedades de la etiqueta
Repite el proceso anterior para crear 3 etiquetas adicionales y cambias sus propiedades para que
tengan estos valores
Nombre
lblNombre
lblCantidad
lblUnidad
Texto
Nombre
Cantidad
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
86
Crear formularios avanzados
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
87
Crear formularios avanzados
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
88
Crear formularios avanzados
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
89
Crear formularios avanzados
Nombre (Name)
optActivo
optInactivo
Texto (Caption)
Activo
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
90
Crear formularios avanzados
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
91
Crear formularios avanzados
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
92
Crear formularios avanzados
Seleccionar un evento
Ahora ingresas este código en el evento:
1
2
3
Me.cboUnidad.Clear
Me.cboUnidad.AddItem ("Unidad")
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
93
Crear formularios avanzados
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
2
3
4
Sub MostrarFormularioProducto()
Dim f As New frmProducto
f.Show
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
94
Crear formularios avanzados
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
2
3
Sub InsertarProducto(codigo As String, nombre As String, Estado As String, Cantidad \
As String, unidad As String, Descuentos As String)
Dim fila As Long
4
5
6
7
8
9
'Buscar ultima linea vacia.
fila = 2
While Sheets("Lista de productos").Range("A" & fila).Value <> ""
fila = fila + 1
Wend
10
11
12
13
14
15
16
17
Sheets("Lista
Sheets("Lista
Sheets("Lista
Sheets("Lista
Sheets("Lista
Sheets("Lista
Sheets("Lista
de
de
de
de
de
de
de
productos").Range("A"
productos").Range("B"
productos").Range("C"
productos").Range("D"
productos").Range("E"
productos").Range("F"
productos").Range("G"
&
&
&
&
&
&
&
fila).Value
fila).Value
fila).Value
fila).Value
fila).Value
fila).Value
fila).Value
=
=
=
=
=
=
=
codigo
nombre
Estado
Cantidad
unidad
Now()
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
95
Crear formularios avanzados
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
2
Dim Estado As String
Dim Descuentos As String
3
4
5
6
7
8
If obActivo.Value Then
Estado = "Activo"
Else
Estado = "Inactivo"
End If
9
10
11
12
13
14
If ckDescuentos.Value Then
Descuentos = "Si"
Else
Descuentos = "No"
End If
15
16
17
InsertarProducto txtCodigo.Value, txtNombre.Value, Estado, txtCantidad.Value, cbUnid\
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
96
Crear formularios avanzados
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
2
3
Dim EsCorrecto As Boolean
Dim Estado As String
Dim Descuentos As String
4
5
EsCorrecto = True
6
7
8
9
10
If txtCodigo.Value = "" Then
MsgBox "Debe ingresar un codigo"
EsCorrecto = False
End If
https://excel.facilparami.com
97
Crear formularios avanzados
11
12
13
14
15
If txtNombre.Value = "" Then
MsgBox "Debe ingresar un nombre"
EsCorrecto = False
End If
16
17
18
19
20
21
22
23
24
25
If txtCantidad.Value = "" Then
MsgBox "Debe ingresar la cantidad"
EsCorrecto = False
Else
If Not IsNumeric(txtCantidad.Value) Then
MsgBox "La cantidad debe ser numerica"
EsCorrecto = False
End If
End If
26
27
28
29
30
If cbUnidad.Value = "" Then
MsgBox "Debe ingresar una unidad"
EsCorrecto = False
End If
31
32
33
34
35
36
If obActivo.Value Then
Estado = "Activo"
Else
Estado = "Inactivo"
End If
37
38
39
40
41
42
If ckDescuentos.Value Then
Descuentos = "Si"
Else
Descuentos = "No"
End If
43
44
45
46
47
48
If EsCorrecto Then
InsertarProducto txtCodigo.Value, txtNombre.Value, Estado, txtCantidad.Value\
, cbUnidad.Value, Descuentos
Me.Hide
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
98
Crear formularios avanzados
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
2
3
Sub CrearArchivo()
Dim NombreArhivo As String
Dim Libro As Workbook
4
5
6
'Nombre del archivo
NombreArhivo = "demo.xlsx"
7
8
9
'Crear un nuevo libro, usando metodo add
Set Libro = Workbooks.Add()
10
11
12
13
14
'Guardar el libro con el nombre que digamos
'Si no definimos una ruta, se guarda
'en la carpeta en donde esta este archivo con macros
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.
100
Uso de Workbooks
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
2
3
Sub AbrirWorkbook()
Workbooks.Open Filename:="demo.xlsx"
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
2
Sub AbrirWorkbook2()
Dim Archivo As String
3
4
Archivo = "demo.xlsx"
5
6
7
8
9
If Dir(Archivo) <> "" Then
Workbooks.Open Filename:=Archivo
Else
MsgBox ("El archivo " & Archivo & " no existe")
https://excel.facilparami.com
101
Uso de Workbooks
10
11
End If
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
2
3
4
Function AbrirArchivo()
Dim Arch As Variant
Arch = Application.GetOpenFilename(FileFilter:="Excel, *.xlsx", Title:="Archivos\
de Excel...")
5
6
7
8
9
If Arch <> False Then
AbrirArchivo = Arch
End If
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
102
Uso de Workbooks
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
2
3
4
Function AbrirArchivo()
Dim Arch As Variant
Arch = Application.GetOpenFilename(filefilter:="Excel, *.xlsx", Title:="Archivos\
de Excel...")
5
6
7
8
9
If Arch <> False Then
AbrirArchivo = Arch
End If
End Function
10
11
12
13
Sub AbrirWorkbook3()
Dim Archivo As String
14
15
Archivo = AbrirArchivo()
16
17
18
19
20
21
22
If Dir(Archivo) <> "" Then
Workbooks.Open Filename:=Archivo
Else
MsgBox ("El archivo " & Archivo & " no existe")
End If
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
103
Uso de Workbooks
1
2
Function LibroAbierto(NombreLibro) As Boolean
Dim libro As Workbook
3
4
5
'Remover la ruta y dejar solo el nombre del archivo
NombreLibro = Dir(NombreLibro)
6
7
8
9
10
11
12
13
14
15
16
'Inicializamos a falso mientras no comprobar que existe
LibroAbierto = False
For Each libro In Application.Workbooks
If libro.Name = NombreLibro Then
LibroAbierto = True
'Salimos, ya no hay necesidad de seguir buscando
Exit For
End If
Next
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
2
Function LibroAbierto(NombreLibro) As Boolean
Dim libro As Workbook
3
4
5
'Remover la ruta y dejar solo el nombre del archivo
NombreLibro = Dir(NombreLibro)
6
7
8
9
10
11
12
13
14
15
16
'Inicializamos a falso mientras no comprobar que existe
LibroAbierto = False
For Each libro In Application.Workbooks
If libro.Name = NombreLibro Then
LibroAbierto = True
'Salimos, ya no hay necesidad de seguir buscando
Exit For
End If
Next
End Function
17
18
19
Sub AbrirWorkbook4()
Dim Archivo As String
20
21
Archivo = AbrirArchivo()
22
https://excel.facilparami.com
104
Uso de Workbooks
23
24
25
26
27
28
29
30
31
32
If Dir(Archivo) <> "" Then
'Revisar si ya esta abierto...
If LibroAbierto(Archivo) Then
MsgBox "El archivo ya esta abierto"
Else
Workbooks.Open Filename:=Archivo
End If
Else
MsgBox ("El archivo " & Archivo & " no existe")
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
2
3
Sub CerrarLibro(libro As String)
'Remover la ruta
libro = Dir(libro)
4
5
6
7
8
9
'Verificar si el libro esta abierto antes de intentar cerrarlo
If LibroAbierto(libro) Then
Workbooks(libro).Close
End If
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
105
Uso de Workbooks
1
2
3
Sub CerrarLibro(libro As String)
'Remover la ruta
libro = Dir(libro)
4
5
6
7
8
9
'Verificar si el libro esta abierto antes de intentar cerrarlo
If LibroAbierto(libro) Then
Workbooks(libro).Close
End If
End Sub
10
11
12
Sub AbrirCerrarWorkbook()
Dim Archivo As String
13
14
Archivo = AbrirArchivo()
15
16
17
18
19
20
21
22
If Dir(Archivo) <> "" Then
'Revisar si ya esta abierto...
If LibroAbierto(Archivo) Then
MsgBox "El archivo ya esta abierto"
Else
Workbooks.Open Filename:=Archivo
End If
23
24
25
26
27
CerrarLibro (Archivo)
Else
MsgBox ("El archivo " & Archivo & " no existe")
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
106
Uso de Workbooks
1
Sub BorrarArchivo()
2
3
4
Kill ("demo.xlsx")
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
FileName
FileFormat
Password
WriteResPassword
ReadOnlyRecommended
CreateBackup
Descripción
Nombre completo del archivo incluyendo la ruta
completa. Si no incluyes la ruta, Excel toma como
referencia la carpeta actual.
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/enus/office/vba/api/excel.xlfileformat
Puedes enviar aquí una clave de hasta 15 caracteres para
proteger el archivo con contraseña.
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.
Si enviamos True, se mostrará un mensaje de que el
archivo debería abrirse en modo de solo lectura.
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/api/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
2
3
Sub GuardarConClave()
ThisWorkbook.SaveAs Password:="MiClave"
End Sub
Hay que tener en cuenta, que no hemos especificado el nombre, entonces Excel va a guardar una
https://excel.facilparami.com
107
Uso de Workbooks
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
Before
After
Count
Type
Descripción
Un objeto de tipo Sheet, que indica que deseas agregar la nueva hoja,
antes de esta hoja.
Un objeto de tipo Sheet, que indica que deseas agregar la nueva hoja,
después de esta hoja.
El número de hojas que deseas agregar, si omites este parámetro, se
agrega una hoja.
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
2
3
4
Sub AgregarHoja()
ActiveWorkbook.Sheets.Add After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksh\
eets.Count)
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
109
Uso de WorkSheets
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
2
3
Sub AgregarHoja2()
'Definir una variable de tipo Worksheet
Dim hoja As Worksheet
4
5
6
'Capturar una referencia a la nueva hoja
Set hoja = ActiveWorkbook.Sheets.Add()
7
8
9
10
'Cambiar el nombre de la hoja
hoja.Name = "Hoja con nombre"
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
2
3
Sub BorrarHoja()
ActiveWorkbook.Sheets("Hoja con nombre").Delete
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
110
Uso de WorkSheets
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
2
3
Sub MoverHoja()
ActiveSheet.Move Before:=ActiveWorkbook.Sheets(1)
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
2
3
Sub CopiarHoja()
ActiveSheet.Copy After:=ActiveSheet
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
2
3
Sub OcultarHoja()
ActiveSheet.Visible = False
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
111
Uso de WorkSheets
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
112
Uso de WorkSheets
Puedes hacer esto con una macro como esta y utilizando la constante predefinida xlSheetVeryHidden.
1
2
3
Sub OcultarHoja2()
ActiveSheet.Visible = xlSheetVeryHidden
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
2
Sub NombreHoja()
Dim nombre As String
3
4
5
6
nombre = InputBox("Ingrese el nuevo nombre para esta hoja")
ActiveSheet.Name = nombre
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
Password
DrawingObjects
Contents
Scenarios
Descripción
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.
True para proteger las formas. El valor predeterminado
es True.
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.
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
113
Uso de WorkSheets
Parámetro
UserInterfaceOnly
AllowFormattingCells
AllowFormattingColumns
AllowFormattingRows
AllowInsertingColumns
AllowInsertingRows
AllowInsertingHyperlinks
AllowDeletingColumns
AllowDeletingRows
AllowSorting
AllowFiltering
AllowUsingPivotTables
Descripción
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.
True permite al usuario dar formato a cualquier celda
de una hoja de cálculo protegida. El valor
predeterminado es False.
True permite al usuario dar formato a cualquier
columna de una hoja de cálculo protegida. El valor
predeterminado es False.
True permite al usuario dar formato a cualquier fila de
una hoja de cálculo protegida. El valor predeterminado
es False.
True permite al usuario insertar columnas en la hoja de
cálculo protegida. El valor predeterminado es False.
True permite al usuario insertar filas en la hoja de
cálculo protegida. El valor predeterminado es False.
True permite al usuario insertar hipervínculos en la hoja
de cálculo protegida. El valor predeterminado es False.
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.
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.
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.
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.
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
114
Uso de WorkSheets
1
2
3
Sub ProtegerHoja()
ActiveSheet.Protect Password:="123"
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
2
3
Sub DesprotegerHoja()
ActiveSheet.Unprotect Password:="123"
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
From
To
Copies
Preview
ActivePrinter
PrintToFile
Collate
PrToFileName
IgnorePrintAreas
Descripción
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.
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.
Número de copias que se imprimirán. Si no se especifica este
argumento, se imprime una sola copia.
True para que Microsoft Excel invoque la vista preliminar antes
de imprimir el objeto. False (u omitido) para imprimir el objeto
inmediatamente.
Establece el nombre de la impresora activa.
True para imprimir a un archivo. Si no se especifica
PrToFileName , Excel solicita al usuario que escriba el nombre
del archivo de salida.
True para intercalar varias copias.
Si PrintToFile se establece en true, este argumento especifica el
nombre del archivo en el que desea imprimir.
True para omitir las áreas de impresión e imprimir todo el objeto.
https://excel.facilparami.com
115
Uso de WorkSheets
Aquí hay un ejemplo de cómo imprimir la hoja actual mostrando la vista previa:
1
2
3
Sub ImprimirHoja()
ActiveSheet.PrintOut Preview:=True
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:
117
Trabajando con Rangos
1
2
3
4
5
Sub SeleccionarCelda2()
'Hacer visible la hoja2 antes de seleccionar sus celdas
ActiveWorkbook.Sheets("Hoja2").Select
ActiveWorkbook.Sheets("Hoja2").Range("A1:A3").Select
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
2
3
Sub ModificarFormatoCelda()
'Formato de numero con dos decimales
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
118
Trabajando con Rangos
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
2
3
4
5
Sub RecorrerRango()
Dim celda As Range
For Each celda In Selection
MsgBox celda.FormulaR1C1
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
119
Trabajando con Rangos
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
2
3
4
5
Sub UnirRangos()
Dim Rango1 As
Dim Rango2 As
Dim Rango3 As
Dim MisRangos
Range
Range
Range
As Range
6
7
8
9
Set Rango1 = Range("A:A") 'Seleccionar toda la columna A
Set Rango2 = Range("C:C")
Set Rango3 = Range("E:E")
10
11
12
'Unir los 3 rangos
Set MisRangos = Union(Rango1, Rango2, Rango3)
13
14
15
16
'Cambiar el color de fondo
MisRangos.Interior.Color = RGB(255, 255, 0)
End Sub
El resultado será algo como esto:
https://excel.facilparami.com
120
Trabajando con Rangos
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
121
Trabajando con Rangos
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
RowOffset
Descripción
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
122
Trabajando con Rangos
Parámetro
ColumnOffset
Descripción
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
2
3
Sub EjemploOffset()
'Colocar un valor en la celda activa
ActiveCell.Formula2R1C1 = 25.2
4
5
6
7
8
'Usamos offset para movernos cero filas
'y 1 columna a la derecha, luego escribimos un valor
ActiveCell.Offset(0, 1).Formula2R1C1 = "$"
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
123
Trabajando con Rangos
1
2
Sub EjemploOffsetRangos()
Dim rango As Range
3
4
Set rango = Range("A1:A3")
5
6
7
rango.Offset(0, 1).Select
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
124
Trabajando con Rangos
1
2
3
Sub BorrarRango()
Columns(2).Delete
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
2
3
Sub OcultarRango()
Rows(2).Hidden = True
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-nombresde-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
2
3
Sub AsignarNombre()
Range("B1").Name = "Impuesto"
End Sub
Ahora la macro para consultar este valor y hacer un cálculo usándolo:
https://excel.facilparami.com
125
Trabajando con Rangos
1
2
Sub CalcularImpuesto()
Dim Impuesto As Single
3
4
5
6
'Obtener el valor del impuesto, esta
'configurado en la celda Impuesto
Impuesto = Range("Impuesto").Formula2R1C1
7
8
9
'Calcular el impuesto para un producto que vale 100
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
126
Trabajando con Rangos
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
127
Trabajando con Rangos
Rango final, luego de aplicar Resize
El código de ejemplo es este:
1
2
Sub IncremetarRango()
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
128
Trabajando con Rangos
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
2
Sub IncremetarFilaRango()
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
2
3
If IsNumeric(celda.Formula2R1C1) Then
'Es un numero
End If
En donde celda es una referencia a la celda que necesitas validar.
https://excel.facilparami.com
Descargar