Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 118

Macros de Excel: Para personas ocupadas

Aprende en poco tiempo a crear macros que hagan el


trabajo duro por ti.

Luis Alberto Cruz Orellana

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

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

* * * * *

Este es un libro de Leanpub. Leanpub anima a los autores y publicadoras con


el proceso de publicación. Lean Publishing es el acto de publicar un libro en
progreso usando herramientas sencillas y muchas iteraciones para obtener
feedback del lector hasta conseguir tener el libro adecuado.

* * * * *

© 2019 Luis Alberto Cruz Orellana


Este libro esta dedicado a Dios, a mi esposa Patty y mis hijos Luis y
Gabriela. Ellos son la razón por la que me esfuerzo cada dia en ser mejor.
Tabla de contenidos
Tus primeras macros
Que es una macro
Como pueden ayudarte las macros en tu trabajo
Como se usan las macros
Tu primer macro
Ejercicio
Introducción a VBA
Qué es VBA
Editor de VBA
Editar una grabación de macros
Comentarios en el código
Ejercicio
Introducción a la programación
Tu primer macro usando VBA
Funciones o subrutinas
Variables, constantes y tipos de datos
Que son los arreglos
Decisiones y operadores lógicos
Operaciones con variables
Qué son los ciclos
Ejercicio
Interactuando con Excel
¿Que son los objetos y clases?
Objetos de Excel
Eventos de Excel
Ejemplo practico
Ejercicio
Extendiendo Excel
Crea tus propias funciones
Agrega documentación a tus fórmulas
Parámetros opcionales
Instalar y desinstalar complementos
Crea tus propios complementos
Corrigiendo Errores
Que tipos de errores podemos esperar
Como depurar código en el editor de VBA.
Control de errores en tiempo de ejecución
Ejercicio
Mensajes y cuadros de diálogo
Mostrar mensajes en la barra de estado de Excel
Mostrar mensajes usado MsgBox
Ventana de diálogo para trabajar con archivos
Ejercicio
Crear formularios avanzados
Introducción a userforms
Tu primer formulario
Como utilizar botones de comando
Como utilizar etiquetas
Como utilizar cuadros de texto
Como utilizar botones de radio
Como utilizar casillas de selección o checkbox
Como utilizar listas de selección
Trabajando con eventos
Algunas macros para nuestro formulario
Como leer la información de un formulario
Como agregar validaciones a tu formulario
Ejercicio
Uso de Workbooks
Crear un nuevo archivo de Excel
Abrir un archivo de Excel
Abrir un archivo de Excel indicado por el usuario
Verificar si un archivo está abierto
Cerrar un archivo de Excel
Borrar un archivo
Guardar un archivo de Excel
Ejercicio
Uso de WorkSheets
Agregar hojas a un archivo de Excel
Borrar una hoja de un archivo de Excel
Mover una hoja de un archivo de Excel
Copiar y pegar hojas de Excel
Ocultar una hoja de Excel
Cambiar el nombre de una hoja de Excel
Proteger un archivo de Excel con contraseña
Imprimir una hoja de Excel
Ejercicio
Trabajando con Rangos
Usando Rangos
Recorrer todos los valores de un rango
Combinar múltiples rangos
Uso de Offset
Borrar rangos
Ocultar rangos
Rangos con nombres
Modificar tamaño de rangos
Ejercicio
Tus primeras macros
En este capítulo voy a introducirte al mundo de las macros, aprenderás que es
una macro, por que necesitas usarlas, como puedes usarlas y como crear
macros sencillas.

Que es una macro


Una macro es una secuencia de comandos o pasos para realizar una tarea. En
nuestro caso una macro de Excel no es más que una serie de acciones que
puedes realizar en Excel.

Por ejemplo, si te envían una hoja de cálculo y te piden preparar un reporte


con esos datos, entonces tú sigues una serie de paso o acciones en Excel para
preparar ese reporte.

Si los pasos que sigues son siempre los mismos o muy similares, entonces
puedes crear una macro de Excel para que haga ese trabajo por ti.

Como pueden ayudarte las macros en tu trabajo


La mayor limitante de todos nosotros es nuestro tiempo, ese es tu recurso más
valioso. Puedes usar tu tiempo para ver una película, leer un libro, pasar
tiempo con tus seres queridos, trabajando o en lo que tú desees.

Por su puesto, todos necesitamos y debemos trabajar para poder sobrevivir,


pero con la ayuda de las computadoras y las macros de Excel, puedes hacer
que la computadora haga gran parte del trabajo en tu lugar, y así poder ganar
un poco de tiempo extra para hacer algo que te guste más.

Por otra parte, también puede ayudarte a ser mucho más productivo en tu
trabajo y sobresalir de entre todos tus compañeros.

Como se usan las macros


Ahora vas a comenzar a trabajar con macros, para el resto del capítulo vamos
a tomar un caso hipotético: Imagina que tienes una hoja de Excel que
frecuentemente debes compartir con otras personas, no te afecta que las
personas vean los datos, pero no quieres que conozcan las fórmulas que usas
para calcularlas (es algo secreto, como la fórmula de la Coca-Cola o algo así).

Entonces cada vez que debes enviar la hoja de cálculo a alguien, pasas todas
las fórmulas a valores absolutos. Pero para ahorrarte ese trabajo, has creado
una macro.

Como aún no hemos visto como crear macros, puedes descargar la macro de
la que hablo haciendo clic aquí

Ahora vamos a activar un menú secreto de Excel, primero haces clic en el


menú Archivo

Menú Archivo

Luego seleccionas Opciones


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.

Activar menú programador

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

Ejecutar una macro

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

Tu primer macro
Ahora que ya ejecutaste tu primera macro es hora de que crees tú primer
macro. Crea un archivo nuevo de Excel y en el menú Programador presiona
el botón Grabar macro

Luego veras una ventana en la que tienes que colocar un nombre para la
macro, una descripción y presionar el botón Aceptar

Los nombres de macros no pueden llevar espacios en blanco, pero


puedes usar guiones para separar palabras. Tampoco puedes usar
caracteres especiales.
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, pero para poder ver que repite todo, puedes
seleccionar una hoja nueva.

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

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

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

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.
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:

Editor de VBA

Esta está dividida en varias secciones, no te preocupes si no puedes verlas


todas en este momento, esto se debe a que tu hoja de Excel aún no tiene
macros.

En la parte superior izquierda verás el explorador de proyectos, cada libro de


Excel o archivo se trata como un proyecto, el código de VBA ira dentro de
una carpeta llamada Módulos, dentro de esta carpeta existirá uno o más
archivos que a su vez contiene código de programación (macros). En la parte
derecha hay una ventana, ahí es en donde se puede visualizar el código de las
macros.

Ver el código de programación

Existen varios menús y herramientas, pero los iremos viendo en detalle poco
a poco para no saturarte con información.

Editar una grabación de macros


Ahora vamos a practicar con algo sencillo, ya sabes crear macros usando la
grabadora, entonces crea una macro sencilla, por ejemplo, una macro en la
que cree o modifique los encabezados de una hoja de cálculo colocando en la
celda A1 la palabra Nombre y en la celda B1 Apellidos.

Luego de grabar la macro, abres el editor de VBA (presionando las teclas


Alt+F11) y posiblemente veas algo como esto:

Macro a editar

Ahora imagina que tu necesidad ha cambiado y en la columna C1 necesitas


que diga Teléfono, entonces en lugar de grabar otra macro, solo la abres en el
editor y debes hacer dos cosas

Seleccionara la celda C1
Escribir el texto Teléfono

El código para eso sería:


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

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


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.
Si escribes una comilla simple ', eso indica que toda la línea es un
comentario y será ignorada como código. Y ya que los comentarios no se
ejecutan, entonces otro uso que se le da a los comentarios es el de deshabilitar
temporalmente un bloque de código.

Pero si deseas convertir en comentario un bloque grande de código, no es


práctico hacerlo línea por línea, entonces debes activar una barra de
herramientas de Excel que te ayude en este proceso.

Haz clic derecho sobre la barra de herramientas actual y selecciona la opción


Edición como se muestra en esta imagen:

Activar barra de herramientas Edición

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

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.
Introducción a la programación
Como has visto hasta ahora, puedes crear macros sin necesidad de programar,
todo se ha hecho usando la grabadora de macros.

Pero para sacar el máximo provecho de las macros de Excel, necesitas crear
macros usando código de VBA. Por eso ahora vas a crear tu primer macro
desde cero y usando solo código de programación.

Pero no te preocupes si nunca has programado, porque este capítulo cubre


todos los conceptos básicos de programación.

Tu primer macro usando VBA


Ahora imagina que trabajas en una empresa en donde te dan una hoja de
Excel con una lista de productos y sus costos, tu trabajo es calcular los
precios. Como política de la empresa, los precios se calculan como el costo
más un 30% extra.

Entonces básicamente lo que debes hacer es crear una nueva columna y


calcular el precio como el costo más 30%. Crea una hoja de Excel que se vea
como esta:

Lista de productos

Ahora presiona las teclas Alt+F11 para abrir el editor de VBA y haz clic
derecho sobre el proyecto VBAProject con el nombre de tu hoja de cálculo y
selecciona la opción de menú Insertar > Módulo
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í:
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 subrutina es una macro que
genera un reporte de Excel, esta subrutina no regresa ningún valor, pero si
puede realizar cambios en una hoja de Excel. Las funciones también pueden
hacer cambios en una hoja de Excel, pero su uso habitual es devolver un
valor.

Otra diferencia importante es que solo puedes llamar macros desde una hoja
de Excel a aquellas que has creado como subrutinas que no lleven ningún
parámetro. Puedes hacer la prueba con la subrutina que acabas de crear.
Insertar modulo

Variables, constantes y tipos de datos


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

Los nombres de variables no pueden llevar espacios y solo deben contener


letras o números, pero puedes usar algunos caracteres como el guion bajo
para separar palabras. También hay algunos nombres que no puedes usar,
estos nombres se conocen como palabras reservadas.

Algunas de estas palabras que no puedes usar son: Function, Sub, Dim, etc.
Para una lista completa puedes consultar este artículo que detalla todas las
palabras reservadas.

Ahora, para declarar una variable utilizas la palabra Dim seguida del nombre
de tu variable y opcionalmente la palabra as seguida del tipo de datos, por
ejemplo, para declarar una variable llamada fila y de tipo numérico usamos
un código como este:
1 Dim fila As Integer

Si has intentado aprender VBA por tu cuenta, quizá sepas que no es necesario
declarar una variable para poder usarla, pero si es una buena práctica hacerlo.
Te recomiendo que siempre las declares, si no lo haces podrías crear errores
lógicos, los cuales son muy difíciles de corregir. Por ejemplo, imagina que
usas una variable llamada impuestos, luego haces algunos cálculos y tratas
de consultar su valor, pero te equivocas y escribes impuesto, es decir, olvidas
colocar la letra s al final. Lo que pasará es que no obtienes ningún error, pero
leerás el contenido de una variable sin declarar y sin el valor que esperas.

Para evitar este tipo de error puedes forzar a VBA a que siempre te pida
declarar las variables, para esto seleccionas el menú Herramientas >
Opciones y en la pantalla que se muestre debes marcar la opción Requerir
declaración de variables.

Solicitar declaración de variables

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

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

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

Ya sabes cómo declarar una variable, ahora, para asignarle un valor solo
escribes el nombre de la variable y escribes un signo = y el valor que deseas
asignar, por ejemplo:
1 Dim fila as Integer
2 Dim texto as String
3
4 fila = 1
5 texto = "Hola mundo"

Como puedes notar los valores numéricos se colocan tal y como los ves, pero
los valores de texto se escriben entre comillas dobles. Ahora que tienes
valores definidos en tus variables, puedes utilizarlos en tu macro, veamos un
ejemplo sencillo del uso de variables, donde tendremos una macro que
actualiza el contenido de una celda.
1 Sub variables()
2 Dim texto As String
3
4 texto = "Hola mundo"
5
6 'Accedemos y cambiamos el contenido de la celda activa
7 ActiveCell.FormulaR1C1 = texto
8
9 End Sub

Intenta crear y ejecutar la macro anterior en una hoja de Excel, y verás que
una vez que hayas asignado un valor a la variable texto, podrás usarla y la
macro entenderá que debe usar el valor asignado en la variable. Modifica el
valor de la variable texto y revisa lo que pasa cuando la ejecutas de nuevo.

Una vez que crees la subrutina anterior puedes ejecutarla posicionando el


cursor sobre cualquier parte de su código y luego presionando la tecla F5 o
presionando el botón Ejecutar.
Ejecutar una macro desde el editor de VBA

Nota: Con ActiveCell.FormulaR1C1 puedes acceder al valor de la celda


actual, esto es algo muy útil en muchas macros y a lo largo de este libro
vas a aprender muchas otras cosas que te serán de utilidad al crear
macros.

El contenido de una variable puede ser modificado en cualquier momento,


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

Quizá te preguntes por que declarar la constante anterior, si puedes usar su


valor 0.13 y sabes que no va a cambiar, bueno hay dos razones muy
importantes por las que debes usar constantes en lugar de los valores:

Para el caso anterior 0.13 es el factor para el IVA (un impuesto) y cuando
estas leyendo el código de tu macro es más fácil de entender cuando usas
constantes mira estos dos ejemplos idénticos y piensa cual es más legible:
1 impuesto = precio * 0.13
2
3 impuesto = precio * FactorIVA

La segunda razón es porque, si bien es cierto que el valor de la constante no


va a cambiar durante toda la ejecución de tu macro, si puede darse el caso en
que debes actualizar su valor, por ejemplo, ahora el valor del impuesto (IVA)
es del 13%, pero que pasaría si el gobierno decide subirlo a 15%, en ese caso
tendrías que leer todo tu código y evaluar si ese 0.13 se refiere al impuesto y
si es así, entonces cambiarlo en todas las líneas de código en los que lo has
usado, pero si decidiste utilizar una constante, solo debes modificar su valor y
ya tienes todo arreglado.

Posiblemente también te preguntas, ¿por qué necesito la constante, si puedo


hacer todo lo anterior usando una variable?, la respuesta es sencilla, las
constantes existen para evitar que por error modifiques su valor en algún
momento del programa. Como vimos puedes asignar un valor a una constate
en tu código, pero si intentas asignar un valor a una constante ya definida,
veras un error de compilación al intentar ejecutar tu macro.

Error al modificar una constante

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


código que la computadora pueda entender y ejecutar.

Que son los arreglos


Un arreglo o array es un tipo especial de variable, que puede contener
múltiples valores. Puedes acceder a todo el conjunto de valores o a un valor
individual al especificar su índice, también puedes agregar o eliminar más
valores al arreglo.

Puedes ver los arreglos como una lista de cosas, por ejemplo, una lista del
supermercado, en la que puedes agregar más cosas que deseas o borrar algo
que ya no quieres, también puedes leer la lista de forma secuencial, es decir,
del primer ítem, hasta el último, o puedes consultar: “Cual es el primer
producto en mi lista” y leer solo ese, por que has dado su índice (el primero
en la lista).

Como declarar un arreglo


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

Como vemos, el tamaño se declara 1 to 25 entre paréntesis, con eso


indicamos que el índice va desde 1 hasta 25.

Trabajar con los valores del arreglo


Ahora para asignar un valor a un arreglo, debemos hacer referencia a él, por
su índice y luego asignar su valor como se hace con cualquier otra variable.
1 Dim ListaSupermercado(1 To 25) As String
2 'Asignar un valor al indice #1
3 ListaSupermercado(1) = "Pollo"

Si declaraste un arreglo de 25 posiciones y tratas de utilizar un índice que no


existe, por ejemplo, el 26, obtendrás un error como este:

Error en índice del arreglo

Si no conoces la cantidad de posiciones que vas a necesitar, puedes declarar


un arreglo dinámico sin detallar la cantidad de posiciones y luego
redimensionarlo con la sentencia ReDim, aquí hay un ejemplo:
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

También puedes usar estas funciones para obtener el primer y el último


elemento de un arreglo o para validar si el arreglo tiene un índice, antes de
intentar leerlo.

Decisiones y operadores lógicos


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

La forma de tomar decisiones es con bloques if, la estructura más general es


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

La evaluación debe ser una expresión que regrese falso o verdadero, la


palabra else separa los bloques de código que se ejecuta cuando la
evaluación es verdadera o falsa y las palabras End If marcan el fin de la
decisión. Esto se verá mejor con un ejemplo, abre un archivo de Excel para
crear y ejecutar esta macro:
1 Sub decisiones()
2
3 Dim edad As Integer
4
5 edad = 15
6 If edad >= 18 Then
7 MsgBox "Ya eres mayor de Edad"
8 Else
9 MsgBox "Eres menor de edad"
10 End If
11
12 End Sub

En la macro anterior la decisión consiste en evaluar si la edad es mayor o


igual a 18, luego usamos la función MsgBox de VBA para mostrar un mensaje
en la pantalla. Intenta cambiar el valor de la variable edad para ver cómo se
comporta.

En el código anterior usamos el signo >=, esta es una comparación entre dos
valores. Las comparaciones que puedes hacer son:

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.

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 Falso (el primero bloque es cierto, pero el segundo es falso
1=2 entonces todo es falso)
1 = 1 And
Verdadero (ambas expresiones son verdaderas)
2=2
1 = 1 Or 1 Verdadero (la primera expresión es verdadera, entonces no
=2 importa el resultado de la segunda)
1 = 2 Or 2 Verdadero (la segunda expresión es verdadera, entonces
=2 no importa el resultado de la primera)
1 = 2 Or 2
Falso (Ambas expresiones son falsas)
=1
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.

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

Si la cantidad esta entre 0 y 20 no hay descuento


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

La macro usando if que resuelve este problema es la siguiente (como siempre


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

Como puedes observar, tantos if anidados puede ser algo confuso. También
debes notar que he introducido la función InputBox que permite preguntar al
usuario un valor y guardarlo en una variable, esto hará que sea más fácil
probar esta macro. Después de probar esta macro intenta probar la versión
Select Case y verás que el resultado es el mismo, pero el código es más
limpio y fácil de entender.
1 Sub DescuentoSelectCase()
2 Dim cantidad As Single
3 Dim descuento As Single
4 cantidad = InputBox("Ingrese cantidad")
5
6 Select Case cantidad
7 Case 0 To 20
8 descuento = 0
9 Case 21 To 30
10 descuento = 10
11 Case 31 To 40
12 descuento = 15
13 Case 41 To 50
14 descuento = 20
15 Case Else
16 descuento = 25
17 End Select
18
19 MsgBox "El descuento es de " & descuento & "%"
20 End Sub

Posiblemente ya descifraste la forma de usar la sentencia Select Case, pero


si no lo has hecho, voy a explicar con mayor detalle cómo se usa. Todo el
bloque se define entre las palabras Select Case Variable y finalizan con
End Select, luego hay una o más sentencias Case con una expresión y su
respectivo bloque de código. Existe un caso Else que es el que se ejecuta si
ninguno de los casos anteriores fue ejecutado.

Como ya habrás notado, la sentencia Select Case es un poco más compleja


que la sentencia if, pero más fácil de leer cuando hay varias posibles
opciones a una decisión. Pero la mejor forma de dominar esta sentencia es
por medio de algunos ejemplos prácticos, afortunadamente puedes leer
algunos en este artículo.

Operaciones con variables


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

Operador Descripción
+ Suma
* Multiplicación
/ División
- Resta
^ Exponenciación
\ División entera (regresa solo la parte entera, sin decimales)
Mod Regresa el residuo de una división, por ejemplo 5 mod 2 =
1
& Concatenar dos cadenas de texto (unir dos textos)
Ya hemos utilizado algunos de estos operadores de los ejemplos anteriores,
pero tener esta lista te servirá como referencia.

Qué son los ciclos


Los ciclos son repeticiones de un bloque de código, regresando al ejemplo de
las decisiones, cuando te sirven una taza de café, primero lo pruebas si está
muy caliente esperas un rato y lo vuelves a probar, repites este paso de probar
y decidir hasta que la temperatura sea de tu agrado para tomar tu café.

Lo mismo sucede con los programas, un bloque de código puede necesitar


repetirse un numero conocido o desconocido de veces.

El ciclo for se usa cuando conoces la cantidad de veces que necesitas repetir
el bloque de código, la sintaxis (estructura) del bloque for es:
1 for variable = valorInicial to valorFinal Step 1
2 'Ejecutar codigo
3 Next variable

Debes declarar una variable que se usará como contador, luego defines un
valor inicial y un valor final, opcionalmente puedes definir el valor del
incremento con la instrucción Step que de forma predeterminada es 1, si
piensas hacer incrementos de 1 puedes no usarla.

El ciclo funcionará así: si la variable tiene un valor inicial de 1, un valor final


de 5 y un incremento (step) de 1, entonces la primera vez que se ejecuta la
variable contiene un 1, la segunda vez la variable se incrementa a 2, luego a
3, luego a 4 y finalmente se incrementa a 5 y es la última vez que se ejecuta
el bloque de código.

Por ejemplo, imagina que debes generar una hoja de Excel que contiene el
número de filas en la columna A, y que inicia desde la celda A2, entonces la
celda A2 tendrá 1, la celda A3 tendrá 2 y así sucesivamente hasta llegar a 10.
Entonces el código para hacer eso sería este:
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
16 'Pasar a las siguiente fila y leer el costo
17 fila = fila + 1
18 costo = Range("C" & fila).FormulaR1C1
19 Loop
20 End Sub

Creamos una variable llamada costo con el contenido de la celda que


corresponde la fila que estamos procesando, luego usamos la función
IsNumeric para preguntar si su valor es un número, así sabremos si ya hemos
terminado, porque no encontrará un número, sino una celda vacía cuando
termine de procesar todas las filas con datos.

También debes notar que ahora usamos Range("C" & fila).FormulaR1C1 en


lugar de solo Range("C" & fila), hacemos esto para poder usar la función
IsNumeric ya que Range("C" & fila) convertirá el valor vacío a un cero y
entonces IsNumeric siempre va a regresar Verdadero. FormulaR1C1 regresa el
contenido de la celda sin hacer ninguna conversión.

Hay algo muy importante que debes conocer, como ves este ciclo se repite un
valor indefinido de veces y al final de este ciclo, he actualizado el valor de la
variable costo, con el contenido de la siguiente fila, si no hago esto entonces
la comparación que hace el ciclo no va a cambiar nunca y el resultado será
siempre verdadero, no habrá forma de terminar el ciclo y esto se conoce
como ciclo infinito, tu computadora quedara atrapada en un ciclo sin fin hasta
que reinicies tu computadora o termines el proceso con el administrador de
tareas.

También existen algunas variantes de este ciclo y son las siguientes:

Repetir mientras la condición sea falsa, se termina si la condición es


verdadera.
1 Do Until Condicion
2 'Bloque de Codigo
3 Loop

Repetir al menos una vez sin importar la condición, y luego repetir mientras
la condición sea verdadera.
1 Do
2 'Bloque de Codigo
3 Loop While Condicion

Repetir al menos una vez sin importar la condición, y luego repetir mientras
la condición sea falsa.
1 Do
2 'Bloque de Codigo
3 Loop Until Condicion

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

1. Cambia el factor de 1.3 a 1.25


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

Interactuando con Excel


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

¿Que son los objetos y clases?


Excel fue desarrollado usando programación orientada a objetos, esto
significa que utiliza objetos para trabajar con las celdas, hojas y libros. Ahora
debes estarte preguntando que son estos objetos, así que voy a definir esto
para que no tengas ninguna duda.

En la programación orientada a objetos se usan clases y objetos, la clase


contiene una definición general del objeto, en esta definición hay métodos,
eventos y propiedades. Los métodos realizan un proceso y las propiedades
contienen información sobre el objeto, los eventos son señales que se envían
cuando ocurre algo previamente definido. Pero veamos una analogía de la
vida real, digamos que tenemos una clase que se llama vehículo, que describe
de forma general un vehículo, entonces tiene estos métodos:
1. Encender vehículo, esto realiza un proceso, envía gasolina al motor, y
todo lo demás que se necesita para encender el motor.
2. Acelerar, esto incrementa la velocidad
3. Frenar, esto disminuye la velocidad
4. Apagar vehículo, detiene el motor.

Y también tiene estas propiedades:

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


2. Velocidad del vehículo

Algunos eventos podrían ser:

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.

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

Range
Ya usamos anteriormente este objeto, y puede representar una celda
individual o un rango de celdas el cual puede abarcar todas las celdas de la
hoja a la que pertenece.

Para dejar todo más claro aquí hay una imagen con la jerarquía de cómo están
organizados todos estos objetos.
Representación de objetos en Excel

## Referencias a objetos

La forma larga para acceder a cada objeto es a través de la jerarquía que


vimos anteriormente, por ejemplo, para acceder a la celda A1 de la primera
hoja, del primer libro abierto seria esta:
1 Application.Workbooks(1).Sheets(1).Range("A1")

Como Workbooks es una colección de libros, debemos decir entre paréntesis,


a cuál libro queremos referenciar, y lo hacemos por el número de 1 a n, o
también por su nombre, aunque lo más probable es que no vamos a conocer
el nombre del libro. Lo mismo ocurre con el objeto Sheets.

La buena noticia es que existen referencias o atajos para no tener que escribir
tanto para llegar al objeto que necesitamos, las referencias a objetos más
utilizadas son:

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


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

Eventos de Excel
Hasta ahora ya sabes cómo ejecutar una macro manualmente y como lo
mencione antes, los eventos de un objeto envían un mensaje de que algo ha
ocurrido. Lo que debes de saber ahora es que el evento también te permite
ejecutar una macro o cualquier código de VBA de forma automática en
respuesta a ese evento.

Básicamente hay dos tipos de eventos: los eventos de libros (Workbook) y


los eventos de hojas (Worksheet), cada uno tiene varios eventos, aunque lo
más probable es que nunca llegues a usar más de 5 eventos, es bueno que los
conozcas todos, porque nunca sabes cuándo podrían serte útil.

Eventos más usados en Libros


Evento Cuando se ejecuta
El libro es activado, por ejemplo, estabas en
Activate
otra ventaja y regresa al libro de Excel
AddinInstall Cuando instalas un complemento
AddinUninstall Cuando desinstalas un complemento
BeforeClose Justo antes de cerrar el libro
BeforePrint Justo antes de imprimir
BeforeSave Justo antes de guardar
Cuando cambias a otro libro u otro
Deactivate
programa que no sea Excel
NewSheet Creas una nueva hoja
Open Cuando abres el libro
SheetActivate Cuando cambias de hoja
SheetBeforeDoubleClick Antes de dar doble clic sobre una celda
SheetBeforeRightClick Antes de dar clic derecho en una celda
SheetCalculate Cuando la hoja calcula las formulas
SheetChange Cuando escribes algo en una celda
Cuando dejas de usar una hoja, porque
SheetDeactivate
cambias a otra
SheetFollowHyperlink Cuando haces clic sobre un enlace
SheetSelectionChange Cuando cambias la selección de celdas
WindowActivate Cuando cambias de libro
Cuando dejas de usar un libro, porque
WindowDeactivate
cambias a otro
Cuando la ventana o pantalla en que estás
WindowResize
viendo un libro, cambia de tamaño.
Eventos más usados en hojas
Evento Cuando se ejecuta
Activate Cuando cambias de hoja
BeforeDoubleClick Antes de hacer doble clic sobre una celda
BeforeRightClick Antes de hacer clic derecho sobre una celda
Calculate Cuando la hoja calcula las formulas
Change Cuando el contenido de una celda cambia
Deactivate Cuando cambias de hoja
FollowHyperlink Haces clic en un enlace
SelectionChange Cuando cambias la selección de celdas

Como acceder a los eventos


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

Agregar un evento

Al hacer eso, Excel va a generar una plantilla para el evento como esta:
1 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
2
3 End Sub

En este caso hay algunos parámetros entre paréntesis, puedes notar que el
primero inicia con ByVal, eso significa que puedes hacer uso de lectura de ese
parámetro (ByVal significa por valor), el segundo parámetro no tiene esa
palabra, eso significa que tienes acceso total y puedes leerla y modificarla.
Entonces vamos a modificar ese parámetro Cancel, si lo hacemos igual a
True, entonces el proceso se cancela y Excel no va a guardar el documento,
esto puede ser útil para realizar alguna validación. Validemos que la celda A1
deba tener algún valor antes de guardar, escribiendo este código:
1 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
2 If Range("A1").FormulaR1C1 = "" Then
3 MsgBox "Antes de guardar debe ingresar un valor valido, en la celda A1"
4 Cancel = True
5 End If
6 End Sub

Si tienes algún problema para crear la macro, puedes descargarla haciendo


clic aquí. Para probarla debes borrar el valor en la celda A1 e intentar guardar
los cambios.

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

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

Estos son los problemas que necesitas solucionar:

1. Debes generar un archivo por cada lista de precios (cada hoja en el


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

Primero vamos a necesitar una macro para poder solicitar al usuario en que
carpeta guardar los archivos nuevos, para esto vamos a usar una macro
genérica que podremos reutilizar en otros proyectos.
1 ' Pedir a usuario que seleccione una carpeta
2 Function SolicitarCarpeta() As String
3 Dim dialogoArchivo As FileDialog
4 Set dialogoArchivo = Application.FileDialog(msoFileDialogFolderPicker)
5
6 dialogoArchivo.Title = "Select a Folder"
7 dialogoArchivo.AllowMultiSelect = False
8 dialogoArchivo.InitialFileName = Application.DefaultFilePath
9 If dialogoArchivo.Show <> -1 Then
10 SolicitarCarpeta = ""
11 Else
12 SolicitarCarpeta = dialogoArchivo.SelectedItems(1)
13 End If
14
15 End Function

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

En el código anterior, primero declaramos algunas variables, en las que


LibroNuevo y LibroActual son de la clase Workbook, en ese caso van a ser
objetos y para asignar objetos no es suficiente utilizar el signo = también
tienes que anteponer la palabra let tal y como se ve en la línea:
1 Set LibroActual = ActiveWorkbook

La macro es realmente sencilla, pero los más probable es que te estés


preguntando, como harías para saber que métodos o propiedades utilizar si
quisieras hacer otra cosa, por ejemplo, imprimir una hoja.

Con el tiempo y la práctica vas a conocer muy bien todos estos objetos, pero
para comenzar puedes usar la documentación, para acceder a ella, desde el
editor de VBA presionas la tecla F2 y veras una pantalla como esta:

Examinador de objetos

En la parte izquierda se encuentra una lista de todas las clases (yo use la clase
Sheets para acceder a las hojas) y cuando seleccionas una clase, en la parte
derecha puedes ver la lista de propiedades (las que tienen un icono con una
mano) y métodos (los que tienen un icono con un rectángulo verde).

Si tienes dudas de cómo usar algún método, puedes hacer clic derecho y
seleccionara Ayuda del menú contextual. Eso te llevara a una página web
como ésta, con más detalle:
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%.
Extendiendo Excel
Ahora que ya tienes conocimientos más profundos sobre VBA y los objetos
de Excel, es hora de extender un poco a Excel y agregar algunas cosas que
nos ayuden a trabajar más rápido, como empaquetar algunos cálculos que
realices con frecuencia y convertirlos en funciones o ir un poco más allá y
convertir macros en complementos de Excel que puedas usar en todas las
hojas de Excel.

Crea tus propias funciones


Posiblemente la función Suma de Excel sea la función más utilizada por
todos, pero en tu caso particular podría haber fórmulas o cálculos que uses
con frecuencia, por ejemplo, el cálculo de precio en base a un costo y luego
agregar el impuesto de ventas.

Vamos a una función que haga eso, va a recibir un valor (el costo) y a hacer
el cálculo del precio final, crea un archivo de Excel y agrega un módulo y
este código:
1 Function calculaPrecio(costo As Currency)
2 Dim precio As Currency
3
4 'Agregar 30% de margen
5 precio = costo * 1.3
6
7 'Agregar 13% de IVA (Impuesto de ventas)
8 precio = precio * 1.13
9
10 'El mismo nombre de la funcion tambien funciona como
11 'variable en donde se asigna el valor a devolver
12 calculaPrecio = precio
13 End Function

Ahora si regresamos a la hoja de Excel, podemos seleccionar una celda y


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

Entonces para crear tus propias funciones, solo debes crear una función en
VBA que reciba los parámetros que necesites y que regrese un valor, ese
valor que regrese será el valor que se muestre en la celda que uses.

Ahora hay algunos problemas que debemos resolver, tú conoces muy bien la
fórmula que creaste y sabes para que sirve y que parámetros usas, pero otras
personas no lo saben y es por eso que debes agregar descripciones a la
función y a sus parámetros.

Función sin descripciones

Agrega documentación a tus fórmulas


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

Descripción de funciones

Vamos a usar como ejemplo la función que ya creamos, sigue los pasos
anteriores y la macro debe de quedar de esta forma:
1 Private Sub Workbook_Open()
2 'Declarar un array para las descripciones de cada argumento
3 Dim Param(1 To 1) As String
4 'Asignar la descripcion
5 Param(1) = "Costo del producto"
6
7 'Registrar la descripcion de la macro y de los parametros
8 Application.MacroOptions Macro:="calculaPrecio", _
9 Description:="Calcula un precio en base a un costo y agrega el impuesto de
venta\
10 s", _
11 ArgumentDescriptions:=Param
12 End Sub

Primero declaramos un arreglo, en este caso será de 1 a 1, porque solo hay


un parámetro, luego asignamos la descripción del parámetro al elemento 1 del
arreglo. Finalmente usamos la función Application.MacroOptions con 3
parámetros: (1) el nombre de la macro, (2) la descripción de la macro y (3) el
arreglo que contiene las descripciones de los parámetros.

Ahora, como esta macro se creó en el evento Open, deberás cerrar el libro y
volver a abrirlo para que tome los cambios o ejecutar el evento manualmente
la primera vez.

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

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

Descripción para varias funciones

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

Parámetros opcionales
En ocasiones podemos tener una función con parámetros opcionales,
imaginemos una función para aplicar un descuento que recibe el precio y el
tipo de cliente. Dependiendo de si el tipo de cliente es VIP o no, se aplicará
un descuento diferente, si no se define un tipo de cliente entonces se aplica el
descuento mínimo que es 5%.

Para definir que el parámetro es opcional se antepone la palabra Optional al


nombre del parámetro y al final se puede definir un valor predeterminado, el
cual se asigna automáticamente cuando omitimos su valor al llamar a la
función. Veamos la definición de los parámetros en este ejemplo:
1 'Calcula un descuento de acuerdo al tipo de cliente
2 Function aplicaDescuento(precio As Currency, Optional tipoCliente As String =
"regul\
3 ar")
4 Dim precioConDescuento As Currency
5
6 Select Case tipoCliente
7 Case "vip"
8 precioConDescuento = precio * 0.7
9 Case "silver"
10 precioConDescuento = precio * 0.9
11 Case Else
12 precioConDescuento = precio * 0.95
13 End Select
14
15 aplicaDescuento = precioConDescuento
16 End Function

Ahora, si usas esa función, verás que, si no defines el segundo parámetro,


toma el valor predeterminado y aplica el 5% de descuento.

Función con parámetros opcionales

Instalar y desinstalar complementos


Como abras notado, todas las macros que creas están disponibles únicamente
cuando tienes abierto el libro en donde las creaste, si el libro está cerrado, no
hay forma de poder utilizar tus macros. Pero esto se soluciona creando
complementos.

Los complementos son programas que extienden o complementa las


funcionalidades de Excel, puedes crear complementos usando código de otros
lenguajes de programación como Visual Basic o C#, pero también puedes
crearlos usando VBA y reutilizando las macros que ya creaste.

Veamos primero como instalar un complemento en tu Excel, imagina que


haces facturas o recibos en Excel y debes de escribir una cantidad en números
y en letras, por ejemplo $130.00 en una celda y CIENTO TREINTA CON
00/100 DOLARES en otra celda y piensas que sería bueno tener un
complemento que escriba la cantidad en letras en tu lugar, y de hecho existe
uno en mis blogs: https://excel.facilparami.com. Para continuar el ejercicio
descargar el complemento haciendo clic aquí.

Ahora en el menú Programador haces clic en la opción Complementos de


Excel y en la ventana que se mostrará, haces clic sobre el botón Examinar...
y buscas y selecciones el complemento que acabas de descargar y finalmente
haces clic en el botón Aceptar.

Instalar complementos

Ahora tienes el complemento instalado, has ganado la función numletras y


puedes usarla en cualquier hoja de Excel.

Probar complemento

Nota: En ocasiones puede suceder que cuando cierras Excel y lo abres


de nuevo, el complemento desaparece o deja de funcionar, eso pasa por
que la ubicación en donde guardaste el complemento no es de confianza.
Puedes solucionar eso siguiendo los pasos que están en este articulo:
Qué hacer si un complemento desaparece cada vez que cierras Excel

Si por alguna razón te cansas de un complemento y quieres desinstarlo


puedes ir al menú Programador y luego a Complementos de Excel y en la
lista de complementos solo debes desmarcar el cheque del complemento que
ya no deseas y hacer clic en el botón Aceptar.

desinstalar-complemento

Crea tus propios complementos


Ahora que has visto los complementos de Excel y lo que pueden hacer, es
hora de crear tu propio complemento. Esto es muy sencillo, solamente
necesitas un archivo con macros en él. Vamos a tomar como ejemplo el
archivo que creamos con las funciones para calcular el precio y descuento.

Abres el archivo y le das guardar como... y te aseguras de elegir el tipo


Complemento de Excel (*.xlam) eso va a generar tu código como un
complemento que puedes instalar en cualquier computadora y dejar que tus
macros estén disponibles, siempre.
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.
Corrigiendo Errores
Somos humanos y siempre cometemos errores, lo importante es que
aprendemos de ellos y hacemos lo posible por no repetirlos, entonces es de
esperar que al inicio nuestras macros tengan muchos errores, pero con el
tiempo eso va a cambiar. Sin embargo, todo código escrito por humanos
podría contener errores y todos los lenguajes de programación nos proveen de
herramientas para minimizarlos.

En este capítulo voy a explicarte los tipos de errores que puedes esperar y
como encontrarlos y corregirlos.

Que tipos de errores podemos esperar


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

Errores de sintaxis
Estos errores son los más sencillos de detectar y corregir, ya que el mismo
editor de VBA nos advierte y no permite ejecutar la macro hasta que lo
corregimos. Los errores de sintaxis se dan porque nos hemos equivocado al
usar alguna instrucción o no hemos seguido las reglas. Por ejemplo, observa
esta macro y trata de encontrar el error.
1 Sub TengoUnError()
2 Dim numero As Integer
3 If numero >= 0
4 'Hacer algo
5 End If
6 End Sub

La sintaxis de la instrucción if es:


1 If numero >= 0 then
2 'Hacer algo
3 End If

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

Errores en tiempo de ejecución


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

División entre cero

Una forma de eliminar estos errores es validando los datos antes de usarlos,
aquí está el código anterior con su corrección:
1 Sub divisionEntreCero()
2 Dim precio As Currency
3 Dim cantidadPagos As Single
4 Dim cuota As Currency
5
6 precio = 125
7
8 If cantidadPagos > 0 Then
9 cuota = precio / cantidadPagos
10 Else
11 cuota = precio 'Todo en una sola cuota
12 End If
13
14 End Sub

En este caso resolvimos el error asignado un valor predeterminado para


cuando la cantidad de pagos sea cero, en otros casos no hay forma de asignar
un valor predeterminado, entonces lo mejor es detener la ejecución y emitir
un mensaje de error.
1 Sub divisionEntreCero()
2 Dim precio As Currency
3 Dim cantidadPagos As Single
4 Dim cuota As Currency
5
6 precio = 125
7
8 If cantidadPagos > 0 Then
9 cuota = precio / cantidadPagos
10
11 '... continuar con el codigo
12
13 Else
14 '... detener todo y emitir mensaje de error
15 MsgBox "Por favor defina una cantidad de pagos para continuar"
16 End If
17
18 End Sub

Los errores en tiempo de ejecución son difíciles de predecir, la mejor forma


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

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

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


este:
1 Function margen(ingresos As Currency, costos As Currency)
2 margen = costos - ingresos
3 End Function

No vas a obtener un error visible, simplemente un mal cálculo por haber


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

Como depurar código en el editor de VBA.


La depuración en programación es el proceso por el cual se detectan y
corrigen errores en el código, esto se hace usualmente ejecutando el código
instrucción por instrucción y revisando los valores de las variables.

Para comprender como es el proceso de depuración y las herramientas que


tenemos disponibles, vamos a tomar como ejemplo, una función que debe
calcular un descuento. Imagina que te han reportado que en ocasiones no
calcula el descuento de forma correcta y los clientes se molestan, entonces te
han pedido que revises el código y resuelvas el problema. Como regla del
negocio todos los clientes vip tiene 30% de descuento, los clientes silver
tienen un 15% y los demás tienen un 5% de descuento. La función que debes
revisar es esta:
1 'Calcula un descuento de acuerdo al tipo de cliente
2 Function aplicaDescuento(precio As Currency, _
3 Optional tipoCliente As String = "regular") _
4 As Currency
5 Dim precioConDescuento As Currency
6
7 Select Case tipoCliente
8 Case "vip" '30% de descuento
9 precioConDescuento = precio * 0.7
10 Case "silver" '15% de descuento
11 precioConDescuento = precio * 0.9
12 Case Else '5% de descuento
13 precioConDescuento = precio * 0.95
14 End Select
15
16 aplicaDescuento = precioConDescuento
17 End Function

Lo primero que debes de saber es que no puedes iniciar la depuración con


una función, si deseas depurar la función entonces necesitas crear una
subrutina que llame a la función e iniciar la depuración ejecutando la
subrutina. Entonces agregas este código:
1 'Subrutina para llamar a la funcion de descuentos
2 Sub depurarFuncionDescuentos()
3 Dim descuento As Currency
4
5 'Probar descuentos VIP
6 descuento = aplicaDescuento(100, "vip")
7
8 'Probar descuentos Silver
9 descuento = aplicaDescuento(100, "silver")
10
11 'Probar otros descuentos
12 descuento = aplicaDescuento(100, "")
13
14 End Sub
Ejecutar código paso a paso
Ahora para iniciar el proceso de depuración puedes colocar el cursor o
hacer clic sobre la subrutina que debes corregir y elegir el menú
Depuración y la opción Paso a paso por instrucciones.

Depurar paso a paso

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

Opciones de ejecución

Cada tecla o combinación hacen algo diferente, si presionas F8 iras avanzado


instrucción por instrucción y si la instrucción es la llamada a otra función o
subrutina, entonces ingresarás a esa función o subrutina y avanzaras
instrucción por instrucción.

Si presionas Mayus+F8 entonces avanzaras instrucción por instrucción, pero si


la instrucción es la llamada a una función o subrutina, pasas a la siguiente
instrucción sin ingresar al detalle de esa función o subrutina.

Si presionas Ctrl+Mayus+F8, entonces vas a saltar directo a al final de la


función o subrutina actual.

Si presionas Ctrl+F8 entonces avanzas hasta donde este posicionado el


cursor.

Nota: Para comprender mejor todo esto, lo mejor es que lo intentes tú


mismo, puedes descargar esta hoja de ejemplo en este enlace.

Puntos de interrupción
Los puntos de interrupción son líneas de código que marcas para que cuando
la ejecución del código llegue a esa línea, el programa se interrumpa e inicie
el modo de depuración justo desde esa línea. Para establecer un punto de
interrupción solo debes hacer clic en la barra gris que está a la izquierda del
código, cuando lo hagas se activará un punto de interrupción justo en la línea
de código que este en esa altura. Sabrás que hay un punto de interrupción
cuando veas un círculo rojo en esa barra.

Debes saber que solamente se pueden crear puntos de interrupción para líneas
de código ejecutables, es decir, no puedes hacerlo para líneas como
declaraciones de variables. Para desactivar un punto de interrupción solo
debes de hacer clic sobre el círculo rojo que corresponde al que deseas
eliminar. Has unas pruebas, para que veas como funciona esta parte

Punto de interrupción

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...

Agregar inspección

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

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

Inspecciones

Mostrar mensajes de depuración


Otra forma de depurar código es mostrando mensajes de depuración, puedes
imprimir en pantalla información como valores de variables, cálculos o
mensajes que indiquen el camino que el código siguió, por ejemplo, si
ingresó en un bloque if. Para esto utilizas la función Debug.Print, esta se
usa igual que la función msgbox, veamos un ejemplo, ahora la función
muestra un mensaje indicando que tipo de descuento va a calcular.
1 'Calcula un descuento de acuerdo al tipo de cliente
2 Function aplicaDescuento(precio As Currency, _
3 Optional tipoCliente As String = "regular") _
4 As Currency
5 Dim precioConDescuento As Currency
6
7 Select Case tipoCliente
8 Case "vip" '30% de descuento
9 Debug.Print "Calcula descuento VIP"
10 precioConDescuento = precio * 0.7
11 Case "silver" '15% de descuento
12 Debug.Print "Calcula descuento silver"
13 precioConDescuento = precio * 0.9
14 Case Else '5% de descuento
15 Debug.Print "Calcula descuento para cliente regular"
16 precioConDescuento = precio * 0.95
17 End Select
18
19 aplicaDescuento = precioConDescuento
20 End Function
Para poder ver estos mensajes primero debes mostrar la ventana Inmediato,
esto se logra con el menú Ver y la opción Ventana Inmediato

ventana-inmediato

Ahora si ejecutas el código, verás los mensajes de depuración, en esta macro


se llamó a la función 3 veces con diferentes parámetros y en la ventana
inmediato, está el resultado de cada llamado.

Ventana inmediato - ejemplo

En la función Debug.Print también puedes usar el signo & para unir textos y
variables, para crear mensajes más informativos, por ejemplo:
1 Debug.Print "El precio con descuento es: " & precioConDescuento

Control de errores en tiempo de ejecución


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

Error en ejecución

Como puedes ver el mensaje no es nada amigable y el usuario solo podrá


pensar que el programa “no sirve” y que no puede hacer nada para solucionar
este problema, cuando la verdad es que el mismo usuario puede solucionar el
problema con solo cambiar el nombre de la hoja, pero no lo hace porque no
sabe que ese es el problema.

Tenemos dos opciones para tratar este problema, la primera es detener toda la
ejecución y mostrar un mensaje indicando el problema, y la segunda es,
ignorar el error y continuar con la ejecución del código restante. La decisión
que tomes va a depender de lo critico que consideres que sea el error, solo
responde esta pregunta: ¿El no haber ejecutado esta instrucción afectará el
comportamiento del código que hace falta ejecutar o dará un resultado
equivocado al usuario?

Una vez tomes la decisión, la forma para ignorar el error y continuar con la
ejecución es colocando esta instrucción al inicio de la subrutina o función:
1 On Error Resume Next

El código completo quedará así:


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

Para terminar el programa y mostrar un mensaje de error, debes colocar esta


línea de código al inicio de la función o subrutina:
1 On Error GoTo ControlErrores

La palabra ControlErrores es una etiqueta puede tener el nombre que


desees, pero sin espacios en blanco. Luego al final de la función o subrutina
colocas estas líneas de código:
1 'Asegurarse que en ejecución normal
2 'no se llegue mas lejos de aqui
3 Exit Sub
4
5 ControlErrores:
6 MsgBox "Ocurrio este error al generar los archivos: " & Err.Description

Si usas una función cambia las palabras Exit Sub por Exit Function, si
usaste otra etiqueta que no sea ControlErrores, recuerda también cambiarla
en esta parte dejando siempre los : en la parte derecha (ControlErrores:).
También debes personalizar el mensaje que se muestra con MsgBox, la
variable Err.Description contiene el mensaje de error que genera el
sistema, eso ayudara al usuario a saber cúal es el problema. El código final
deberá verse como este:
1 'Genera un archivo por cada hoja en este libro
2 Sub GeneraArchivosPrecios_MuestraError()
3 Dim carpeta As String
4 Dim i As Integer
5 Dim LibroNuevo As Workbook
6 Dim LibroActual As Workbook
7
8 On Error GoTo ControlErrores
9
10 'Preguntar en que carpeta colocar este archivo
11 carpeta = SolicitarCarpeta
12
13 If carpeta = "" Then
14 MsgBox "No selecciono la carpeta en donde se guardaran los archivos"
15 Else
16 Set LibroActual = ActiveWorkbook
17 Application.ScreenUpdating = False
18 For i = 1 To LibroActual.Sheets.Count
19 'creamos un libro nuevo.....
20 Set LibroNuevo = Workbooks.Add
21
22 'Hacemos la copia de toda la hoja en el nuevo libro
23 LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1)
24
25 'Eliminar columna de costo (C)
26 LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete
27
28 'Guardar libro en la carpeta definida y con el nombre de la hoja
29 LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name
30
31 'Cerrar el libro
32 LibroNuevo.Close
33 Next i
34 Application.ScreenUpdating = True
35 End If
36
37 'Asegurarse que en ejecució normal
38 'no se llegue mas lejos de aqui
39 Exit Sub
40
41 ControlErrores:
42 MsgBox "Ocurrio este error al generar los archivos: " & Err.Description
43 End Sub

Puedes descargar una hoja con estos ejemplos, para que los pruebes y
veas la diferencia, existen 3 macros para que puedas observar cómo
funciona sin control de errores (GeneraArchivosPrecios), ignorando el
error (GeneraArchivosPrecios_IgnoraError) y mostrando el mensaje
de error (GeneraArchivosPrecios_MuestraError).
Ejercicio
¿Recuerdas el caso del error que mencionamos al inicio y que nunca
resolvimos?: “Imagina que te han reportado que en ocasiones no calcula el
descuento de forma correcta y los clientes se molestan, entonces te han
pedido que revises el código y resuelvas el problema. Como regla del negocio
todos los clientes vip tiene 30% de descuento, los clientes silver tienen un
15% y los demás tienen un 5% de descuento.”. Descarga esta hoja de Excel,
revisa la macro depurarFuncionDescuentos, encuentra y resuelve el
problema aplicando lo que has aprendido en este capitulo
Mensajes y cuadros de diálogo
En este capítulo aprenderás algunas formas en las que puedes comunicarte
con las personas que usan tus macros, veremos como mostrar mensajes y
cómo capturar información para utilizar en tus programas.

Mostrar mensajes en la barra de estado de Excel


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

Mensaje en barra de estado

Usualmente se usan estos mensajes para mantener al usuario informado del


proceso de la macro, cuando la misma se está tardando mucho tiempo, por
ejemplo, mostrando el porcentaje de avance. También puedes usarla para
otros tipos de mensajes como “Datos guardados”, “Archivo generado”.

Para mostrar mensajes en la barra de estados puedes utilizar el siguiente


código y solo debes de modificar el texto entre comillas, por el texto que
desees.
Sub msgStatusBar() Application.StatusBar = "Procesando macro..."
End Sub
Mostrar mensajes usado MsgBox
Anteriormente habíamos utilizado MsgBox, para mostrar mensajes, pero
existen algunos parámetros extra que puedes utilizar en esta función. MsgBox
tiene tres parámetros que nos interesan:

Prompt: Es el mensaje que mostramos al usuario


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

Lista de valores posibles para el parámetro Buttons

Constante Valor Descripción


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

Podemos combinar los valores anteriores a nuestro antojo sumando las


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

y el resultado será este:

msgbox1

Hacer una pregunta utilizando MsgBox


En el ejemplo anterior hicimos una pregunta utilizando MsgBox, pero no
capturamos ninguna respuesta. Como lo he dicho antes, ésta es una función y
las funciones regresan un valor, en este caso regresa el código del botón que
presiono el usuario. Ahora solo necesitas un bloque if, para determinar que
hacer.
1 `Sub msgbox2()
2 If MsgBox("Este proceso va a sobre-escribir el libro", vbExclamation +
vbOKCancel) \
3 = vbOK Then
4 'El usuario acepta continuar
5 Else
6 'El usuario cancela la operacion
7 End If
8 End Sub`
Debes de notar, que para que la función regrese el valor, debes colocar todos
los parámetros entre paréntesis. En este caso preguntamos si el valor de
retorno es vbOK (el usuario presiono el botón Ok), para una lista completa de
los valores de retorno puedes consultar esta lista:

Constante Valor Descripción


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

Ventana de diálogo para trabajar con archivos


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

Mostrar un formulario para seleccionar un archivo


Aquí hay un ejemplo de una función que regresa el nombre y ruta del archivo
que seleccione un usuario a través del cuadro de diálogo Abrir archivo. El
código se limita a regresar el nombre del archivo seleccionado, pero no
realiza la lectura de este.
1 Function AbrirArchivo()
2 ' Crear un objeto de tipo FileDialog.
3 Dim fd As Office.FileDialog
4 Set fd = Application.FileDialog(msoFileDialogFilePicker)
5
6 ' Titulo del formulario
7 fd.Title = "Seleccione un archivo de texto"
8
9 ' Podemos agregar filtros para que solo muestre ciertas
10 ' extensiones de archivos
11 ' El metodo Add, recibe dos parametros:
12 ' 1: Una descripcion
13 ' 2: Un filtro, en este caso *.txt
14 fd.Filters.Add "Archivos de texto", "*.txt"
15
16 ' Mostrar el cuadro de dialog.
17 If fd.Show = True Then
18 If fd.SelectedItems.Count > 0 Then
19 Debug.Print fd.SelectedItems(1) ' Obtiene el archivo y ruta.
20 Debug.Print Dir(fd.SelectedItems(1)) ' Solo el nombre del archivo.
21
22 ' Regresa el archivo con su ruta
23 AbrirArchivo = fd.SelectedItems(1)
24 End If
25 End If
26 End Function

Mostrar un formulario para seleccionar una carpeta


Con esta macro podemos pedir al usuario que seleccione una carpeta, luego
podemos trabajar creando o leyendo archivos dentro de esa carpeta. Usamos
la macro únicamente para que el usuario elija en que carpeta vamos a
trabajar.
1 Function SeleccionarCarpeta()
2 ' Crear un objeto de tipo FileDialog.
3 Dim fd As Office.FileDialog
4 Set fd = Application.FileDialog(msoFileDialogFolderPicker)
5
6 ' Titulo del formulario
7 fd.Title = "Seleccione una carpeta"
8
9 ' Mostrar el cuadro de dialog.
10 If fd.Show = True Then
11 If fd.SelectedItems.Count > 0 Then
12 Debug.Print fd.SelectedItems(1) ' Carpeta seleccionada.
13
14 ' Regresa el archivo con su ruta
15 SeleccionarCarpeta = fd.SelectedItems(1)
16 End If
17 End If
18 End Function

Mostrar un formulario de tipo Guardar como…


Si lo que necesitas es guardar un archivo, puedes solicitar a las personas, el
nombre y ruta en donde desean guardar algún archivo utilizando esta macro:
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.
Crear formularios avanzados
En este capítulo aprenderás a crear formularios; los formularios son ventanas
en las que puedes utilizar cajas de textos, botones, listas desplegables, etc.,
con todo lo que necesitas para crear interfaces de usuario muy avanzadas.

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

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

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


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

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

Vamos a crear un formulario como este

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.
Editar un formulario

Vamos a hacer algunos cambios a este formulario, primero vamos darle un


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

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”.

Cambiar el titulo

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

Como utilizar botones de comando


Los botones de comandos permiten ejecutar algún código cuando el usuario
los presiona. En este ejemplo vamos a crear dos botones, uno para agregar los
datos en la hoja de cálculo y otro para cerrar el formulario sin hacer nada.

Ahora vamos a insertar los botones, para esto necesitamos el cuadro de


herramientas, si no puedes verlo, debes activarlo en menú Ver > Cuadro de
herramientas.
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.

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.
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:
1 Private Sub cmdCancelar_Click()
2 Me.Hide
3 End Sub

Existe un objeto predeterminado llamado Me, éste hace referencia al


formulario, entonces en el código anterior usamos el método Hide del
formulario para esconderlo (cerrarlo) cuando el usuario presione el botón
Cancelar.

Como ya tenemos un botón y algo de código, podemos probar el formulario,


en este caso solo tenemos un formulario, pero en el caso de tener más de uno,
podemos asegurarnos de que vamos a ejecutar el formulario correcto,
regresando a la vista de diseño del formulario, para hacer eso solo hacemos
doble clic sobre el nombre del formulario en la ventana de proyecto y para
ejecutarlo, presiona el botón Ejecutar o presiona la tecla F5

Ejecutar un formulario

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

Como utilizar etiquetas


Las etiquetas son esos textos que se encuentra la izquierda de los campos de
texto, estas ayudan a que las personas tengan claridad de que información se
les está solicitando.

Para insertar una etiqueta haces clic sobre el icono con una letra A, en el
cuadro de herramientas, y luego haces clic en el formulario.
Agregar una etiqueta

Ahora debes ajustar el nombre y el texto, esto se hace cambiando las


propiedades name y caption respectivamente, tal y como se ve en esta
imagen. El prefijo lbl en el nombre, es por label (etiqueta en inglés)

Propiedades de la etiqueta

Repite el proceso anterior para crear 3 etiquetas adicionales y cambias sus


propiedades para que tengan estos valores

Nombre Texto
lblNombre Nombre
lblCantidad Cantidad
lblUnidad Unidad

Como utilizar cuadros de texto


Los cuadros de texto se utilizan para agregar información, de esta forma
puedes solicitar al usuario que ingrese un dato y luego trabajar con ese dato.

Para agregar un cuadro de texto, haces clic sobre el icono que se muestra en
la siguiente imagen, y luego haces clic sobre el formulario.
Agregar un cuadro de texto

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

Propiedades del cuadro de texto

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

Como utilizar botones de radio


Los botones de radio se utilizan para solicitar al usuario que seleccione una
sola opción de entre una cantidad pequeña de opciones, por ejemplo, si
deseas conocer el género de la persona, puedes crear dos botones de radio,
uno para masculino y otro para femenino. En este caso lo vamos a utilizar
para preguntar si el producto se encuentra activo o inactivo.

Debido a que un formulario puede tener más de un grupo de botones de radio,


para información o preguntas diferentes, entonces es necesario poder
agruparlos. Para agruparlos usamos un control especial llamado marco.
Para agregar un marco hacemos clic sobre este icono y luego hacemos clic
sobre el formulario.

Agregar un marco

Ahora vamos a cambiar dos de sus propiedades: Nombre (Name) y Texto


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

Propiedades del marco

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

Agregar un botón de radio


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

Nombre (Name) Texto (Caption)


optActivo Activo
optInactivo Inactivo
Al final tendrás algo como esto:

Ejemplo de botones de
radio

Si ejecutas el formulario en este momento (presionando la tecla F5), podrás


observar que cuando seleccionas un botón de radio, el otro se desmarca, de
forma que solamente uno puede estar seleccionado.

Como utilizar casillas de selección o checkbox


Las casillas de selección o checkbox se usan para preguntar algo cuya
respuesta es Si o No. En nuestro caso, haremos uso de ellas para preguntar si
el producto permite realizar descuentos.

Para agregar la casilla de selección debes marcar el icono que se muestra en


la imagen y luego hacer clic sobre el formulario.

Agregar una casilla de selección

Luego lo acomodas en la posición que desees y cambias su nombre y texto,


como se muestra en esta imagen:
Opciones para la casilla de selección

Como utilizar listas de selección


Las listas de selección (también conocida como Combo Box en inglés) se
utilizan para seleccionar una opción de entre muchas otras opciones. En este
ejemplo vamos a utilizarla para seleccionar la unidad de medida del producto,
la cual podría ser: Cajas, Unidad, Docenas, Litros, etc.

Para crear una lista de selección, haz clic en el icono Cuadro Combinado y
luego haces clic sobre el formulario

Combo box o lista de selección

Cuando agregues este control debes cambiar su nombre a cboUnidad, para


poder ejecutar el código que vamos a escribir más adelante.

Si has seguido todos los pasos, ya tienes todos los controles que necesitamos
para hacer funcionar el formulario. Si aún no has ordenado todos los
controles en su lugar y con su tamaño respectivo, aquí está de nuevo la
imagen de cómo debe de lucir:
Formulario

Trabajando con eventos


Cada vez que realizas una acción sobre un formulario, esta se procesa como
un evento, por ejemplo, hacer clic sobre un botón, escribir sobre un cuadro de
texto, seleccionar un botón de radio, etc. Estos eventos ejecutan un código o
conjunto de instrucciones para responder a ese evento.

Hasta ahora nuestro formulario se ve muy bien, pero no hace nada útil.
Vamos a comenzar usando el evento Activate del formulario para llenar los
valores de la lista de unidades, el evento activate se dispara cada vez que el
formulario se “Activa” o se torna visible, usualmente porque lo llamas por
primera vez o por que estabas en otra aplicación y regresas a tu macro.

Para ingresar al evento, primero haces doble clic sobre cualquier parte del
formulario para ingresar al código, luego verás dos listas en la parte superior,
en la primera seleccionas UserForm, que es el formulario, y en la segunda
lista seleccionas Activate, que es el evento Activate del formulario.

Seleccionar un evento

Ahora ingresas este código en el evento:


1 Me.cboUnidad.Clear
2 Me.cboUnidad.AddItem ("Unidad")
3 Me.cboUnidad.AddItem ("Caja 12 unidades")
Como vamos a trabajar con la lista de opciones (combo box), primero
escribimos Me que representa al formulario, luego escribimos un . y el
nombre de la lista (cboUnidad), luego otro . y el método (o función) Clear,
el cual borra todas las opciones que existan en la lista, hacemos esto para
limpiar la lista de cualquier otro valor.

Luego escribimos un código similar, pero ahora llamamos al método AddItem


de la lista y entre paréntesis le enviamos los nombres de las opciones que
necesitamos agregar.

Si ejecutamos el formulario ahora, podremos ver que la lista ya tiene


opciones para seleccionar.

Al ejecutar el evento

Algunas macros para nuestro formulario


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

Entonces abrimos el editor de VBA y creamos una macro con este código:
1 Sub MostrarFormularioProducto()
2 Dim f As New frmProducto
3 f.Show
4 End Sub

En la primera línea declaramos una variable de tipo frmProducto, este es el


nombre de nuestro formulario, también usamos la palabra New para inicializar
la variable. Luego en la siguiente línea usamos el método show del
formulario para mostrarlo.
Como mostrar un formulario

Ahora creamos la macro para insertar una línea de contenido en la hoja de


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

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

Utilizo un ciclo While para recorrer la hoja de cálculo, porque no sé cuántas


filas debo revisar hasta encontrar una celda vacía. Cuando encuentro una
celda vacía, entonces el ciclo termina y ya tengo mi primera fila vacía.

Luego comienzo a llenar cada celda de esa fila, con los valores que recibí
como parámetro. La columna F contiene la fecha de creación, esta fecha no
se recibe como parámetro, así que se toma la fecha del sistema, usando la
función Now().

Como leer la información de un formulario


Ahora que tenemos la función para agregar filas a la hoja de cálculo, vamos a
leer la información del formulario e ingresarla en la hoja de Excel.

Primero abrimos el formulario y hacemos doble clic sobre el botón aceptar


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

Primero declaro dos variables para poder leer los valores de los botones de
radio y de las casillas de selección. En general para leer el valor de un
control, usamos la propiedad Value de cada control. Por ejemplo,
txtCodigo.Value me regresa el código del producto.

Pero en el caso de los botones de radio y las casillas de selección, esa


propiedad va a regresar un valor True si está marcada y False si no lo está.
Por eso usamos un bloque IF para darle sentido y luego almaceno su
interpretación en una variable.

Finalmente, en las últimas dos líneas del código, se llama a la función


InsertarProducto para agregar la fila y luego se usa el método Hide para
cerrar el formulario.

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


Código del formulario

Y la buena noticia es que ya tienes un formulario completamente funcional.


Puedes ejecutar la macro que creamos MostrarFormularioProducto para
llamar a tu formulario cuando lo necesites desde tu hoja de cálculo.

Como agregar validaciones a tu formulario


El formulario que has creado funciona muy bien, pero si alguien ingresa
información con errores, entonces tu hoja de cálculo va a tener información
sucia. Para evitar esto, debemos crear validaciones que no permitan ingresar
datos equivocados.

Para validar los datos, vamos a reemplazar el código del botón Aceptar, por
este otro código:
1 Dim EsCorrecto As Boolean
2 Dim Estado As String
3 Dim Descuentos As String
4
5 EsCorrecto = True
6
7 If txtCodigo.Value = "" Then
8 MsgBox "Debe ingresar un codigo"
9 EsCorrecto = False
10 End If
11
12 If txtNombre.Value = "" Then
13 MsgBox "Debe ingresar un nombre"
14 EsCorrecto = False
15 End If
16
17 If txtCantidad.Value = "" Then
18 MsgBox "Debe ingresar la cantidad"
19 EsCorrecto = False
20 Else
21 If Not IsNumeric(txtCantidad.Value) Then
22 MsgBox "La cantidad debe ser numerica"
23 EsCorrecto = False
24 End If
25 End If
26
27 If cbUnidad.Value = "" Then
28 MsgBox "Debe ingresar una unidad"
29 EsCorrecto = False
30 End If
31
32 If obActivo.Value Then
33 Estado = "Activo"
34 Else
35 Estado = "Inactivo"
36 End If
37
38 If ckDescuentos.Value Then
39 Descuentos = "Si"
40 Else
41 Descuentos = "No"
42 End If
43
44 If EsCorrecto Then
45 InsertarProducto txtCodigo.Value, txtNombre.Value, Estado,
txtCantidad.Value\
46 , cbUnidad.Value, Descuentos
47 Me.Hide
48 End If

Básicamente usamos instrucciones IF para preguntar si el dato de cada


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

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

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


2. Agregar un cuadro de texto en el formulario
3. Modificar la función InsertarProducto para que tome el precio como
parámetro y además lo inserte en la columna H
4. Modificar el código del botón aceptar para enviar este nuevo parámetro
en la función InsertarProducto.
Uso de Workbooks
En el capítulo 4 aprendimos sobre el modelo de objetos de Excel y que eran
los Workbooks, en este capítulo vamos a profundizar un poco más en este
tema, mientras vemos algunos ejemplos acerca de su utilización.

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

Crear un nuevo archivo de Excel


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

Vamos a crear un archivo que nos servirá para hacer los demás ejemplos,
para hacerlo puedes utilizar una macro como esta:
1 Sub CrearArchivo()
2 Dim NombreArhivo As String
3 Dim Libro As Workbook
4
5 'Nombre del archivo
6 NombreArhivo = "demo.xlsx"
7
8 'Crear un nuevo libro, usando metodo add
9 Set Libro = Workbooks.Add()
10
11 'Guardar el libro con el nombre que digamos
12 'Si no definimos una ruta, se guarda
13 'en la carpeta en donde esta este archivo con macros
14 Libro.SaveAs NombreArhivo
15
16 End Sub

Cuando creamos un libro usando Workbooks.Add() podemos guardar una


referencia al nuevo libro creado, al asignarlo en una variable de tipo
Workbook y usando la palabra reservada Set.

Abrir un archivo de Excel


Para abrir un archivo de Excel podemos usar el método Open del objeto
Workbooks, como parámetro obligatorio debemos pasar el nombre del archivo
de Excel y su ruta completa, si omitimos la ruta, entonces Excel va a buscar
el archivo en la misma carpeta en donde se encuentra.

Un ejemplo de cómo hacerlo es mediante la macro que mostraré a


continuación, solo debes de tener en cuenta de que debe haber un archivo
llamado demo.xlsx en la misma carpeta.
1 Sub AbrirWorkbook()
2 Workbooks.Open Filename:="demo.xlsx"
3 End Sub

Como puedes ver, al método Open le podemos pasar parámetros indicando el


nombre del parámetro seguido de := y el valor del parámetro, que en este
caso es el nombre del archivo.

Si ejecutas el código anterior y el archivo no existe, entonces verás un error


que quizá podría hacer pensar que la macro no funciona, cuando en realidad
el problema es que el archivo no existe.

Error al abrir archivo si no


existe

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


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

Como puedes ver ahora el nombre del archivo se encuentra en una variable, y
usamos la función de VBA Dir para probar el nombre del archivo, si el
resultado es diferente de una cadena vacía entonces abrimos el archivo, si no
mostramos un error.

La función Dir evalúa una cadena de texto en donde se encuentre el nombre o


parte del nombre de un archivo y regresa el nombre del archivo que coincida
con la búsqueda, por ejemplo, podrías usar un comodín como el * de esta
forma:
1 Archivo = Dir("demo.x*")

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

Abrir un archivo de Excel indicado por el usuario


El código anterior funciona muy bien, pero debes conocer el nombre archivo
con el que vas a trabajar. En ocasiones debes permitir que el usuario busque
el archivo que necesita, por ejemplo, si tu macro va a procesar los datos que
se encuentra en un archivo de Excel.

Vamos a necesitar una forma sencilla de pedir al usuario que nos de la ruta
completa del archivo que necesita, en nuestro caso es mejor crear una
función, de esta forma podemos reutilizar esta funcionalidad cuando lo
necesitemos. Vamos a crear una función con este código:
1 Function AbrirArchivo()
2 Dim Arch As Variant
3 Arch = Application.GetOpenFilename(FileFilter:="Excel, *.xlsx",
Title:="Archivos\
4 de Excel...")
5
6 If Arch <> False Then
7 AbrirArchivo = Arch
8 End If
9 End Function

Usaremos la función GetOpenFilename del objeto Application, primero le


pasamos el parámetro FileFilter para mostrar solo archivos de Excel con
extensión *.xlsx, luego le pasamos el parámetro Title para definir un título
para la ventana que abrimos para solicitar el archivo.

Como puedes observar usamos la variable Arch para obtener el resultado de


la función y la hemos definido como Variant, este tipo de datos es un tipo
que puede cambiar, por ejemplo, si la función GetOpenFilename se ejecuta y
el usuario la cancela sin seleccionar un archivo, entonces regresa un valor
False (Boolean) y si no regresa el nombre completo del archivo (String)

Puedes modificar el filtro para buscar otro tipo de archivos, modificando la


extensión en el filtro, por ejemplo, para mostrar solo archivos de texto puedes
usar este código:
1 Arch = Application.GetOpenFilename(FileFilter:="Texto, *.txt")

La parte del filtro antes de la , es solo una descripción, lo que hace que el
filtro funcione es lo que va después, en este caso *.txt

Ahora veamos cómo debe de quedar la macro completa


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

Verificar si un archivo está abierto


Antes de intentar trabajar con un archivo, es una buena práctica, verificar si el
archivo ya está abierto, de otra forma podríamos obtener un error. Por
ejemplo si necesitamos obtener datos de un archivo, podemos verificar si ya
lo abrimos, antes de intentar leerlo.

El objeto Application.Workbooks contiene una referencia a todos los libros


o archivos abiertos en Excel, podemos recorrerlos todos y verificar si ya está
abierto el que necesitamos.

Vamos a utilizar el ciclo For Each, este ciclo va a recorrer todos los
elementos que se encuentren en un conjunto de datos. En el código siguiente,
el ciclo For Each va a recorrer el contenido en Application.Workbooks y
guardará temporalmente cada elemento en la variable libro para que
podamos evaluar su contenido.
1 Function LibroAbierto(NombreLibro) As Boolean
2 Dim libro As Workbook
3
4 'Remover la ruta y dejar solo el nombre del archivo
5 NombreLibro = Dir(NombreLibro)
6
7 'Inicializamos a falso mientras no comprobar que existe
8 LibroAbierto = False
9 For Each libro In Application.Workbooks
10 If libro.Name = NombreLibro Then
11 LibroAbierto = True
12 'Salimos, ya no hay necesidad de seguir buscando
13 Exit For
14 End If
15 Next
16 End Function

La función anterior regresa True si el archivo se encuentra abierto, vamos a


modificar la macro para abrir un libro, de modo que verifique si el libro ya se
encuentra abierto, antes de intentar abrirlo nuevamente. El código completo
quedará de esta forma:
1 Function LibroAbierto(NombreLibro) As Boolean
2 Dim libro As Workbook
3
4 'Remover la ruta y dejar solo el nombre del archivo
5 NombreLibro = Dir(NombreLibro)
6
7 'Inicializamos a falso mientras no comprobar que existe
8 LibroAbierto = False
9 For Each libro In Application.Workbooks
10 If libro.Name = NombreLibro Then
11 LibroAbierto = True
12 'Salimos, ya no hay necesidad de seguir buscando
13 Exit For
14 End If
15 Next
16 End Function
17
18 Sub AbrirWorkbook4()
19 Dim Archivo As String
20
21 Archivo = AbrirArchivo()
22
23 If Dir(Archivo) <> "" Then
24 'Revisar si ya esta abierto...
25 If LibroAbierto(Archivo) Then
26 MsgBox "El archivo ya esta abierto"
27 Else
28 Workbooks.Open Filename:=Archivo
29 End If
30 Else
31 MsgBox ("El archivo " & Archivo & " no existe")
32 End If
33
34 End Sub

Cerrar un archivo de Excel


Una vez, terminemos de trabajar con un archivo, podemos cerrarlo. Como
vimos anteriormente en el objeto Workbooks se encuentra una referencia a
todos los libros abiertos, entonces, podemos usar su método Close para cerrar
cualquier libro que necesitemos.

Esta es una función que permite cerrar el libro que le enviemos como
parámetro, antes de intentar cerrarlo vamos a utilizar la función que creamos
anteriormente para verificar que el libro está abierto, antes de intentar
cerrarlo.
1 Sub CerrarLibro(libro As String)
2 'Remover la ruta
3 libro = Dir(libro)
4
5 'Verificar si el libro esta abierto antes de intentar cerrarlo
6 If LibroAbierto(libro) Then
7 Workbooks(libro).Close
8 End If
9 End Sub

Vamos a modificar la macro de abrir un libro para que luego de procesar


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

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

Guardar un archivo de Excel


Para guardar un archivo puedes usar cualquiera de los métodos Save o
SaveAs del objeto Workbook. Ya hemos usado este método, pero ahora vamos
a explorar otras opciones o parámetros que puedes utilizar.

El método Save no tiene ningún parámetro, simplemente guardar el libro en


el formato actual, ubicación actual, etc. Pero el método SaveAs tiene los
siguientes parámetros:

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

Cuando utilizamos estas opciones, lo más recomendable es usar sus nombres,


por ejemplo, para guardar el archivo usando una clave podemos usar este
código:
1 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 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)
Uso de WorkSheets
En este capítulo vamos a aprender a trabajar con Hojas de Excel, como ya
sabemos cada Libro de Excel está compuesto de Hojas y ahora veremos
varios ejemplos como agregar, borrar, imprimir, proteger hojas, etc.

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

Agregar hojas a un archivo de Excel


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

Parámetro Descripción
Un objeto de tipo Sheet, que indica que deseas agregar la
Before
nueva hoja, antes de esta hoja.
Un objeto de tipo Sheet, que indica que deseas agregar la
After
nueva hoja, después de esta hoja.
El número de hojas que deseas agregar, si omites este
Count
parámetro, se agrega una hoja.
Indica el tipo de hoja que deseas agregar, por ejemplo,
una hoja normal, un gráfico, etc. Para ver una lista
Type 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 referencia a una hoja en específico y ya
que necesitamos la última hoja, entonces podemos usar
ActiveWorkbook.Worksheets.Count para saber cuál es la última hoja.

Ahora, veamos un ejemplo más, imagina que además de definir una hoja,
necesitas realizar algún cambio sobre ella, como escribir algo sobre sus
celdas o cambiar su nombre. En ese caso necesitas capturar una referencia a
la nueva hoja y luego trabajar usando sus propiedades y métodos. Aquí hay
un ejemplo sencillo:
1 Sub AgregarHoja2()
2 'Definir una variable de tipo Worksheet
3 Dim hoja As Worksheet
4
5 'Capturar una referencia a la nueva hoja
6 Set hoja = ActiveWorkbook.Sheets.Add()
7
8 'Cambiar el nombre de la hoja
9 hoja.Name = "Hoja con nombre"
10 End Sub

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

Borrar una hoja de un archivo de Excel


Puedes eliminar cualquier hoja en un libro de Excel siempre y cuando el libro
no esté protegido contra cambios o se encuentre en modo de solo lectura,
tampoco puedes borrar una hoja si ya no hay otras hojas (No puedes dejar un
libro de Excel, sin ninguna hoja). Para borrar una hoja puedes usar el método
Delete del objeto Sheets.

Cada hoja puede ser referenciada por su nombre o por su número de índice
(un número desde 1 hasta la cantidad de hojas que existan), a continuación,
hay un ejemplo para borrar la hoja llamada “Hoja con nombre” del libro
activo.
1 Sub BorrarHoja()
2 ActiveWorkbook.Sheets("Hoja con nombre").Delete
3 End Sub

Mover una hoja de un archivo de Excel


Puedes cambiar de posición una hoja dentro de un libro, al utilizar el método
Move del objeto Sheets. Este método recibe 2 parámetros opcionales: Before
y After para indicar que lo quieres mover antes o después de alguna hoja en
específico, si omites ambos parámetros, entonces Excel creara un nuevo libro
y moverá la hoja a dicho libro.

Aquí hay un ejemplo para mover la hoja actual hasta la primera posición.
ActiveSheet hace referencia al objeto de la hoja activa, podemos usarla con
el método Move y para hacer referencia a la que ya es la primera hoja, vamos
a usar el índice 1 de la colección de objetos Sheets del libro activo.
1 Sub MoverHoja()
2 ActiveSheet.Move Before:=ActiveWorkbook.Sheets(1)
3 End Sub

Copiar y pegar hojas de Excel


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

Aquí hay un ejemplo para copiar una hoja y colocarla justo después de la
hoja que copiamos.
1 Sub CopiarHoja()
2 ActiveSheet.Copy After:=ActiveSheet
3 End Sub

Ocultar una hoja de Excel


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

Puedes ocultar la hoja activa con este código:


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

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

Mostrar hojas ocultas

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

Lista de hojas ocultas

Si no quieres que las personas puedan hacer visibles las hojas ocultas muy
fácilmente, puedes elegir la opción Muy Oculta, así, la única forma de hacer
visible la hoja, será haciendo uso de VBA o el editor de VBA.
Puedes hacer esto con una macro como esta y utilizando la constante
predefinida xlSheetVeryHidden.
1 Sub OcultarHoja2()
2 ActiveSheet.Visible = xlSheetVeryHidden
3 End Sub

Cambiar el nombre de una hoja de Excel


Puedes cambiar el nombre de una hoja de Excel, cambiando la propiedad
Name del objeto Sheets. Aquí hay un ejemplo, en el que abrimos una ventana
para solicitar un nombre, luego asignamos ese nombre a la hoja activa.
1 Sub NombreHoja()
2 Dim nombre As String
3
4 nombre = InputBox("Ingrese el nuevo nombre para esta hoja")
5 ActiveSheet.Name = nombre
6 End Sub

Proteger un archivo de Excel con contraseña


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

El método Protect tiene muchos parámetros y todos son opcionales. El


parámetro Password es la clave que deseas colocar y todos los demás
parámetros esperan un valor True para ser activados o un valor False para
ser desactivados, aquí hay una lista de cada uno de ellos:

Parámetro Descripción
Es la clave que deseas colocar para la hoja,
si la omites las personas podrán
desproteger la hoja sin escribir ninguna
Password
clave. Es importante saber que, si pierdes
esta clave, no hay forma de poder
recuperarla.
True para proteger las formas. El valor
DrawingObjects
predeterminado es True.
True para proteger el contenido. En un
gráfico, protege todo el gráfico. En una
Contents hoja de cálculo, protege las celdas
bloqueadas. El valor predeterminado es
True.
True para proteger los escenarios. Este
Scenarios argumento solo es válido para las hojas de
cálculo. El valor predeterminado es True.
True para proteger la interfaz de usuario,
pero no las macros. Si omite este
UserInterfaceOnly
argumento, la protección se aplica tanto a
las macros como a la interfaz de usuario.
True permite al usuario dar formato a
cualquier celda de una hoja de cálculo
AllowFormattingCells
protegida. El valor predeterminado es
False.
True permite al usuario dar formato a
cualquier columna de una hoja de cálculo
AllowFormattingColumns
protegida. El valor predeterminado es
False.
True permite al usuario dar formato a
cualquier fila de una hoja de cálculo
AllowFormattingRows
protegida. El valor predeterminado es
False.
True permite al usuario insertar columnas
AllowInsertingColumns en la hoja de cálculo protegida. El valor
predeterminado es False.
True permite al usuario insertar filas en la
AllowInsertingRows hoja de cálculo protegida. El valor
predeterminado es False.
True permite al usuario insertar
hipervínculos en la hoja de cálculo
AllowInsertingHyperlinks
protegida. El valor predeterminado es
False.
True permite al usuario eliminar columnas
en la hoja de cálculo protegida, donde todas
AllowDeletingColumns las celdas de la columna que se va a
eliminar se desbloquearán. El valor
predeterminado es False.
True permite al usuario eliminar filas en la
AllowDeletingRows hoja de cálculo protegida, donde todas las
celdas de la fila que se va a eliminar se
desbloquearán. El valor predeterminado es
False.
True permite al usuario ordenar la hoja de
cálculo protegida. Se deben desbloquear o
AllowSorting desproteger todas las celdas del rango de
ordenación. El valor predeterminado es
False.
True permite al usuario establecer filtros
en la hoja de cálculo protegida. Los
usuarios pueden cambiar los criterios del
AllowFiltering filtro, pero no puede habilitar o deshabilitar
un filtro automático. Los usuarios pueden
establecer filtros en un filtro automático
existente. El valor predeterminado es False.
True permite al usuario usar informes de
tabla dinámica en la hoja de cálculo
AllowUsingPivotTables
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:
1 Sub ProtegerHoja()
2 ActiveSheet.Protect Password:="123"
3 End Sub

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


error como este:

Error al escribir en celdas protegidas

También puedes eliminar la protección de la hoja usando el método


Unprotect, aquí hay una macro de ejemplo:
1 Sub DesprotegerHoja()
2 ActiveSheet.Unprotect Password:="123"
3 End Sub

Imprimir una hoja de Excel


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

Parámetro Descripción
Número de la página en la que comienza la
From impresión. Si no se especifica este argumento, la
impresión empieza por el principio.
Número de la última página que se va a imprimir.
To Si no se especifica este argumento, la impresión
finaliza en la última página.
Número de copias que se imprimirán. Si no se
Copies especifica este argumento, se imprime una sola
copia.
True para que Microsoft Excel invoque la vista
Preview preliminar antes de imprimir el objeto. False (u
omitido) para imprimir el objeto inmediatamente.
ActivePrinter Establece el nombre de la impresora activa.
True para imprimir a un archivo. Si no se
PrintToFile especifica PrToFileName , Excel solicita al usuario
que escriba el nombre del archivo de salida.
Collate True para intercalar varias copias.
Si PrintToFile se establece en true, este argumento
PrToFileName especifica el nombre del archivo en el que desea
imprimir.
True para omitir las áreas de impresión e imprimir
IgnorePrintAreas
todo el objeto.
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.
Trabajando con Rangos
Ahora vamos a trabajar con rangos, un rango es un conjunto de celdas que
bien pueden ser columnas, filas, cualquier grupo de celdas o incluso una sola
celda.

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

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

Selección de rango de celdas

Usar Range, también equivale a usar Application.Range o


ActiveSheet.Range , ya que asume que estás trabajando con la hoja activa.
Si deseas trabajar con otra hoja u otro libro entonces debes especificarlo, por
ejemplo, con un código como este:
1 Sub SeleccionarCelda2()
2 'Hacer visible la hoja2 antes de seleccionar sus celdas
3 ActiveWorkbook.Sheets("Hoja2").Select
4 ActiveWorkbook.Sheets("Hoja2").Range("A1:A3").Select
5 End Sub
En el código anterior, primero seleccionamos la Hoja2, con esto hacemos que
la Hoja2 se convierta en la hoja activa y este visible, si no hacemos esto,
entonces no podríamos seleccionar ninguna de sus celdas por que la macro
mostraría un error.

Al usar rangos, puedes consultar y modificar cualquier cosa que esté


relacionada a las celdas en el rango, como cambiar su formato o su contenido.
Por ejemplo, veamos esta macro que cambia el formato de un rango de celdas
a numérico con dos decimales separados por un punto:
1 Sub ModificarFormatoCelda()
2 'Formato de numero con dos decimales
3 Range("A1:A3").NumberFormat = "0.00"
4
5 End Sub

Recorrer todos los valores de un rango


Ya que un rango es un conjunto de celdas, podemos utilizar un ciclo for
each para poder recorrer cada una de ellas, esto es muy útil cuando
necesitamos realizar alguna operación sobre las celdas en un rango.

Existe un rango especial llamado Selection, el cual representa todas las


celdas que esta seleccionadas en Excel, por ejemplo, estas 8 celdas
seleccionadas, están contenidas en el objeto Selection

rango-inicial

Ahora veamos una macro que recorre todas las celdas seleccionadas y
muestra su contenido en un mensaje usando la función MsgBox
1 Sub RecorrerRango()
2 Dim celda As Range
3 For Each celda In Selection
4 MsgBox celda.FormulaR1C1
5 Next
6
7 End Sub

En el código anterior, primero declaramos una variable llamada celda, luego


en el ciclo for each pedimos que se recorra cada elemento del objeto
Selection y se coloque su contenido en la variable celda, luego usamos la
propiedad FormulaR1C1 de acceder al contenido de la celda.

Combinar múltiples rangos


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

La función Union recibe como parámetros 1 o hasta 30 rangos y los combina


en uno solo. Veamos este ejemplo, en donde se definen 3 rangos y luego se
unen en uno solo, para después cambiar su color de fondo a amarillo.
1 Sub UnirRangos()
2 Dim Rango1 As Range
3 Dim Rango2 As Range
4 Dim Rango3 As Range
5 Dim MisRangos As Range
6
7 Set Rango1 = Range("A:A") 'Seleccionar toda la columna A
8 Set Rango2 = Range("C:C")
9 Set Rango3 = Range("E:E")
10
11 'Unir los 3 rangos
12 Set MisRangos = Union(Rango1, Rango2, Rango3)
13
14 'Cambiar el color de fondo
15 MisRangos.Interior.Color = RGB(255, 255, 0)
16 End Sub

El resultado será algo como esto:


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.
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
Número de filas que debe desplazarse, un número
positivo indica que debe desplazarse hacia abajo, y un
RowOffset
número negativo indica que debe desplazarse hacia
arriba.
Número de columnas que debe desplazarse, un número
positivo indica que debe desplazarse hacia la derecha, y
ColumnOffset
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:
1 Sub EjemploOffsetRangos()
2 Dim rango As Range
3
4 Set rango = Range("A1:A3")
5
6 rango.Offset(0, 1).Select
7 End Sub

El rango completo se desplaza una columna a la derecha y el resultado es que


seleccionas las 3 primeras celdas de la columna B, en lugar de la columna A.
Resultado del código anterior

Borrar rangos
Los rangos poseen un método llamado Delete, puedes usarlo para borrar un
rango completo de celdas. De la misma forma en que sucede en Excel,
cuando borras una o más celdas, Excel reorganiza las demás celdas para
cubrir el espacio, por ejemplo, si borras la columna B, entonces mueve todas
las columnas a la izquierda, y los datos de la columna C, pasan a la columna
B.

Aprovechando el ejemplo anterior, voy a introducir un nuevo rango


predeterminado: Columns, con este objeto puedes hacer referencia a una
columna completa, por medio de su índice, por ejemplo, la columna B es la
segunda columna, entonces su índice es 2.

Con este código puedes borrar la columna B, pero antes de probarla,


asegúrate de agregar algunos datos en las columnas B y C, para que puedas
apreciar el resultado.
1 Sub BorrarRango()
2 Columns(2).Delete
3 End Sub

Ocultar rangos
Ahora veremos cómo ocultar rangos. Una tarea habitual en Excel es ocultar
filas o columnas que no usas o que tienen datos que no deseas que este
visibles porque no son importantes. Para ocultar o mostrar una fila, podemos
cambiar la propiedad Hidden a true para ocultar y a false para mostrar.

Ahora voy a introducir el objeto Rows, este objeto puede hacer referencia a
cualquier fila de la hoja de cálculo, por medio de su índice. Por ejemplo, el
siguiente código oculta la fila 2, si necesitas volver a hacerla visible, recuerda
que solo debes cambiar la propiedad Hidden de true a false.
1 Sub OcultarRango()
2 Rows(2).Hidden = True
3 End Sub

Rangos con nombres


Excel permite asignar nombres a celdas y rangos, los nombres son más
fáciles de recordar e interpretar que las direcciones como “A23”. Si no has
escuchado hablar sobre los nombres de rangos puedes leer este articulo breve:
https://excel.facilparami.com/2012/06/trabajar-con-nombres-de-celdas-y-o-
rangos/

En VBA puedes usar la propiedad Name de un rango para asignarle un


nombre, para explicar esto, vamos a crear dos macros: la primera va a asignar
un nombre a una celda, en esta celda se encuentra el porcentaje de impuestos
que debe pagar un producto. En la segunda macro vamos a completar una
celda con el valor del impuesto para un producto.

Macro para asignar el nombre a la celda B1, ésta contiene el porcentaje de


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

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


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

Modificar tamaño de rangos


Se puede modificar el tamaño en filas y columnas de un rango, usando su
método Resize, este método permite definir nuevamente la cantidad de filas
y columnas que abarca.

Por ejemplo, veamos este rango que inicia en la celda B1 y luego se extiende
4 filas hacia abajo y dos columnas a la derecha, hasta llegar a la celda C4.

Rango de 4 filas y 2 columnas

Entonces, si usamos el método Resize, indicando 10 filas y 2 columnas de


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

Rango final, luego de aplicar Resize

El código de ejemplo es este:


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

Como puedes ver, simplemente hemos definido nuevamente los límites del
rango, pero también puedes lograr un código más genérico, como por
ejemplo incrementar el rango en una fila más o una columna más. Para esto
podemos usar las propiedades Rows.Count y Rows.Count del rango para
conocer cuantas filas y columnas utiliza el rango y luego definir un
incremento basado en esos números, por ejemplo, para incrementar el rango
en 1 fila, podes usar este código:
1 Sub IncremetarFilaRango()
2 Dim rango As Range
3
4 Set rango = Range("B1:C4")
5
6 Set rango = rango.Resize(rango.Rows.Count + 1, rango.Columns.Count)
7
8 rango.Select
9
10 End Sub

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

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

También podría gustarte