Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Libro Macros Excel
Libro Macros Excel
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.
Índice general
Introducción a VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Qué es VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Editor de VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Editar una grabación de macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Comentarios en el código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Introducción a la programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Tu primer macro usando VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Funciones o subrutinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Variables, constantes y tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Que son los arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Decisiones y operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Operaciones con variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Qué son los ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Interactuando con Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
¿Que son los objetos y clases? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Objetos de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Eventos de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Ejemplo practico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Extendiendo Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Crea tus propias funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Agrega documentación a tus fórmulas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Parámetros opcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
https://excel.facilparami.com
ÍNDICE GENERAL
Corrigiendo Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Que tipos de errores podemos esperar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Como depurar código en el editor de VBA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Control de errores en tiempo de ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Uso de Workbooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Crear un nuevo archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Abrir un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Abrir un archivo de Excel indicado por el usuario . . . . . . . . . . . . . . . . . . . . . . . . . 101
Verificar si un archivo está abierto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Cerrar un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Borrar un archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Guardar un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
https://excel.facilparami.com
ÍNDICE GENERAL
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.
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
https://excel.facilparami.com
Tus primeras macros 3
Opciones
Y seleccionas Personalizar cinta de opciones y marcas la casilla de selección que dice Programador,
finalmente haces clic en Aceptar y listo, ya has activado el menú secreto.
https://excel.facilparami.com
Tus primeras macros 4
Abre el archivo que descargaste y verás que en la celda C6 hay una formula (es una formula muy
sencilla, pero esto no es importante por ahora)
Si vas al nuevo menú Programador, luego presionas el botón que dice Macros veras que se abre una
ventana, selecciona la primera macro en la lista y presiona el botón Ejecutar, esto hará que todas
las fórmulas en esta hoja sean reemplazadas por su valor en texto, eliminado su fórmula, pero no su
resultado
https://excel.facilparami.com
Tus primeras macros 5
Existen otras formas para ejecutar una macro, pero por el momento vamos a utilizar esta.
Tu primer macro
Ahora que ya ejecutaste tu primera macro es hora de que crees tú primer macro. Crea un archivo
nuevo de Excel y en el menú Programador presiona el botón Grabar macro
Luego veras una ventana en la que tienes que colocar un nombre para la macro, una descripción y
presionar el botón Aceptar
Los nombres de macros no pueden llevar espacios en blanco, pero puedes usar guiones
para separar palabras. Tampoco puedes usar caracteres especiales.
https://excel.facilparami.com
Tus primeras macros 6
Grabar macros
Ahora Excel va a grabar todo lo que hagas, por ejemplo, selecciona primera fila de la hoja de cálculo
y coloca un color de fondo, puedes hacer cualquier cosa que desees. Cuando termines presiona el
botón Detener grabación
Detener grabación
Ya está, has creado tu primer macro. Puedes ejecutarla como lo hiciste con la macro que descargaste,
https://excel.facilparami.com
Tus primeras macros 7
pero para poder ver que repite todo, puedes seleccionar una hoja nueva.
Si intentas grabar este archivo, vas a recibir una advertencia, y es que las hojas de cálculo “normales”
no pueden contener macros. Para poder grabar y conservar tu macro debes de elegir el formato de
archivo Libro de Excel habilitado para macros
Hasta ahora las macros que crees, son parte del archivo en que estas trabajando, si el
archivo no está abierto, la macro no está disponible. En otros capítulos vamos a aprender
a hacer que tu macro este siempre disponible
Ejercicio
Ahora viene la parte práctica, imagina algo que has estado haciendo en Excel, y que repites una y
otra vez. Intenta crear una macro que automatice el trabajo y lo haga por ti.
https://excel.facilparami.com
Tus primeras macros 8
Tiene que ser algún muy sencillo como dar formato a algo, cambiar algún nombre, borrar columnas
que no usas o algo así, recuerda que estas comenzando, luego podrás hacer cosas más difíciles.
https://excel.facilparami.com
Introducción a VBA
En este capítulo aprenderás qué es VBA, cómo usar el editor de VBA para crear macros usando
código de programación y a editar macros grabadas con la grabadora de macros.
Qué es VBA
VBA significa Visual Basic for Applications, este es un lenguaje de programación hecho por
Microsoft para automatizar cualquier cosa en su suite de oficina Office. Está basado en Visual Basic,
por lo que sus comandos son prácticamente los mismos.
Cada opción, cada botón que presionas, cada cosa que haces en Excel Puede ser realizada mediante
código de VBA, de hecho, cuando grabas una macro usando la grabadora, cada acción que haces se
guarda como código de VBA.
Pero la grabadora de macros tiene sus limitaciones Cuando escribes código de VBA, no existen los
límites. Si puedes hacer algo en Excel, también puedes hacerlo usando VBA.
Este es un ejemplo de código de VBA:
1 Sub formula_a_valor()
2 ' Convierte todas las formulas a valores absolutos
3 '
4 Cells.Select
5 Selection.Copy
6 Range("A1").Select
7 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
8 :=False, Transpose:=False
9 Range("A1").Select
10 End Sub
Lo sé, se ve bastante confuso ahora, pero no te preocupes, aun si nunca has programado. Este libro
está diseñado no solo para enseñarte a utilizar VBA, sino también para enseñarte a programar.
Editor de VBA
Para ingresar al editor de VBA, abre alguna hoja de Excel y presiona las teclas ALT+F11, al hacer esto
verás una ventana como esta:
Introducción a VBA 10
Editor de VBA
Esta está dividida en varias secciones, no te preocupes si no puedes verlas todas en este momento,
esto se debe a que tu hoja de Excel aún no tiene macros.
En la parte superior izquierda verás el explorador de proyectos, cada libro de Excel o archivo se
trata como un proyecto, el código de VBA ira dentro de una carpeta llamada Módulos, dentro de
esta carpeta existirá uno o más archivos que a su vez contiene código de programación (macros). En
la parte derecha hay una ventana, ahí es en donde se puede visualizar el código de las macros.
Existen varios menús y herramientas, pero los iremos viendo en detalle poco a poco para no saturarte
https://excel.facilparami.com
Introducción a VBA 11
con información.
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
1 Range("C1").Select
2 ActiveCell.FormulaR1C1 = "Teléfono"
https://excel.facilparami.com
Introducción a VBA 12
1 Sub encabezados()
2 '
3 ' encabezados Macro
4 '
5
6 '
7 Range("A1").Select
8 ActiveCell.FormulaR1C1 = "Nombre"
9 Range("B1").Select
10 ActiveCell.FormulaR1C1 = "Apellidos"
11 Range("C1").Select
12 ActiveCell.FormulaR1C1 = "Teléfono"
13
14 End Sub
Ahora solo debes de probar la macro y tendrás que ver que automáticamente rellena las celdas A1,
B1 y C1 con los textos que has programado en tu macro.
Ya has modificado tu primera macro escribiendo código. Sé que este ejemplo es muy sencillo y
posiblemente te preguntas cómo sería hacer algo más complicado.
No te preocupes, a medida que avances en esta lectura, iras aprendiendo más trucos y los ejemplos
y ejercicios se irán complicando cada vez más, hasta que te conviertas en un experto.
Comentarios en el código
Si has puesto atención, cuando observas el código que genera la grabadora de macros de Excel,
genera algunos textos, que no son comandos en las macros, estos se llama comentarios y ayudan a
que el código sea más fácil de leer y entender por nosotros los humanos.
Los comentarios son parte fundamental de todo programa, pero muchos programadores no los usan
porque creen que les hace perder el tiempo. Pero en realidad es todo lo contrario, los comentarios
pueden ayudarte a no perder tu tiempo. Voy a explicarte por qué debes utilizar siempre comentarios
en todos los programas que escribas.
Nuestra memoria no siempre es confiable y cuando escribimos código, todo está claro en nuestra
mente, pero rara vez escribimos un programa y no volvemos a verlo o modificarlo nunca. Un
programa debe revisarse y corregirse a lo largo de toda su vida útil.
Entonces ¿qué pasa si debes agregar alguna funcionalidad a una macro 6 meses después de haberla
creado?, lo más probable es que no recuerdes cómo funciona alguna fórmula que usaste, de donde
tomas algún valor o por qué haces algo de una forma, en lugar de otra.
Todos estos problemas (y otros más) se resuelven al leer los comentarios que has escrito en el código.
Ahora que ya sabes por qué debes usar los comentarios, veamos cómo puedes usarlos.
https://excel.facilparami.com
Introducción a VBA 13
Si escribes una comilla simple ', eso indica que toda la línea es un comentario y será ignorada como
código. Y ya que los comentarios no se ejecutan, entonces otro uso que se le da a los comentarios es
el de deshabilitar temporalmente un bloque de código.
Pero si deseas convertir en comentario un bloque grande de código, no es práctico hacerlo línea por
línea, entonces debes activar una barra de herramientas de Excel que te ayude en este proceso.
Haz clic derecho sobre la barra de herramientas actual y selecciona la opción Edición como se
muestra en esta imagen:
Ahora para comentar un bloque, solo marcas el texto y presionas uno de los botones en la barra de
herramientas para comentar o descomentar el bloque. Intenta hacerlo tú mismo.
https://excel.facilparami.com
Introducción a VBA 14
Comentar bloque
Ejercicio
Tan solo hemos iniciado a conocer VBA, entonces el ejercicio de este capítulo es sencillo, debes
grabar una macro (usando la grabadora), haz algo sencillo, por ejemplo una macro que escriba “Hola
mundo” en la celda en donde te encuentres, luego entra al editor de VBA y explora la macro, revisa
el código que se generó e intenta modificar “Hola mundo” por cualquier otro texto, luego corre la
macro y comprueba que lo hiciste bien.
https://excel.facilparami.com
Introducción a la programación
Como has visto hasta ahora, puedes crear macros sin necesidad de programar, todo se ha hecho
usando la grabadora de macros.
Pero para sacar el máximo provecho de las macros de Excel, necesitas crear macros usando código de
VBA. Por eso ahora vas a crear tu primer macro desde cero y usando solo código de programación.
Pero no te preocupes si nunca has programado, porque este capítulo cubre todos los conceptos básicos
de programación.
Lista de productos
Ahora presiona las teclas Alt+F11 para abrir el editor de VBA y haz clic derecho sobre el proyecto
VBAProject con el nombre de tu hoja de cálculo y selecciona la opción de menú Insertar > Módulo
Introducción a la programación 16
Insertar modulo
Ahora vas a crear una subrutina, todas las macros que creas en la grabadora son subrutinas. Para
crearla solo debes escribir algo como esto:
1 Sub calcula_precios()
2
3 End Sub
En donde Sub y End Sub marcan el inicio y el fin de la subrutina, la palabra calcula_precios es el
nombre de tu macro y siempre va seguido de paréntesis. Dentro de los paréntesis pueden ir algunos
parámetros, pero vamos a dejarlo de esta forma por ahora.
Acabas de crear una macro vacía, para que funcione necesita algo de código (instrucciones de lo que
debe hacer), ahora puedes modificarla de forma que te quede así:
https://excel.facilparami.com
Introducción a la programación 17
1 Sub calcula_precios()
2
3 Dim costo
4 Dim fila As Integer
5
6 'Coloca encabcezado
7 Range("D1").FormulaR1C1 = "Precio"
8
9 'Recorrer todas las filas
10 fila = 2
11 costo = Range("C" & fila).FormulaR1C1
12 Do While IsNumeric(costo) 'Procesar mientras el costo sea un numero
13 'Calcular el precio
14 Range("D" & fila).FormulaR1C1 = costo * 1.3
15
16 'Pasar a las siguiente fila y leer el costo
17 fila = fila + 1
18 costo = Range("C" & fila).FormulaR1C1
19 Loop
20
21 End Sub
Hay mucho código nuevo aquí, no te preocupes por ahora, voy a ir explicando algunos conceptos
que necesitas para comprender todo. Por el momento puedes descargar la hoja de cálculo y hacer
unas pruebas ejecutando la macro.
Puedes descargar la hoja de Excel junto con su macro haciendo clic aquí².
Funciones o subrutinas
En VBA usualmente ingresas el código en una función o en una subrutina, ambos términos se
refieren a fragmentos de códigos que realizan una tarea específica y puede ser llamados las veces
que necesites. Realmente no hay una limitante sobre la cantidad de tareas que pueda realizar una
subrutina o una función, esto es simplemente una buena práctica, ya que de esta forma puedes
reutilizar el código fácilmente, es menos propenso a errores y es más fácil de modificar o mejorar.
Ahora, la diferencia entre una función y una subrutina es que la función puede regresar un valor,
por ejemplo, puedes crear una función que reciba como parámetro un código de cliente y regrese el
nombre del cliente. En cambio, las subrutinas no pueden regresar ningún valor.
El ejemplo más común de funciones son las funciones que vienen en Excel, por ejemplo, la función
SUMA que recibe un rango de celdas y regresa la suma de todos sus valores. Un ejemplo de una
²https://my.pcloud.com/publink/show?code=XZLyWE7ZsQiRtGafe8Y3Wp5zRw9FpVB9DgoX
https://excel.facilparami.com
Introducción a la programación 18
subrutina es una macro que genera un reporte de Excel, esta subrutina no regresa ningún valor, pero
si puede realizar cambios en una hoja de Excel. Las funciones también pueden hacer cambios en una
hoja de Excel, pero su uso habitual es devolver un valor.
Otra diferencia importante es que solo puedes llamar macros desde una hoja de Excel a aquellas
que has creado como subrutinas que no lleven ningún parámetro. Puedes hacer la prueba con la
subrutina que acabas de crear.
Insertar modulo
https://excel.facilparami.com
Introducción a la programación 19
Los nombres de variables no pueden llevar espacios y solo deben contener letras o números, pero
puedes usar algunos caracteres como el guion bajo para separar palabras. También hay algunos
nombres que no puedes usar, estos nombres se conocen como palabras reservadas.
Algunas de estas palabras que no puedes usar son: Function, Sub, Dim, etc. Para una lista completa
puedes consultar este artículo que detalla todas las palabras reservadas³.
Ahora, para declarar una variable utilizas la palabra Dim seguida del nombre de tu variable y
opcionalmente la palabra as seguida del tipo de datos, por ejemplo, para declarar una variable
llamada fila y de tipo numérico usamos un código como este:
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.
³https://excel.facilparami.com/2019/04/palabras-reservadas-en-vba
https://excel.facilparami.com
Introducción a la programación 20
Ahora te verás obligado a declarar siempre cada variable que utilices, pero a cambio ahorrarás mucho
tiempo tratando de encontrar errores lógicos. Para declarar una variable puedes usar cualquiera de
estos tipos de datos:
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:
Como puedes notar los valores numéricos se colocan tal y como los ves, pero los valores de texto se
escriben entre comillas dobles. Ahora que tienes valores definidos en tus variables, puedes utilizarlos
en tu macro, veamos un ejemplo sencillo del uso de variables, donde tendremos una macro que
actualiza el contenido de una celda.
1 Sub variables()
2 Dim texto As String
3
4 texto = "Hola mundo"
5
6 'Accedemos y cambiamos el contenido de la celda activa
7 ActiveCell.FormulaR1C1 = texto
8
9 End Sub
https://excel.facilparami.com
Introducción a la programación 21
Intenta crear y ejecutar la macro anterior en una hoja de Excel, y verás que una vez que hayas
asignado un valor a la variable texto, podrás usarla y la macro entenderá que debe usar el valor
asignado en la variable. Modifica el valor de la variable texto y revisa lo que pasa cuando la ejecutas
de nuevo.
Una vez que crees la subrutina anterior puedes ejecutarla posicionando el cursor sobre cualquier
parte de su código y luego presionando la tecla F5 o presionando el botón Ejecutar.
Nota: Con ActiveCell.FormulaR1C1 puedes acceder al valor de la celda actual, esto es algo
muy útil en muchas macros y a lo largo de este libro vas a aprender muchas otras cosas
que te serán de utilidad al crear macros.
El contenido de una variable puede ser modificado en cualquier momento, esta es la única diferencia
entre una variable y las constantes. Para declarar una constante utilizas la palabra Const seguida del
nombre de la constante, el tipo de datos y su valor. Aquí hay un ejemplo en que se define una
constante llamada FactorIVA de tipo single y con valor 0.13
Const FactorIVA As Single = 0.13
Quizá te preguntes por que declarar la constante anterior, si puedes usar su valor 0.13 y sabes que
no va a cambiar, bueno hay dos razones muy importantes por las que debes usar constantes en lugar
de los valores:
Para el caso anterior 0.13 es el factor para el IVA (un impuesto) y cuando estas leyendo el código de
tu macro es más fácil de entender cuando usas constantes mira estos dos ejemplos idénticos y piensa
cual es más legible:
https://excel.facilparami.com
Introducción a la programación 22
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.
https://excel.facilparami.com
Introducción a la programación 23
Como vemos, el tamaño se declara 1 to 25 entre paréntesis, con eso indicamos que el índice va
desde 1 hasta 25.
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:
Si no conoces la cantidad de posiciones que vas a necesitar, puedes declarar un arreglo dinámico
sin detallar la cantidad de posiciones y luego redimensionarlo con la sentencia ReDim, aquí hay un
ejemplo:
https://excel.facilparami.com
Introducción a la programación 24
1 Sub Arreglos()
2
3 'Arreglo dinamico, no detallamos la cantidad de posiciones
4 Dim ListaSupermercado() As String
5
6 'Asignamos una cantidad inicial
7 ReDim ListaSupermercado(1 To 1)
8
9 ListaSupermercado(1) = "Pollo"
10
11 'Ahora lo cambiamos a 2 posiciones, pero usamos
12 'la palabra Preserve para no perder los datos
13 'que ya teniamos
14 ReDim Preserve ListaSupermercado(1 To 2)
15 ListaSupermercado(2) = "Queso"
16
17 MsgBox ListaSupermercado(1) & " y " & ListaSupermercado(2)
18
19 End Sub
Ahora puedes cambiar en cualquier momento la cantidad de elementos, pero ahora es más difícil
saber si estás haciendo referencia a un elemento que no existe, pero esto se puede solucionar con las
funciones LBound y UBound, las cuales regresan el índice inferior y superior, respectivamente. Veamos
de nuevo unos ejemplos:
1 Sub Arreglos()
2
3 'Arreglo dinamico, no detallamos la cantidad de posiciones
4 Dim ListaSupermercado() As String
5 Dim indice As Integer
6
7 'Asignamos una cantidad inicial
8 ReDim ListaSupermercado(1 To 2)
9
10 ListaSupermercado(1) = "Pollo"
11 ListaSupermercado(2) = "Queso"
12
13 'Obtener el indice inferior y superior para recorrer el arreglo
14 For indice = LBound(ListaSupermercado) To UBound(ListaSupermercado)
15 MsgBox ListaSupermercado(indice)
16 Next indice
17
18 End Sub
https://excel.facilparami.com
Introducción a la programación 25
También puedes usar estas funciones para obtener el primer y el último elemento de un arreglo o
para validar si el arreglo tiene un índice, antes de intentar leerlo.
1 If evaluación Then
2 'Bloque de codigo si la condicion es cierta
3 Else
4 'Bloque de codigo si la condicion es falsa
5 End If
La evaluación debe ser una expresión que regrese falso o verdadero, la palabra else separa los
bloques de código que se ejecuta cuando la evaluación es verdadera o falsa y las palabras End If
marcan el fin de la decisión. Esto se verá mejor con un ejemplo, abre un archivo de Excel para crear
y ejecutar esta macro:
1 Sub decisiones()
2
3 Dim edad As Integer
4
5 edad = 15
6 If edad >= 18 Then
7 MsgBox "Ya eres mayor de Edad"
8 Else
9 MsgBox "Eres menor de edad"
10 End If
11
12 End Sub
En la macro anterior la decisión consiste en evaluar si la edad es mayor o igual a 18, luego usamos
la función MsgBox de VBA para mostrar un mensaje en la pantalla. Intenta cambiar el valor de la
variable edad para ver cómo se comporta.
En el código anterior usamos el signo >=, esta es una comparación entre dos valores. Las compara-
ciones que puedes hacer son:
https://excel.facilparami.com
Introducción a la programación 26
Operador Resultado
= Verdadero, si ambos valores son iguales, sino regresa Falso
<> Verdadero, si ambos valores son diferentes, sino regresa Falso
> Verdadero, si el primer valor es mayor que el segundo, sino regresa Falso
< Verdadero, si el primer valor es menor que el segundo, sino regresa Falso
>= Verdadero, si el primer valor es mayor o igual que el segundo, sino
regresa Falso
<= Verdadero, si el primer valor es menor o igual que el segundo, sino
regresa Falso
Tanto en la vida como en las macros, las decisiones no siempre son sencillas, puedes necesitar hacer
más de una evaluación y para esto necesitas operadores lógicos para unir todas las evaluaciones que
necesites.
Por ejemplo, si vas a aplicar un descuento especial y necesitas que la cantidad que compren sea
mayor a 10 unidades y que además el cliente sea de categoría “vip” entonces necesitas un operador
lógico para unir ambas condiciones. Veamos un ejemplo:
1 Sub OperadoresLogicos()
2 Dim categoria As String
3 Dim cantidad As Single
4 Dim precio As Currency
5
6 cantidad = 10
7 categoria = "vip"
8 precio = 100
9
10 'Evaluar descuento
11 If cantidad >= 10 And categoria = "vip" Then
12 'Aplicar 30% de descuento
13 precio = precio * 0.7
14 MsgBox "El nuevo precio es " & precio
15 End If
16 End Sub
Si buscas la sentencia (bloque de código) if veras que hay dos comparaciones unidas por una palabra
And, esta es un operador lógico. Intenta cambiar los valores de las variables cantidad y categoria
para ver si aplica el descuento.
En total existen 3 operadores lógicos los cuales son: And, Or y Not.
El operador And trabaja sobre dos expresiones a su izquierda y derecha y si ambas expresiones son
verdaderas entonces regresa verdadero, pero si cualquiera de las dos es falso, entonces regresa falso.
El operador Or también trabaja sobre dos expresiones a su izquierda y derecha y si cualquiera
de las expresiones es verdadero entonces regresa verdadero y regresa falso únicamente si ambas
expresiones son falsas.
https://excel.facilparami.com
Introducción a la programación 27
El operador Not trabaja solamente sobre la expresión a su derecha, lo que hace es invertirla o negarla,
por ejemplo, si la expresión es falsa, entonces regresa verdadero y si la expresión es verdadera
entonces regresa falso.
Veamos una tabla con algunos ejemplos:
Expresión Resultado
1 = 1 And 1=2 Falso (el primero bloque es cierto, pero el segundo es falso entonces
todo es falso)
1 = 1 And 2=2 Verdadero (ambas expresiones son verdaderas)
1 = 1 Or 1 = 2 Verdadero (la primera expresión es verdadera, entonces no importa
el resultado de la segunda)
1 = 2 Or 2 = 2 Verdadero (la segunda expresión es verdadera, entonces no importa
el resultado de la primera)
1 = 2 Or 2 = 1 Falso (Ambas expresiones son falsas)
Not 1 = 1 Falso (La expresión es verdadera, pero esta negada)
Not 1 = 2 Verdadero (La expresión es falsa, pero esta negada)
Cuando usamos una expresión if, la parte del else es opcional y también debes de saber que puedes
anidar sentencias if, para comprender mejor esto, veamos un ejemplo:
1 Sub OperadoresLogicos()
2 Dim categoria As String
3 Dim cantidad As Single
4 Dim precio As Currency
5
6 cantidad = 10
7 categoria = "vip"
8 precio = 100
9
10 'Evaluar descuento
11 If cantidad >= 10 Then
12 'If anidado: es un if dentro de otro if
13 If categoria = "vip" Then
14 'Aplicar 30% de descuento
15 precio = precio * 0.7
16 MsgBox "El nuevo precio es " & precio
17 End If
18 End If
19 End Sub
El if anidado es un bloque if, dentro de otro bloque if, puedes utilizarlo para tomar decisiones más
complicadas, sin embargo, anidar muchos if puede generar código difícil de leer. Para evitar este
problema existe otra sentencia llamada Select Case, en ella se evalúan varias condiciones y se
puede ejecutar un bloque de código por cada evaluación.
https://excel.facilparami.com
Introducción a la programación 28
Para comprender mejor cuando usar una sentencia if o Select Case veamos una misma macro en
las dos versiones. Imagina que te piden una macro para determinar el descuento que aplica a un
producto en base a la cantidad que compran aplicando estos criterios:
La macro usando if que resuelve este problema es la siguiente (como siempre debes crear y probarla
en tu computadora)
1 Sub DescuentoIf()
2 Dim cantidad As Single
3 Dim descuento As Single
4 cantidad = InputBox("Ingrese cantidad")
5
6
7 If cantidad > 50 Then
8 descuento = 25
9 Else
10 If cantidad > 40 Then
11 descuento = 20
12 Else
13 If cantidad > 30 Then
14 descuento = 15
15 Else
16 If cantidad > 20 Then
17 descuento = 10
18 End If
19 End If
20 End If
21 End If
22
23 MsgBox "El descuento es de " & descuento & "%"
24 End Sub
Como puedes observar, tantos if anidados puede ser algo confuso. También debes notar que he
introducido la función InputBox que permite preguntar al usuario un valor y guardarlo en una
variable, esto hará que sea más fácil probar esta macro. Después de probar esta macro intenta probar
la versión Select Case y verás que el resultado es el mismo, pero el código es más limpio y fácil de
entender.
https://excel.facilparami.com
Introducción a la programación 29
1 Sub DescuentoSelectCase()
2 Dim cantidad As Single
3 Dim descuento As Single
4 cantidad = InputBox("Ingrese cantidad")
5
6 Select Case cantidad
7 Case 0 To 20
8 descuento = 0
9 Case 21 To 30
10 descuento = 10
11 Case 31 To 40
12 descuento = 15
13 Case 41 To 50
14 descuento = 20
15 Case Else
16 descuento = 25
17 End Select
18
19 MsgBox "El descuento es de " & descuento & "%"
20 End Sub
Posiblemente ya descifraste la forma de usar la sentencia Select Case, pero si no lo has hecho, voy
a explicar con mayor detalle cómo se usa. Todo el bloque se define entre las palabras Select Case
Variable y finalizan con End Select, luego hay una o más sentencias Case con una expresión y su
respectivo bloque de código. Existe un caso Else que es el que se ejecuta si ninguno de los casos
anteriores fue ejecutado.
Como ya habrás notado, la sentencia Select Case es un poco más compleja que la sentencia if,
pero más fácil de leer cuando hay varias posibles opciones a una decisión. Pero la mejor forma de
dominar esta sentencia es por medio de algunos ejemplos prácticos, afortunadamente puedes leer
algunos en este artículo⁴.
⁴https://excel.facilparami.com/2019/04/ejemplos-practicos-de-la-sentencia-select-case
https://excel.facilparami.com
Introducción a la programación 30
Operador Descripción
+ Suma
* Multiplicación
/ División
- Resta
^ Exponenciación
\ División entera (regresa solo la parte entera, sin decimales)
Mod Regresa el residuo de una división, por ejemplo 5 mod 2 = 1
& Concatenar dos cadenas de texto (unir dos textos)
Ya hemos utilizado algunos de estos operadores de los ejemplos anteriores, pero tener esta lista te
servirá como referencia.
Debes declarar una variable que se usará como contador, luego defines un valor inicial y un valor
final, opcionalmente puedes definir el valor del incremento con la instrucción Step que de forma
predeterminada es 1, si piensas hacer incrementos de 1 puedes no usarla.
El ciclo funcionará así: si la variable tiene un valor inicial de 1, un valor final de 5 y un incremento
(step) de 1, entonces la primera vez que se ejecuta la variable contiene un 1, la segunda vez la variable
se incrementa a 2, luego a 3, luego a 4 y finalmente se incrementa a 5 y es la última vez que se ejecuta
el bloque de código.
Por ejemplo, imagina que debes generar una hoja de Excel que contiene el número de filas en la
columna A, y que inicia desde la celda A2, entonces la celda A2 tendrá 1, la celda A3 tendrá 2 y así
sucesivamente hasta llegar a 10. Entonces el código para hacer eso sería este:
https://excel.facilparami.com
Introducción a la programación 31
1 Sub CicloFor()
2 Dim fila As Integer
3
4 For fila = 1 To 10
5 Range("A" & fila + 1) = fila
6 Next fila
7
8 End Sub
La función Range se puede usar para hacer referencia a una celda de la hoja actual, recibe como
parámetro el nombre de la celda por ejemplo A1 pero como sabemos que es la columna A, pero
desconocemos el número de la fila, entonces usamos una concatenación de la A y el contenido de la
variable fila + 1 y le asignamos el contenido de la variable fila que en cada ciclo contendrá 1, 2,
3…10
El ciclo Do While ejecuta un bloque de código durante un número desconocido de veces, se hace
mientras se cumpla la condición que definimos, por ejemplo, mientras el café este muy caliente. La
sintaxis de este ciclo es:
1 Do While Condicion
2 ' Bloque de codigo
3 Loop
Como vemos, se colocan las palabras Do While seguidas de una condición y se cierra el bloque de
código con una palabra Loop. El bloque de código va a ejecutarse mientras la condición sea verdadera.
Usamos este ciclo en la macro que creamos al inicio del capítulo, aquí está de nuevo para que la
recuerdes:
1 Sub calcula_precios()
2
3 Dim costo
4 Dim fila As Integer
5
6 'Coloca encabcezado
7 Range("D1").FormulaR1C1 = "Precio"
8
9 'Recorrer todas las filas
10 fila = 2
11 costo = Range("C" & fila).FormulaR1C1
12 Do While IsNumeric(costo) 'Procesar mientras el costo sea un numero
13 'Calcular el precio
14 Range("D" & fila).FormulaR1C1 = costo * 1.3
15
https://excel.facilparami.com
Introducción a la programación 32
Creamos una variable llamada costo con el contenido de la celda que corresponde la fila que
estamos procesando, luego usamos la función IsNumeric para preguntar si su valor es un número,
así sabremos si ya hemos terminado, porque no encontrará un número, sino una celda vacía cuando
termine de procesar todas las filas con datos.
También debes notar que ahora usamos Range("C" & fila).FormulaR1C1 en lugar de solo Range("C"
& fila), hacemos esto para poder usar la función IsNumeric ya que Range("C" & fila) convertirá
el valor vacío a un cero y entonces IsNumeric siempre va a regresar Verdadero. FormulaR1C1 regresa
el contenido de la celda sin hacer ninguna conversión.
Hay algo muy importante que debes conocer, como ves este ciclo se repite un valor indefinido de
veces y al final de este ciclo, he actualizado el valor de la variable costo, con el contenido de la
siguiente fila, si no hago esto entonces la comparación que hace el ciclo no va a cambiar nunca y el
resultado será siempre verdadero, no habrá forma de terminar el ciclo y esto se conoce como ciclo
infinito, tu computadora quedara atrapada en un ciclo sin fin hasta que reinicies tu computadora o
termines el proceso con el administrador de tareas.
También existen algunas variantes de este ciclo y son las siguientes:
Repetir mientras la condición sea falsa, se termina si la condición es verdadera.
1 Do Until Condicion
2 'Bloque de Codigo
3 Loop
Repetir al menos una vez sin importar la condición, y luego repetir mientras la condición sea
verdadera.
1 Do
2 'Bloque de Codigo
3 Loop While Condicion
Repetir al menos una vez sin importar la condición, y luego repetir mientras la condición sea falsa.
1 Do
2 'Bloque de Codigo
3 Loop Until Condicion
https://excel.facilparami.com
Introducción a la programación 33
Ejercicio
El ejercicio de este capítulo es sencillo, con la macro que creamos al inicio y con lo que has aprendido
trata de hacer algunas modificaciones, por ejemplo:
1. 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.
https://excel.facilparami.com
Introducción a la programación 34
1. Motor sobre calentado: Envía señal informando que el motor está muy caliente.
2. Gasolina a nivel mínimo: Envía señal informando que la gasolina está por terminarse.
Esa fue la clase vehículo, entonces cuando quieres crear un vehículo en específico por ejemplo un
Mazda3, lo declaras como un objeto de la clase vehículo (como cuando declaras una variable) y este
obtiene toda la definición de la clase, puedes consultar su velocidad actual, acelerarlo, frenarlo y
apagarlo.
Ahora veamos cómo se aplica esto a Excel, existe una clase llamada Workbook (en español seria
Libro, es decir un archivo de Excel) y cada vez que se crea o se abre un archivo de Excel se crea un
objeto con la definición de esa clase. Este objeto va a tener muchos métodos, propiedades y eventos,
pero voy a mencionar solo un ejemplo de cada uno.
• Método Save: Guarda el libro, este método se usa cuando presionas el botón guardar.
• Propiedad Sheets: Guarda una referencia a todas las hojas de este libro, en este caso cada hoja
es otro objeto, entonces un objeto puede contener más objetos almacenados como propiedades.
• Evento BeforeSave: Este evento te avisa que el libro está a punto de ser guardado, usualmente
usamos este evento para validar que todo esté bien antes de guardar o para guardar información
adicional antes de guardar.
Objetos de Excel
Ahora que ya sabes que son los objetos, es hora de conocer los objetos más importantes para trabajar
con macros en Excel.
Application
Este objeto representa la aplicación de Excel, desde aquí puedes acceder a todo, a los libros, las
hojas de cada libro, las celdas y todo su contenido. Para nuestra conveniencia hay algunos objetos
que se puede acceder directamente sin hacer referencia a este objeto, aunque todos estén dentro de
este objeto Application, sin embargo, hay algunas opciones de configuración que solo puede ser
utilizadas desde aquí.
Workbooks
Es en realidad una colección de objetos, aquí se encuentran todos los objetos Workbook, los cuales
a su vez representan un libro o archivo de Excel. Desde aquí puedes acceder a todos los libros que
están abiertos y crear o abrir otros.
https://excel.facilparami.com
Introducción a la programación 35
Sheets
Se encuentra dentro de un objeto Workbook y es una colección que contiene todas las hojas del
libro al que pertenece, desde cada hoja individual puedes acceder a todo lo relacionado ella, como
su nombre y celdas, Además desde esta colección puedes crear, eliminar o modificar las hojas del
libro.
Range
Ya usamos anteriormente este objeto, y puede representar una celda individual o un rango de celdas
el cual puede abarcar todas las celdas de la hoja a la que pertenece.
Para dejar todo más claro aquí hay una imagen con la jerarquía de cómo están organizados todos
estos objetos.
## Referencias a objetos
La forma larga para acceder a cada objeto es a través de la jerarquía que vimos anteriormente, por
ejemplo, para acceder a la celda A1 de la primera hoja, del primer libro abierto seria esta:
1 Application.Workbooks(1).Sheets(1).Range("A1")
https://excel.facilparami.com
Introducción a la programación 36
Como Workbooks es una colección de libros, debemos decir entre paréntesis, a cuál libro queremos
referenciar, y lo hacemos por el número de 1 a n, o también por su nombre, aunque lo más probable
es que no vamos a conocer el nombre del libro. Lo mismo ocurre con el objeto Sheets.
La buena noticia es que existen referencias o atajos para no tener que escribir tanto para llegar al
objeto que necesitamos, las referencias a objetos más utilizadas son:
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.
https://excel.facilparami.com
Introducción a la programación 37
https://excel.facilparami.com
Introducción a la programación 38
Agregar un evento
Al hacer eso, Excel va a generar una plantilla para el evento como esta:
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:
Si tienes algún problema para crear la macro, puedes descargarla haciendo clic aquí⁵. Para probarla
debes borrar el valor en la celda A1 e intentar guardar los cambios.
⁵https://my.pcloud.com/publink/show?code=XZc8iE7ZsBUoilhT0UyjDe8C9inQqm5VkyAX
https://excel.facilparami.com
Introducción a la programación 39
Ejemplo practico
Ya tenemos bastante teoría hasta ahora, ya es tiempo de ver cómo aplicar todo esto mediante un
ejemplo. Imagina que tienes un libro de Excel con 3 listas de precios: Clientes regulares, Clientes al
mayoreo y Clientes VIP. Cada lista de precios está en una hoja diferente, pero en el mismo libro y si
un cliente te solicita la lista de precios no puedes enviarle las 3 listas, además la lista contiene una
columna de costo y no quieres que el cliente conozca tus costos, pero si tus precios.
Puedes descargar una hoja con la macro ya hecha para que puedas probarla, haciendo clic
en este enlace⁶
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.
Ahora vamos a crear la macro que haga el resto del trabajo, el código es el siguiente:
⁶https://my.pcloud.com/publink/show?code=XZNO7O7ZDo7kOteNyVbcpxdJymoktphcqsKy
https://excel.facilparami.com
Introducción a la programación 40
En el código anterior, primero declaramos algunas variables, en las que LibroNuevo y LibroActual
son de la clase Workbook, en ese caso van a ser objetos y para asignar objetos no es suficiente utilizar
el signo = también tienes que anteponer la palabra let tal y como se ve en la línea:
https://excel.facilparami.com
Introducción a la programación 41
La macro es realmente sencilla, pero los más probable es que te estés preguntando, como harías para
saber que métodos o propiedades utilizar si quisieras hacer otra cosa, por ejemplo, imprimir una
hoja.
Con el tiempo y la práctica vas a conocer muy bien todos estos objetos, pero para comenzar puedes
usar la documentación, para acceder a ella, desde el editor de VBA presionas la tecla F2 y veras una
pantalla como esta:
Examinador de objetos
En la parte izquierda se encuentra una lista de todas las clases (yo use la clase Sheets para acceder a
las hojas) y cuando seleccionas una clase, en la parte derecha puedes ver la lista de propiedades (las
que tienen un icono con una mano) y métodos (los que tienen un icono con un rectángulo verde).
Si tienes dudas de cómo usar algún método, puedes hacer clic derecho y seleccionara Ayuda del
menú contextual. Eso te llevara a una página web como ésta, con más detalle:
https://excel.facilparami.com
Introducción a la programación 42
Ayuda de clases
Ejercicio
En el capítulo 3 hicimos una macro que calculaba el precio en base a un costo, modifica esa macro
para que además de generar la columna de precios, también genere dos hojas más, en ese mismo
archivo con diferentes precios basados en márgenes de 30%, 25% y 20%.
https://excel.facilparami.com
Extendiendo Excel
Ahora que ya tienes conocimientos más profundos sobre VBA y los objetos de Excel, es hora de
extender un poco a Excel y agregar algunas cosas que nos ayuden a trabajar más rápido, como
empaquetar algunos cálculos que realices con frecuencia y convertirlos en funciones o ir un poco
más allá y convertir macros en complementos de Excel que puedas usar en todas las hojas de Excel.
Ahora si regresamos a la hoja de Excel, podemos seleccionar una celda y hacer clic sobre el botón
para insertar una función. En el cuadro de diálogo que aparezca podemos seleccionar la categoría
Definida por el usuario y luego se nos presenta la lista de funciones disponibles. Podemos
seleccionar la que acabamos de crear y utilizarla para calcular el precio (la función recibe un único
parámetro y es el costo)
Extendiendo Excel 44
Entonces para crear tus propias funciones, solo debes crear una función en VBA que reciba los
parámetros que necesites y que regrese un valor, ese valor que regrese será el valor que se muestre
en la celda que uses.
Ahora hay algunos problemas que debemos resolver, tú conoces muy bien la fórmula que creaste y
sabes para que sirve y que parámetros usas, pero otras personas no lo saben y es por eso que debes
agregar descripciones a la función y a sus parámetros.
https://excel.facilparami.com
Extendiendo Excel 45
https://excel.facilparami.com
Extendiendo Excel 46
Descripción de funciones
Vamos a usar como ejemplo la función que ya creamos, sigue los pasos anteriores y la macro debe
de quedar de esta forma:
Primero declaramos un arreglo, en este caso será de 1 a 1, porque solo hay un parámetro, luego
asignamos la descripción del parámetro al elemento 1 del arreglo. Finalmente usamos la función
Application.MacroOptions con 3 parámetros: (1) el nombre de la macro, (2) la descripción de la
macro y (3) el arreglo que contiene las descripciones de los parámetros.
Ahora, como esta macro se creó en el evento Open, deberás cerrar el libro y volver a abrirlo para
que tome los cambios o ejecutar el evento manualmente la primera vez.
Nota: VBA no tiene ningún signo que defina el fin de línea, como un punto o punto y
coma, entonces se entiende que la instrucción o sentencia termina cuando haces un salto
de línea, pero puedes escribir una sentencia en varias líneas si escribes un guion bajo
para indicar que la sentencia continua en la siguiente línea, tal y como lo hice en la macro
anterior. Esto hace que la macro sea más legible en los casos en que el código es demasiado
largo para verse completamente en la pantalla.
https://excel.facilparami.com
Extendiendo Excel 47
Veamos como seria ahora, si tuviéramos que registrar dos o más macros y con más de un parámetro.
La forma más ordenada seria creando una macro para generar las descripciones de cada macro y
luego llamarlas desde el evento Open de esta forma:
Puedes descargar este ejemplo con las dos funciones haciendo clic aquí⁷.
Parámetros opcionales
En ocasiones podemos tener una función con parámetros opcionales, imaginemos una función para
aplicar un descuento que recibe el precio y el tipo de cliente. Dependiendo de si el tipo de cliente es
VIP o no, se aplicará un descuento diferente, si no se define un tipo de cliente entonces se aplica el
descuento mínimo que es 5%.
Para definir que el parámetro es opcional se antepone la palabra Optional al nombre del parámetro
y al final se puede definir un valor predeterminado, el cual se asigna automáticamente cuando
omitimos su valor al llamar a la función. Veamos la definición de los parámetros en este ejemplo:
⁷https://my.pcloud.com/publink/show?code=XZt1YO7ZLsiRr5DGnwRDr58Ha5su0RC4O3Ck
https://excel.facilparami.com
Extendiendo Excel 48
Ahora, si usas esa función, verás que, si no defines el segundo parámetro, toma el valor predetermi-
nado y aplica el 5% de descuento.
https://excel.facilparami.com
Extendiendo Excel 49
Instalar complementos
⁸https://excel.facilparami.com
⁹https://my.pcloud.com/publink/show?code=XZlMxz7Zvw3VmJyECY4BOueWgSR9RJnlvLt7
https://excel.facilparami.com
Extendiendo Excel 50
Ahora tienes el complemento instalado, has ganado la función numletras y puedes usarla en
cualquier hoja de Excel.
Probar complemento
Nota: En ocasiones puede suceder que cuando cierras Excel y lo abres de nuevo, el
complemento desaparece o deja de funcionar, eso pasa por que la ubicación en donde
guardaste el complemento no es de confianza. Puedes solucionar eso siguiendo los pasos
que están en este articulo: Qué hacer si un complemento desaparece cada vez que cierras
Excel¹⁰
https://excel.facilparami.com
Extendiendo Excel 51
desinstalar-complemento
https://excel.facilparami.com
Extendiendo Excel 52
Crear complemento
## Ejercicio
Toma la macro que hiciste en el ejercicio del capítulo 4 y convierte esa hoja en un complemento,
luego instala el complemento en tu Excel y prueba si funciona correctamente.
https://excel.facilparami.com
Corrigiendo Errores
Somos humanos y siempre cometemos errores, lo importante es que aprendemos de ellos y hacemos
lo posible por no repetirlos, entonces es de esperar que al inicio nuestras macros tengan muchos
errores, pero con el tiempo eso va a cambiar. Sin embargo, todo código escrito por humanos
podría contener errores y todos los lenguajes de programación nos proveen de herramientas para
minimizarlos.
En este capítulo voy a explicarte los tipos de errores que puedes esperar y como encontrarlos y
corregirlos.
Errores de sintaxis
Estos errores son los más sencillos de detectar y corregir, ya que el mismo editor de VBA nos advierte
y no permite ejecutar la macro hasta que lo corregimos. Los errores de sintaxis se dan porque nos
hemos equivocado al usar alguna instrucción o no hemos seguido las reglas. Por ejemplo, observa
esta macro y trata de encontrar el error.
1 Sub TengoUnError()
2 Dim numero As Integer
3 If numero >= 0
4 'Hacer algo
5 End If
6 End Sub
Entonces nos equivocamos al omitir la palabra then. Para evitar estos errores vamos a necesitar
obtener un conocimiento de las sentencias de VBA y eso solo nos lo puede dar la práctica, entre más
código escribas, mejor te volverás.
Corrigiendo Errores 54
Una forma de eliminar estos errores es validando los datos antes de usarlos, aquí está el código
anterior con su corrección:
1 Sub divisionEntreCero()
2 Dim precio As Currency
3 Dim cantidadPagos As Single
4 Dim cuota As Currency
5
6 precio = 125
7
8 If cantidadPagos > 0 Then
9 cuota = precio / cantidadPagos
10 Else
11 cuota = precio 'Todo en una sola cuota
12 End If
13
14 End Sub
En este caso resolvimos el error asignado un valor predeterminado para cuando la cantidad de pagos
sea cero, en otros casos no hay forma de asignar un valor predeterminado, entonces lo mejor es
detener la ejecución y emitir un mensaje de error.
https://excel.facilparami.com
Corrigiendo Errores 55
1 Sub divisionEntreCero()
2 Dim precio As Currency
3 Dim cantidadPagos As Single
4 Dim cuota As Currency
5
6 precio = 125
7
8 If cantidadPagos > 0 Then
9 cuota = precio / cantidadPagos
10
11 '... continuar con el codigo
12
13 Else
14 '... detener todo y emitir mensaje de error
15 MsgBox "Por favor defina una cantidad de pagos para continuar"
16 End If
17
18 End Sub
Los errores en tiempo de ejecución son difíciles de predecir, la mejor forma de evitarlos es realizando
pruebas del código con valores que no esperamos, por ejemplo, si tu macro calcula la edad de una
persona y solicita como parámetro la fecha de nacimiento, intenta enviarle una fecha futura como
12/12/2099 y mira cómo se comporta. En el mundo real nuestros programas no siempre obtienen
datos validos o los datos que esperan.
Errores lógicos
Estos son los errores más difíciles de detectar y corregir, se dan por que el programa ha implemento
un código equivocado, por ejemplo, imagina que debes calcular el margen de un producto y sabes
que la fórmula para eso es:
Entonces si implementas esa fórmula, pero terminas con un código como este:
No vas a obtener un error visible, simplemente un mal cálculo por haber invertido (por error) las
variables de la fórmula. Nuevamente, la única forma de detectar estos errores es probando tu código y
revisando si genera los resultados esperados. Una vez detectas que tu programa tiene errores lógicos,
lo que sigue es realizar un proceso de depuración.
https://excel.facilparami.com
Corrigiendo Errores 56
Lo primero que debes de saber es que no puedes iniciar la depuración con una función, si deseas
depurar la función entonces necesitas crear una subrutina que llame a la función e iniciar la
depuración ejecutando la subrutina. Entonces agregas este código:
https://excel.facilparami.com
Corrigiendo Errores 57
https://excel.facilparami.com
Corrigiendo Errores 58
Ahora has iniciado la ejecución de código paso a paso, para avanzar puedes presionar las teclas F8,
Mayus+F8, Cltr+Mayus+F8 o Ctrl+F8.
Opciones de ejecución
Cada tecla o combinación hacen algo diferente, si presionas F8 iras avanzado instrucción por
instrucción y si la instrucción es la llamada a otra función o subrutina, entonces ingresarás a esa
https://excel.facilparami.com
Corrigiendo Errores 59
Nota: Para comprender mejor todo esto, lo mejor es que lo intentes tú mismo, puedes
descargar esta hoja de ejemplo en este enlace¹¹.
Puntos de interrupción
Los puntos de interrupción son líneas de código que marcas para que cuando la ejecución del código
llegue a esa línea, el programa se interrumpa e inicie el modo de depuración justo desde esa línea.
Para establecer un punto de interrupción solo debes hacer clic en la barra gris que está a la izquierda
del código, cuando lo hagas se activará un punto de interrupción justo en la línea de código que este
en esa altura. Sabrás que hay un punto de interrupción cuando veas un círculo rojo en esa barra.
Debes saber que solamente se pueden crear puntos de interrupción para líneas de código ejecutables,
es decir, no puedes hacerlo para líneas como declaraciones de variables. Para desactivar un punto
de interrupción solo debes de hacer clic sobre el círculo rojo que corresponde al que deseas eliminar.
Has unas pruebas, para que veas como funciona esta parte
Punto de interrupción
¹¹https://my.pcloud.com/publink/show?code=XZq3xO7ZXfM6ec7doVSQAV1sqRd65LXPpuPX
https://excel.facilparami.com
Corrigiendo Errores 60
Inspeccionar variables
La inspección de variables permite visualizar el contenido de las variables, solo debes de estar en
modo de depuración. Existen dos formas para ver el valor de la variable, la primera es colocando el
puntero del mouse sobre la variable y esto hará que aparezca un mensaje tipo “tooltip” para mostrar
la variable y su valor actual, tal y como se ve en esta pantalla:
Inspeccionar un valor
La segunda forma es agregando un punto de inspección, para esto haces clic derecho sobre la variable
que desees y seleccionas la opción de menú Agregar inspección...
https://excel.facilparami.com
Corrigiendo Errores 61
Agregar inspección
Agregar inspección
Ahora se abrirá una ventana con todas las variables que estés inspeccionando y mostrará su valor
actual. De esta otra forma puedes monitorear un conjunto de variables. Esto te ayudará a revisar si
tu código está calculando los valores de la forma en que tú esperas que lo haga.
https://excel.facilparami.com
Corrigiendo Errores 62
Inspecciones
https://excel.facilparami.com
Corrigiendo Errores 63
Para poder ver estos mensajes primero debes mostrar la ventana Inmediato, esto se logra con el
menú Ver y la opción Ventana Inmediato
ventana-inmediato
Ahora si ejecutas el código, verás los mensajes de depuración, en esta macro se llamó a la función 3
veces con diferentes parámetros y en la ventana inmediato, está el resultado de cada llamado.
https://excel.facilparami.com
Corrigiendo Errores 64
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:
https://excel.facilparami.com
Corrigiendo Errores 65
Error en ejecución
Como puedes ver el mensaje no es nada amigable y el usuario solo podrá pensar que el programa
“no sirve” y que no puede hacer nada para solucionar este problema, cuando la verdad es que el
mismo usuario puede solucionar el problema con solo cambiar el nombre de la hoja, pero no lo hace
porque no sabe que ese es el problema.
Tenemos dos opciones para tratar este problema, la primera es detener toda la ejecución y mostrar
un mensaje indicando el problema, y la segunda es, ignorar el error y continuar con la ejecución del
código restante. La decisión que tomes va a depender de lo critico que consideres que sea el error,
solo responde esta pregunta: ¿El no haber ejecutado esta instrucción afectará el comportamiento del
código que hace falta ejecutar o dará un resultado equivocado al usuario?
Una vez tomes la decisión, la forma para ignorar el error y continuar con la ejecución es colocando
esta instrucción al inicio de la subrutina o función:
https://excel.facilparami.com
Corrigiendo Errores 66
Para terminar el programa y mostrar un mensaje de error, debes colocar esta línea de código al inicio
de la función o subrutina:
https://excel.facilparami.com
Corrigiendo Errores 67
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:
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:
https://excel.facilparami.com
Corrigiendo Errores 68
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.
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
msgbox1
1 `Sub msgbox2()
2 If MsgBox("Este proceso va a sobre-escribir el libro", vbExclamation + vbOKCancel) \
3 = vbOK Then
4 'El usuario acepta continuar
5 Else
6 'El usuario cancela la operacion
7 End If
8 End Sub`
Debes de notar, que para que la función regrese el valor, debes colocar todos los parámetros entre
paréntesis. En este caso preguntamos si el valor de retorno es vbOK (el usuario presiono el botón
Ok), para una lista completa de los valores de retorno puedes consultar esta lista:
https://excel.facilparami.com
Mensajes y cuadros de diálogo 72
1 Function AbrirArchivo()
2 ' Crear un objeto de tipo FileDialog.
3 Dim fd As Office.FileDialog
4 Set fd = Application.FileDialog(msoFileDialogFilePicker)
5
6 ' Titulo del formulario
7 fd.Title = "Seleccione un archivo de texto"
8
9 ' Podemos agregar filtros para que solo muestre ciertas
10 ' extensiones de archivos
11 ' El metodo Add, recibe dos parametros:
12 ' 1: Una descripcion
13 ' 2: Un filtro, en este caso *.txt
14 fd.Filters.Add "Archivos de texto", "*.txt"
15
16 ' Mostrar el cuadro de dialog.
17 If fd.Show = True Then
18 If fd.SelectedItems.Count > 0 Then
19 Debug.Print fd.SelectedItems(1) ' Obtiene el archivo y ruta.
20 Debug.Print Dir(fd.SelectedItems(1)) ' Solo el nombre del archivo.
21
https://excel.facilparami.com
Mensajes y cuadros de diálogo 73
1 Function SeleccionarCarpeta()
2 ' Crear un objeto de tipo FileDialog.
3 Dim fd As Office.FileDialog
4 Set fd = Application.FileDialog(msoFileDialogFolderPicker)
5
6 ' Titulo del formulario
7 fd.Title = "Seleccione una carpeta"
8
9 ' Mostrar el cuadro de dialog.
10 If fd.Show = True Then
11 If fd.SelectedItems.Count > 0 Then
12 Debug.Print fd.SelectedItems(1) ' Carpeta seleccionada.
13
14 ' Regresa el archivo con su ruta
15 SeleccionarCarpeta = fd.SelectedItems(1)
16 End If
17 End If
18 End Function
https://excel.facilparami.com
Mensajes y cuadros de diálogo 74
1 Function GuardarArchivo()
2 ' Crear un objeto de tipo FileDialog.
3 Dim fd As Office.FileDialog
4 Set fd = Application.FileDialog(msoFileDialogSaveAs)
5
6 ' Titulo del formulario
7 fd.Title = "Seleccione un archivo"
8
9 ' Mostrar el cuadro de dialog.
10 If fd.Show = True Then
11 If fd.SelectedItems.Count > 0 Then
12 Debug.Print fd.SelectedItems(1) ' Obtiene el archivo y ruta.
13 Debug.Print Dir(fd.SelectedItems(1)) ' Solo el nombre del archivo.
14
15 ' Regresa el archivo con su ruta
16 GuardarArchivo = fd.SelectedItems(1)
17 End If
18 End If
19 End Function
Ejercicio
Ahora necesitas practicar como comunicarte con los usuarios de tus macros. Crea una macro que
solicite seleccionar una carpeta, si el usuario completa el proceso y selecciona una carpeta, debes
mostrar la selección en la barra de estados. Si el usuario presiona el botón cancelar y no selecciona
ninguna carpeta, debes mostrar un mensaje de error con el icono vbCritical e indicar que no
selecciono alguna carpeta.
https://excel.facilparami.com
Crear formularios avanzados
En este capítulo aprenderás a crear formularios; los formularios son ventanas en las que puedes
utilizar cajas de textos, botones, listas desplegables, etc., con todo lo que necesitas para crear
interfaces de usuario muy avanzadas.
Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace:
https://my.pcloud.com/publink/show?code=XZgSS4kZT0a9HhsI6bQOIk1dQwKvFQCQtCpy
Introducción a userforms
Este tema es bastante extenso y lleno de nuevos conceptos, es por eso que iré explicando todo
mientras ponemos cada concepto en práctica. Vamos a desarrollar un formulario para el ingreso
de productos, el cual tendrá estas características:
Tu primer formulario
Para crear un formulario, debes hacer clic derecho sobre tu proyecto y seleccionar el menú Insertar
> UserForm
Crear un formulario
Ahora ya tienes tu primer formulario, hay algunas cosas básicas que debes de saber: En los extremos
del formulario verás unos pequeños cuadros, si acercas el puntero del mouse a ellos y haces clic,
puedes arrastrarlos para cambiar el tamaño del formulario.
También veras una pequeña ventana llamada Cuadro de Herramientas, en ella esta los controles
que puedes usar en tus formularios, solo tienes que hacer clic sobre alguno de ellos para seleccionarlo
y luego clic en la zona del formulario en donde deseas que aparezcan. Si no puedes ver el Cuadro
de Herramientas, puedes hacerlo visible si seleccionas el menú Ver > Cuadro de Herramientas
Y por último, pero no menos importante, se encuentran las propiedades del formulario o controles,
desde aquí puedes configurar los formularios y controles para que se adapten a tus necesidades.
https://excel.facilparami.com
Crear formularios avanzados 77
Editar un formulario
Vamos a hacer algunos cambios a este formulario, primero vamos darle un nombre, actualmente se
llama UserForm1, pero es importante darle un nombre que podamos usar para identificarle fácil-
mente. Usualmente utilizamos un prefijo para indicar el tipo de objeto y un nombre nemotécnico,
por ejemplo, frmProducto (frm nos recuerda que es un formulario y Producto nos recuerda que se
usa para insertar un producto). Para cambiar el nombre, hacemos clic sobre el formulario (en caso de
que no esté seleccionado previamente) y luego escribimos el nombre (frmProducto) al lado derecho
de la propiedad Name
https://excel.facilparami.com
Crear formularios avanzados 78
Cambiar el nombre
Ahora vamos a cambiar el título del formulario, actualmente dice “UserForm1” pero vamos a
cambiarlo por “Productos”. Para hacer esto, seleccionamos el formulario y cambiamos la propiedad
Caption, escribiendo “Productos”.
https://excel.facilparami.com
Crear formularios avanzados 79
Cambiar el titulo
Como has visto, es muy sencillo adaptar el formulario por medio de sus propiedades, algunas
propiedades son sencillas de comprender, por ejemplo, utilizando Font puedes modificar el tipo de
letra que se usa. Intenta modificar algunas propiedades y observa cómo afectan al formulario, así
podrás familiarizarte mucho mejor con todas estas opciones.
https://excel.facilparami.com
Crear formularios avanzados 80
Cuadro de herramientas
Para agregar los botones, haces clic sobre el icono de “Botón de comando” para seleccionarlo y
luego haces clic sobre el formulario, después debes usar esos pequeños cuadros blancos del botón de
comando para cambiar su tamaño. Repite este proceso para crear un segundo botón.
https://excel.facilparami.com
Crear formularios avanzados 81
Agregar un botón
Para mover un botón o cualquier otro control a la posición que deseemos, primero hay que
seleccionarlo haciendo clic sobre él, luego hacemos clic sobre ese borde con muchos puntos y sin
soltar el botón del mouse, lo arrastramos hasta donde necesitemos que se encuentre.
https://excel.facilparami.com
Crear formularios avanzados 82
Mover un botón
De la misma forma en que cambiaste las propiedades del formulario, debes cambiar el nombre y el
texto de los botones, utiliza esta tabla como referencia:
Nombre (name) Texto (Caption)
boton1 cmdAceptar Aceptar
boton2 cmdCancelar Cancelar
Como lo mencione antes, los botones se usan para ejecutar algún código. Aún no estamos listos para
crear el código del botón Aceptar, pero podemos escribir el código para el botón Cancelar, para esto
debes hacer doble clic sobre el botón Cancelar. Esto te llevará a la ventana de edición de código del
formulario y al evento click de botón cmdCancelar, el código que escribas aquí se ejecutará cuando
alguien haga clic sobre el botón cmdCancelar.
Evento Click
Vamos a hacer que el formulario se cierre cuando alguien hace clic sobre este botón, para eso debes
completar el código de esta forma:
https://excel.facilparami.com
Crear formularios avanzados 83
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.
https://excel.facilparami.com
Crear formularios avanzados 84
Ahora debes ajustar el nombre y el texto, esto se hace cambiando las propiedades name y caption
respectivamente, tal y como se ve en esta imagen. El prefijo lbl en el nombre, es por label (etiqueta
en inglés)
https://excel.facilparami.com
Crear formularios avanzados 85
Propiedades de la etiqueta
Repite el proceso anterior para crear 3 etiquetas adicionales y cambias sus propiedades para que
tengan estos valores
Nombre Texto
lblNombre Nombre
lblCantidad Cantidad
lblUnidad Unidad
https://excel.facilparami.com
Crear formularios avanzados 86
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.
Ahora debes agregar dos cuadros de texto adicionales con estos nombres: txtNombre y txtCantidad
https://excel.facilparami.com
Crear formularios avanzados 87
Agregar un marco
Ahora vamos a cambiar dos de sus propiedades: Nombre (Name) y Texto (Caption), tal y como lo
vemos en esta imagen y también vamos a hacerlo un poco más grande para que quepan dos botones
de radio.
https://excel.facilparami.com
Crear formularios avanzados 88
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.
Repetimos el paso anterior para tener dos botones de radio y cambiamos sus propiedades de acuerdo
a la siguiente tabla:
https://excel.facilparami.com
Crear formularios avanzados 89
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.
Luego lo acomodas en la posición que desees y cambias su nombre y texto, como se muestra en esta
imagen:
https://excel.facilparami.com
Crear formularios avanzados 90
https://excel.facilparami.com
Crear formularios avanzados 91
Cuando agregues este control debes cambiar su nombre a cboUnidad, para poder ejecutar el código
que vamos a escribir más adelante.
Si has seguido todos los pasos, ya tienes todos los controles que necesitamos para hacer funcionar el
formulario. Si aún no has ordenado todos los controles en su lugar y con su tamaño respectivo, aquí
está de nuevo la imagen de cómo debe de lucir:
Formulario
https://excel.facilparami.com
Crear formularios avanzados 92
Seleccionar un evento
1 Me.cboUnidad.Clear
2 Me.cboUnidad.AddItem ("Unidad")
3 Me.cboUnidad.AddItem ("Caja 12 unidades")
Como vamos a trabajar con la lista de opciones (combo box), primero escribimos Me que representa
al formulario, luego escribimos un . y el nombre de la lista (cboUnidad), luego otro . y el método (o
función) Clear, el cual borra todas las opciones que existan en la lista, hacemos esto para limpiar la
lista de cualquier otro valor.
Luego escribimos un código similar, pero ahora llamamos al método AddItem de la lista y entre
paréntesis le enviamos los nombres de las opciones que necesitamos agregar.
Si ejecutamos el formulario ahora, podremos ver que la lista ya tiene opciones para seleccionar.
https://excel.facilparami.com
Crear formularios avanzados 93
Al ejecutar el evento
1 Sub MostrarFormularioProducto()
2 Dim f As New frmProducto
3 f.Show
4 End Sub
En la primera línea declaramos una variable de tipo frmProducto, este es el nombre de nuestro
formulario, también usamos la palabra New para inicializar la variable. Luego en la siguiente línea
usamos el método show del formulario para mostrarlo.
https://excel.facilparami.com
Crear formularios avanzados 94
Ahora creamos la macro para insertar una línea de contenido en la hoja de cálculo, usando este
código:
Para este momento el código anterior debe ser bastante familiar para ti, pero hay algunas partes que
aún debo explicar. Primero declaro una variable llamada fila, para encontrar y guardar el número
de la primera fila vacía que encuentre, debido a que la primera fila contiene el encabezado, entonces
inicio buscando desde la fila número 2.
https://excel.facilparami.com
Crear formularios avanzados 95
Utilizo un ciclo While para recorrer la hoja de cálculo, porque no sé cuántas filas debo revisar hasta
encontrar una celda vacía. Cuando encuentro una celda vacía, entonces el ciclo termina y ya tengo
mi primera fila vacía.
Luego comienzo a llenar cada celda de esa fila, con los valores que recibí como parámetro. La
columna F contiene la fecha de creación, esta fecha no se recibe como parámetro, así que se toma la
fecha del sistema, usando la función Now().
Primero declaro dos variables para poder leer los valores de los botones de radio y de las casillas de
selección. En general para leer el valor de un control, usamos la propiedad Value de cada control.
Por ejemplo, txtCodigo.Value me regresa el código del producto.
Pero en el caso de los botones de radio y las casillas de selección, esa propiedad va a regresar un
valor True si está marcada y False si no lo está. Por eso usamos un bloque IF para darle sentido y
luego almaceno su interpretación en una variable.
Finalmente, en las últimas dos líneas del código, se llama a la función InsertarProducto para agregar
la fila y luego se usa el método Hide para cerrar el formulario.
https://excel.facilparami.com
Crear formularios avanzados 96
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.
https://excel.facilparami.com
Crear formularios avanzados 97
11
12 If txtNombre.Value = "" Then
13 MsgBox "Debe ingresar un nombre"
14 EsCorrecto = False
15 End If
16
17 If txtCantidad.Value = "" Then
18 MsgBox "Debe ingresar la cantidad"
19 EsCorrecto = False
20 Else
21 If Not IsNumeric(txtCantidad.Value) Then
22 MsgBox "La cantidad debe ser numerica"
23 EsCorrecto = False
24 End If
25 End If
26
27 If cbUnidad.Value = "" Then
28 MsgBox "Debe ingresar una unidad"
29 EsCorrecto = False
30 End If
31
32 If obActivo.Value Then
33 Estado = "Activo"
34 Else
35 Estado = "Inactivo"
36 End If
37
38 If ckDescuentos.Value Then
39 Descuentos = "Si"
40 Else
41 Descuentos = "No"
42 End If
43
44 If EsCorrecto Then
45 InsertarProducto txtCodigo.Value, txtNombre.Value, Estado, txtCantidad.Value\
46 , cbUnidad.Value, Descuentos
47 Me.Hide
48 End If
https://excel.facilparami.com
Crear formularios avanzados 98
Ejercicio
Imagina que alguien te pide que agregues el precio del producto, a esta hoja de cálculo. Observas
detenidamente todo el desarrollo y miras que para hacer eso debes realizar estos cambios (y por
supuestos los realizas)
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
Vamos a crear un archivo que nos servirá para hacer los demás ejemplos, para hacerlo puedes utilizar
una macro como esta:
1 Sub CrearArchivo()
2 Dim NombreArhivo As String
3 Dim Libro As Workbook
4
5 'Nombre del archivo
6 NombreArhivo = "demo.xlsx"
7
8 'Crear un nuevo libro, usando metodo add
9 Set Libro = Workbooks.Add()
10
11 'Guardar el libro con el nombre que digamos
12 'Si no definimos una ruta, se guarda
13 'en la carpeta en donde esta este archivo con macros
14 Libro.SaveAs NombreArhivo
15
16 End Sub
Cuando creamos un libro usando Workbooks.Add() podemos guardar una referencia al nuevo libro
creado, al asignarlo en una variable de tipo Workbook y usando la palabra reservada Set.
Uso de Workbooks 100
1 Sub AbrirWorkbook()
2 Workbooks.Open Filename:="demo.xlsx"
3 End Sub
Como puedes ver, al método Open le podemos pasar parámetros indicando el nombre del parámetro
seguido de := y el valor del parámetro, que en este caso es el nombre del archivo.
Si ejecutas el código anterior y el archivo no existe, entonces verás un error que quizá podría hacer
pensar que la macro no funciona, cuando en realidad el problema es que el archivo no existe.
1 Sub AbrirWorkbook2()
2 Dim Archivo As String
3
4 Archivo = "demo.xlsx"
5
6 If Dir(Archivo) <> "" Then
7 Workbooks.Open Filename:=Archivo
8 Else
9 MsgBox ("El archivo " & Archivo & " no existe")
https://excel.facilparami.com
Uso de Workbooks 101
10 End If
11 End Sub
Como puedes ver ahora el nombre del archivo se encuentra en una variable, y usamos la función de
VBA Dir para probar el nombre del archivo, si el resultado es diferente de una cadena vacía entonces
abrimos el archivo, si no mostramos un error.
La función Dir evalúa una cadena de texto en donde se encuentre el nombre o parte del nombre de
un archivo y regresa el nombre del archivo que coincida con la búsqueda, por ejemplo, podrías usar
un comodín como el * de esta forma:
1 Archivo = Dir("demo.x*")
1 Function AbrirArchivo()
2 Dim Arch As Variant
3 Arch = Application.GetOpenFilename(FileFilter:="Excel, *.xlsx", Title:="Archivos\
4 de Excel...")
5
6 If Arch <> False Then
7 AbrirArchivo = Arch
8 End If
9 End Function
https://excel.facilparami.com
Uso de Workbooks 102
La parte del filtro antes de la , es solo una descripción, lo que hace que el filtro funcione es lo que
va después, en este caso *.txt
Ahora veamos cómo debe de quedar la macro completa
1 Function AbrirArchivo()
2 Dim Arch As Variant
3 Arch = Application.GetOpenFilename(filefilter:="Excel, *.xlsx", Title:="Archivos\
4 de Excel...")
5
6 If Arch <> False Then
7 AbrirArchivo = Arch
8 End If
9 End Function
10
11
12 Sub AbrirWorkbook3()
13 Dim Archivo As String
14
15 Archivo = AbrirArchivo()
16
17 If Dir(Archivo) <> "" Then
18 Workbooks.Open Filename:=Archivo
19 Else
20 MsgBox ("El archivo " & Archivo & " no existe")
21 End If
22 End Sub
https://excel.facilparami.com
Uso de Workbooks 103
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:
https://excel.facilparami.com
Uso de Workbooks 104
Vamos a modificar la macro de abrir un libro para que luego de procesar todo, cierre el libro que
abre. El código completo es este:
https://excel.facilparami.com
Uso de Workbooks 105
Borrar un archivo
Para borrar permanentemente un archivo podemos utilizar la función Kill de VBA, esta función
recibe como parámetro el nombre del archivo que necesitamos eliminar, si no especificamos la ruta
completa (carpetas), entonces buscara el archivo en la carpeta en donde está el archivo con la macro
que estamos ejecutando.
https://excel.facilparami.com
Uso de Workbooks 106
1 Sub BorrarArchivo()
2
3 Kill ("demo.xlsx")
4 End Sub
Parámetro Descripción
FileName Nombre completo del archivo incluyendo la ruta
completa. Si no incluyes la ruta, Excel toma como
referencia la carpeta actual.
FileFormat Es una constate para indicar el tipo de archivo que
necesitamos usar para grabar la hoja de cálculo, por
ejemplo, xlsm, xlsx, txt, etc. Para una lista completa,
puedes consultar esta dirección
https://docs.microsoft.com/en-
us/office/vba/api/excel.xlfileformat
Password Puedes enviar aquí una clave de hasta 15 caracteres para
proteger el archivo con contraseña.
WriteResPassword Puedes indicar una clave para poder abrir el archivo en
modo de escritura, si la persona no tiene la clave, puede
optar por abrirlo en modo de solo lectura.
ReadOnlyRecommended Si enviamos True, se mostrará un mensaje de que el
archivo debería abrirse en modo de solo lectura.
CreateBackup Si enviamos True, Excel creara una copia de respaldo.
Existen otras opciones, y los más probable es que nunca las uses en toda tu vida, sin embargo, si aún
sientes curiosidad puedes consultarlas en este enlace: https://docs.microsoft.com/en-us/office/vba/a-
pi/excel.workbook.saveas
Cuando utilizamos estas opciones, lo más recomendable es usar sus nombres, por ejemplo, para
guardar el archivo usando una clave podemos usar este código:
1 Sub GuardarConClave()
2 ThisWorkbook.SaveAs Password:="MiClave"
3 End Sub
Hay que tener en cuenta, que no hemos especificado el nombre, entonces Excel va a guardar una
https://excel.facilparami.com
Uso de Workbooks 107
copia de este archivo, usando el mismo nombre, pero en la carpeta predefinida de Excel o en la
carpeta de trabajo, lo más probables es que lo cree en la carpeta Documentos.
Ejercicio
Ahora que ya sabes trabajar con el objeto Workbook, intenta crear una macro que guarde una copia
de cada archivo abierto, pero protegido con una contraseña para poder abrirlo en modo de escritura
(usa la opción WriteResPassword)
https://excel.facilparami.com
Uso de WorkSheets
En este capítulo vamos a aprender a trabajar con Hojas de Excel, como ya sabemos cada Libro de
Excel está compuesto de Hojas y ahora veremos varios ejemplos como agregar, borrar, imprimir,
proteger hojas, etc.
Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace:
https://my.pcloud.com/publink/show?code=XZRSS4kZFWYWuP7SIh03y8uk8CKVCuy7zmby
Parámetro Descripción
Before Un objeto de tipo Sheet, que indica que deseas agregar la nueva hoja,
antes de esta hoja.
After Un objeto de tipo Sheet, que indica que deseas agregar la nueva hoja,
después de esta hoja.
Count El número de hojas que deseas agregar, si omites este parámetro, se
agrega una hoja.
Type Indica el tipo de hoja que deseas agregar, por ejemplo, una hoja
normal, un gráfico, etc. Para ver una lista completa, puedes consultar
esta dirección:
https://docs.microsoft.com/en-us/office/vba/api/excel.xlsheettype
Si no definimos ninguno de los parámetros Before o After, la nueva hoja se agrega antes de la hoja
activa. Veamos un ejemplo de cómo agregar una hoja al final de todas:
1 Sub AgregarHoja()
2 ActiveWorkbook.Sheets.Add After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksh\
3 eets.Count)
4 End Sub
Para poder decirle a Excel que necesitamos agregar una hoja al final de todas, debemos usar el
parámetro After. Como mencione en la tabla anterior, debemos incluir una referencia a la hoja en
los parámetros After y Before.
Usando ActiveWorkbook.Worksheets() podemos hacer referencia a una de las hojas en el libro
actual, pero necesitamos el nombre o la posición (de 1 hasta el número de hojas) para hacer
Uso de WorkSheets 109
referencia a una hoja en específico y ya que necesitamos la última hoja, entonces podemos usar
ActiveWorkbook.Worksheets.Count para saber cuál es la última hoja.
Ahora, veamos un ejemplo más, imagina que además de definir una hoja, necesitas realizar algún
cambio sobre ella, como escribir algo sobre sus celdas o cambiar su nombre. En ese caso necesitas
capturar una referencia a la nueva hoja y luego trabajar usando sus propiedades y métodos. Aquí
hay un ejemplo sencillo:
1 Sub AgregarHoja2()
2 'Definir una variable de tipo Worksheet
3 Dim hoja As Worksheet
4
5 'Capturar una referencia a la nueva hoja
6 Set hoja = ActiveWorkbook.Sheets.Add()
7
8 'Cambiar el nombre de la hoja
9 hoja.Name = "Hoja con nombre"
10 End Sub
Debes de tener en cuenta que cuando vas a capturar una referencia de la hoja que agregas, debes
llamar al método Add usando paréntesis al final, si no vas a capturar una referencia, entonces no
debes usar los paréntesis.
1 Sub BorrarHoja()
2 ActiveWorkbook.Sheets("Hoja con nombre").Delete
3 End Sub
https://excel.facilparami.com
Uso de WorkSheets 110
o después de alguna hoja en específico, si omites ambos parámetros, entonces Excel creara un nuevo
libro y moverá la hoja a dicho libro.
Aquí hay un ejemplo para mover la hoja actual hasta la primera posición. ActiveSheet hace
referencia al objeto de la hoja activa, podemos usarla con el método Move y para hacer referencia
a la que ya es la primera hoja, vamos a usar el índice 1 de la colección de objetos Sheets del libro
activo.
1 Sub MoverHoja()
2 ActiveSheet.Move Before:=ActiveWorkbook.Sheets(1)
3 End Sub
1 Sub CopiarHoja()
2 ActiveSheet.Copy After:=ActiveSheet
3 End Sub
1 Sub OcultarHoja()
2 ActiveSheet.Visible = False
3 End Sub
Una vez oculta, puedes volver a mostrar la hoja haciendo clic derecho sobre cualquiera de las hojas
visibles y luego seleccionando del menú, la opción Mostrar...
https://excel.facilparami.com
Uso de WorkSheets 111
Luego verás una lista de las hojas ocultas, entonces solo seleccionas una de la lista y presionas el
botón Aceptar.
Si no quieres que las personas puedan hacer visibles las hojas ocultas muy fácilmente, puedes elegir
la opción Muy Oculta, así, la única forma de hacer visible la hoja, será haciendo uso de VBA o el
editor de VBA.
https://excel.facilparami.com
Uso de WorkSheets 112
Puedes hacer esto con una macro como esta y utilizando la constante predefinida xlSheetVeryHidden.
1 Sub OcultarHoja2()
2 ActiveSheet.Visible = xlSheetVeryHidden
3 End Sub
1 Sub NombreHoja()
2 Dim nombre As String
3
4 nombre = InputBox("Ingrese el nuevo nombre para esta hoja")
5 ActiveSheet.Name = nombre
6 End Sub
El método Protect tiene muchos parámetros y todos son opcionales. El parámetro Password es la
clave que deseas colocar y todos los demás parámetros esperan un valor True para ser activados o
un valor False para ser desactivados, aquí hay una lista de cada uno de ellos:
Parámetro Descripción
Password Es la clave que deseas colocar para la hoja, si la omites
las personas podrán desproteger la hoja sin escribir
ninguna clave. Es importante saber que, si pierdes esta
clave, no hay forma de poder recuperarla.
DrawingObjects True para proteger las formas. El valor predeterminado
es True.
Contents True para proteger el contenido. En un gráfico, protege
todo el gráfico. En una hoja de cálculo, protege las
celdas bloqueadas. El valor predeterminado es True.
Scenarios True para proteger los escenarios. Este argumento solo
es válido para las hojas de cálculo. El valor
predeterminado es True.
https://excel.facilparami.com
Uso de WorkSheets 113
Parámetro Descripción
UserInterfaceOnly True para proteger la interfaz de usuario, pero no las
macros. Si omite este argumento, la protección se aplica
tanto a las macros como a la interfaz de usuario.
AllowFormattingCells True permite al usuario dar formato a cualquier celda
de una hoja de cálculo protegida. El valor
predeterminado es False.
AllowFormattingColumns True permite al usuario dar formato a cualquier
columna de una hoja de cálculo protegida. El valor
predeterminado es False.
AllowFormattingRows True permite al usuario dar formato a cualquier fila de
una hoja de cálculo protegida. El valor predeterminado
es False.
AllowInsertingColumns True permite al usuario insertar columnas en la hoja de
cálculo protegida. El valor predeterminado es False.
AllowInsertingRows True permite al usuario insertar filas en la hoja de
cálculo protegida. El valor predeterminado es False.
AllowInsertingHyperlinks True permite al usuario insertar hipervínculos en la hoja
de cálculo protegida. El valor predeterminado es False.
AllowDeletingColumns True permite al usuario eliminar columnas en la hoja de
cálculo protegida, donde todas las celdas de la columna
que se va a eliminar se desbloquearán. El valor
predeterminado es False.
AllowDeletingRows True permite al usuario eliminar filas en la hoja de
cálculo protegida, donde todas las celdas de la fila que se
va a eliminar se desbloquearán. El valor predeterminado
es False.
AllowSorting True permite al usuario ordenar la hoja de cálculo
protegida. Se deben desbloquear o desproteger todas las
celdas del rango de ordenación. El valor predeterminado
es False.
AllowFiltering True permite al usuario establecer filtros en la hoja de
cálculo protegida. Los usuarios pueden cambiar los
criterios del filtro, pero no puede habilitar o deshabilitar
un filtro automático. Los usuarios pueden establecer
filtros en un filtro automático existente. El valor
predeterminado es False.
AllowUsingPivotTables True permite al usuario usar informes de tabla dinámica
en la hoja de cálculo protegida. El valor predeterminado
es False.
Existe una gran cantidad de parámetros, pero para la mayoría de los casos posiblemente solo vas a
necesitar el parámetro Password y dejar todas las demás opciones con sus valores predeterminados.
Aquí hay una macro como ejemplo:
https://excel.facilparami.com
Uso de WorkSheets 114
1 Sub ProtegerHoja()
2 ActiveSheet.Protect Password:="123"
3 End Sub
Si ejecutas la macro y luego intentas modificar la hoja, verás un mensaje de error como este:
También puedes eliminar la protección de la hoja usando el método Unprotect, aquí hay una macro
de ejemplo:
1 Sub DesprotegerHoja()
2 ActiveSheet.Unprotect Password:="123"
3 End Sub
Parámetro Descripción
From Número de la página en la que comienza la impresión. Si no se
especifica este argumento, la impresión empieza por el principio.
To Número de la última página que se va a imprimir. Si no se
especifica este argumento, la impresión finaliza en la última
página.
Copies Número de copias que se imprimirán. Si no se especifica este
argumento, se imprime una sola copia.
Preview True para que Microsoft Excel invoque la vista preliminar antes
de imprimir el objeto. False (u omitido) para imprimir el objeto
inmediatamente.
ActivePrinter Establece el nombre de la impresora activa.
PrintToFile True para imprimir a un archivo. Si no se especifica
PrToFileName , Excel solicita al usuario que escriba el nombre
del archivo de salida.
Collate True para intercalar varias copias.
PrToFileName Si PrintToFile se establece en true, este argumento especifica el
nombre del archivo en el que desea imprimir.
IgnorePrintAreas True para omitir las áreas de impresión e imprimir todo el objeto.
https://excel.facilparami.com
Uso de WorkSheets 115
Aquí hay un ejemplo de cómo imprimir la hoja actual mostrando la vista previa:
1 Sub ImprimirHoja()
2 ActiveSheet.PrintOut Preview:=True
3 End Sub
Para poder ejecutar esta macro sin problemas, la hoja activa debe de tener algún contenido. Si la
hoja está vacía, entonces Excel simplemente no hace nada.
Ejercicio
Para practicar un poco lo que has visto en este capítulo, intenta crear un macro que recorra todas
las hojas del libro activo (ActiveWorkbook) y oculte todas las hojas excepto la primera.
https://excel.facilparami.com
Trabajando con Rangos
Ahora vamos a trabajar con rangos, un rango es un conjunto de celdas que bien pueden ser columnas,
filas, cualquier grupo de celdas o incluso una sola celda.
Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace:
https://my.pcloud.com/publink/show?code=XZJSS4kZJ85FEedg0qF8QXXloPVSkmO1I1ay
Usando Rangos
Para trabajar con rangos podemos usar el objeto Range, recordemos que este es un conjunto de
celdas, entonces al usarlo, también tenemos que decir con cual celda vamos a trabajar, por ejemplo
Range("A1:A3"). Select selecciona las celdas A1 a la A3.
Usar Range, también equivale a usar Application.Range o ActiveSheet.Range , ya que asume que
estás trabajando con la hoja activa. Si deseas trabajar con otra hoja u otro libro entonces debes
especificarlo, por ejemplo, con un código como este:
Trabajando con Rangos 117
1 Sub SeleccionarCelda2()
2 'Hacer visible la hoja2 antes de seleccionar sus celdas
3 ActiveWorkbook.Sheets("Hoja2").Select
4 ActiveWorkbook.Sheets("Hoja2").Range("A1:A3").Select
5 End Sub
En el código anterior, primero seleccionamos la Hoja2, con esto hacemos que la Hoja2 se convierta
en la hoja activa y este visible, si no hacemos esto, entonces no podríamos seleccionar ninguna de
sus celdas por que la macro mostraría un error.
Al usar rangos, puedes consultar y modificar cualquier cosa que esté relacionada a las celdas en el
rango, como cambiar su formato o su contenido. Por ejemplo, veamos esta macro que cambia el
formato de un rango de celdas a numérico con dos decimales separados por un punto:
1 Sub ModificarFormatoCelda()
2 'Formato de numero con dos decimales
3 Range("A1:A3").NumberFormat = "0.00"
4
5 End Sub
https://excel.facilparami.com
Trabajando con Rangos 118
rango-inicial
Ahora veamos una macro que recorre todas las celdas seleccionadas y muestra su contenido en un
mensaje usando la función MsgBox
1 Sub RecorrerRango()
2 Dim celda As Range
3 For Each celda In Selection
4 MsgBox celda.FormulaR1C1
5 Next
6
7 End Sub
En el código anterior, primero declaramos una variable llamada celda, luego en el ciclo for each
pedimos que se recorra cada elemento del objeto Selection y se coloque su contenido en la variable
celda, luego usamos la propiedad FormulaR1C1 de acceder al contenido de la celda.
https://excel.facilparami.com
Trabajando con Rangos 119
La función Union recibe como parámetros 1 o hasta 30 rangos y los combina en uno solo. Veamos
este ejemplo, en donde se definen 3 rangos y luego se unen en uno solo, para después cambiar su
color de fondo a amarillo.
1 Sub UnirRangos()
2 Dim Rango1 As Range
3 Dim Rango2 As Range
4 Dim Rango3 As Range
5 Dim MisRangos As Range
6
7 Set Rango1 = Range("A:A") 'Seleccionar toda la columna A
8 Set Rango2 = Range("C:C")
9 Set Rango3 = Range("E:E")
10
11 'Unir los 3 rangos
12 Set MisRangos = Union(Rango1, Rango2, Rango3)
13
14 'Cambiar el color de fondo
15 MisRangos.Interior.Color = RGB(255, 255, 0)
16 End Sub
https://excel.facilparami.com
Trabajando con Rangos 120
Unir rangos
Como puedes ver en el código anterior usamos la instrucción Let para asignar el valor a las variables
por que se declararon como tipo Range el cual es un objeto. Cuando trabajes con tipos de datos de
objetos debes usar siempre la palabra Let al asignarles un valor.
Otra parte que puede ser confusa, es la forma en que le asignamos un color, en lugar de un código
como Color = Amarillo, usamos Color = RGB(255, 255, 0). RGB es una función de VBA que permite
definir un color como las mezclas de rojo, verde y azul, la intensidad de cada color se representa
como un numero de 0 (ausencia del color) a 255 (color puro). Pero no necesitas dominar los colores
en RGB, puedes usar páginas como https://www.w3schools.com/colors/colors_picker.asp en donde
puedes generar códigos RGB de forma gráfica.
https://excel.facilparami.com
Trabajando con Rangos 121
Colores RGB
Uso de Offset
Al utilizar el método offset podemos definir un rango basado en el desplazamiento de otro rango.
Aunque offset puede funcionar con rangos, es más usada cuando trabajamos con una sola celda,
por ejemplo, si ya tienes la referencia de una celda y deseas ingresar algún dato en la celda que
esta a la derecha, entonces solo te desplazas una columna a la derecha. Esto puede parecer un poco
confuso al inicio así que vamos a ver algunos ejemplos y con eso lo comprenderás sin problemas.
La función offset utiliza estos parámetros
Parámetro Descripción
RowOffset Número de filas que debe desplazarse, un número positivo indica
que debe desplazarse hacia abajo, y un número negativo indica que
debe desplazarse hacia arriba.
https://excel.facilparami.com
Trabajando con Rangos 122
Parámetro Descripción
ColumnOffset Número de columnas que debe desplazarse, un número positivo
indica que debe desplazarse hacia la derecha, y un número negativo
indica que debe desplazarse hacia la izquierda.
Ahora veamos un ejemplo, imagina que vas a escribir un valor monetario en la celda activa
(ActiveCell) y en la celda que está a su derecha, debes escribir la moneda. El problema de hacer
esto, es que no sabes cúal es la celda activa, podrías usar algo como Range("B2"), pero no puedes
decir que vas a usar la celda B2 porque no sabes cúal es la celda activa. Existen formas de conseguir
cual es la dirección de la celda activa, pero en casos como este, lo mejor es hacer referencia a una
celda basada en otra celda. Veamos la solución más sencilla para este problema:
1 Sub EjemploOffset()
2 'Colocar un valor en la celda activa
3 ActiveCell.Formula2R1C1 = 25.2
4
5 'Usamos offset para movernos cero filas
6 'y 1 columna a la derecha, luego escribimos un valor
7 ActiveCell.Offset(0, 1).Formula2R1C1 = "$"
8 End Sub
Para tener una mejor idea de cómo usar offset, aquí hay grafico de cómo usarlo para seleccionar
algunas celdas que están alrededor de una celda
Ejemplos de Offset
Ahora veamos cómo se comporta Offset al usarse con rangos, imagina que tienes seleccionadas las
celdas A1:A3, que piensas que pasaría si ejecutas un código como este:
https://excel.facilparami.com
Trabajando con Rangos 123
1 Sub EjemploOffsetRangos()
2 Dim rango As Range
3
4 Set rango = Range("A1:A3")
5
6 rango.Offset(0, 1).Select
7 End Sub
El rango completo se desplaza una columna a la derecha y el resultado es que seleccionas las 3
primeras celdas de la columna B, en lugar de la columna A.
Borrar rangos
Los rangos poseen un método llamado Delete, puedes usarlo para borrar un rango completo de
celdas. De la misma forma en que sucede en Excel, cuando borras una o más celdas, Excel reorganiza
las demás celdas para cubrir el espacio, por ejemplo, si borras la columna B, entonces mueve todas
las columnas a la izquierda, y los datos de la columna C, pasan a la columna B.
Aprovechando el ejemplo anterior, voy a introducir un nuevo rango predeterminado: Columns, con
este objeto puedes hacer referencia a una columna completa, por medio de su índice, por ejemplo,
la columna B es la segunda columna, entonces su índice es 2.
Con este código puedes borrar la columna B, pero antes de probarla, asegúrate de agregar algunos
datos en las columnas B y C, para que puedas apreciar el resultado.
https://excel.facilparami.com
Trabajando con Rangos 124
1 Sub BorrarRango()
2 Columns(2).Delete
3 End Sub
Ocultar rangos
Ahora veremos cómo ocultar rangos. Una tarea habitual en Excel es ocultar filas o columnas que no
usas o que tienen datos que no deseas que este visibles porque no son importantes. Para ocultar o
mostrar una fila, podemos cambiar la propiedad Hidden a true para ocultar y a false para mostrar.
Ahora voy a introducir el objeto Rows, este objeto puede hacer referencia a cualquier fila de la hoja
de cálculo, por medio de su índice. Por ejemplo, el siguiente código oculta la fila 2, si necesitas volver
a hacerla visible, recuerda que solo debes cambiar la propiedad Hidden de true a false.
1 Sub OcultarRango()
2 Rows(2).Hidden = True
3 End Sub
1 Sub AsignarNombre()
2 Range("B1").Name = "Impuesto"
3 End Sub
https://excel.facilparami.com
Trabajando con Rangos 125
1 Sub CalcularImpuesto()
2 Dim Impuesto As Single
3
4 'Obtener el valor del impuesto, esta
5 'configurado en la celda Impuesto
6 Impuesto = Range("Impuesto").Formula2R1C1
7
8 'Calcular el impuesto para un producto que vale 100
9 Range("A5").Formula2R1C1 = 100 * Impuesto
10
11 End Sub
https://excel.facilparami.com
Trabajando con Rangos 126
Entonces, si usamos el método Resize, indicando 10 filas y 2 columnas de esta forma: rango.Resize(10,
2) estamos diciendo que el rango debe modificarse y que a partir de la celda de referencia que siempre
es la esquina superior izquierda, en este caso B1 debe contar 10 filas hacia abajo y 2 columnas a la
derecha, dejando un rango como este:
https://excel.facilparami.com
Trabajando con Rangos 127
1 Sub IncremetarRango()
2 Dim rango As Range
3
4 Set rango = Range("B1:C4")
5
6 Set rango = rango.Resize(10, 2)
7
8 rango.Select
9
10 End Sub
Como puedes ver, simplemente hemos definido nuevamente los límites del rango, pero también
puedes lograr un código más genérico, como por ejemplo incrementar el rango en una fila más o
una columna más. Para esto podemos usar las propiedades Rows.Count y Rows.Count del rango para
https://excel.facilparami.com
Trabajando con Rangos 128
conocer cuantas filas y columnas utiliza el rango y luego definir un incremento basado en esos
números, por ejemplo, para incrementar el rango en 1 fila, podes usar este código:
1 Sub IncremetarFilaRango()
2 Dim rango As Range
3
4 Set rango = Range("B1:C4")
5
6 Set rango = rango.Resize(rango.Rows.Count + 1, rango.Columns.Count)
7
8 rango.Select
9
10 End Sub
Ejercicio
Ahora que conoces los rangos y como realizar operaciones con ellos, crea una macro llamada
Aplica20Descuento y que cambie el contenido de todas las celdas seccionadas al multiplicar su valor
por 0.8, los valores de las celdas que seleccione la persona que llama la macro, deben ser numéricos.
Puedes validar si una celda tiene un valor numérico , usando con un código como este:
1 If IsNumeric(celda.Formula2R1C1) Then
2 'Es un numero
3 End If
https://excel.facilparami.com