Macros de Excel: Para personas ocupadas Aprende en poco tiempo a crear macros que hagan el trabajo duro por ti. Luis Alberto Cruz Orellana Este libro está a la venta en http://leanpub.com/libro-macros-excel Esta versión se publicó en 2019-11-21 Este es un libro de Leanpub. Leanpub anima a los autores y publicadoras con el proceso de publicación. Lean Publishing es el acto de publicar un libro en progreso usando herramientas sencillas y muchas iteraciones para obtener feedback del lector hasta conseguir tener el libro adecuado. © 2019 Luis Alberto Cruz Orellana Este libro esta dedicado a Dios, a mi esposa Patty y mis hijos Luis y Gabriela. Ellos son la razón por la que me esfuerzo cada dia en ser mejor. ÍNDICE GENERAL Índice general Tus primeras macros . . . . . . . . . . . . . . . . . . . Que es una macro . . . . . . . . . . . . . . . . . . Como pueden ayudarte las macros en tu trabajo Como se usan las macros . . . . . . . . . . . . . . Tu primer macro . . . . . . . . . . . . . . . . . . . Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducción a VBA . . . . . . . . . Qué es VBA . . . . . . . . . . . . Editor de VBA . . . . . . . . . . . Editar una grabación de macros Comentarios en el código . . . . Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 1 5 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 . 9 . 9 . 11 . 12 . 14 Introducción a la programación . . . . . . Tu primer macro usando VBA . . . . . Funciones o subrutinas . . . . . . . . . Variables, constantes y tipos de datos . Que son los arreglos . . . . . . . . . . . Decisiones y operadores lógicos . . . . Operaciones con variables . . . . . . . Qué son los ciclos . . . . . . . . . . . . . Ejercicio . . . . . . . . . . . . . . . . . . Interactuando con Excel . . . . . . . . . ¿Que son los objetos y clases? . . . . . Objetos de Excel . . . . . . . . . . . . . Eventos de Excel . . . . . . . . . . . . . Ejemplo practico . . . . . . . . . . . . . Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 17 18 22 25 29 30 33 33 33 34 36 39 42 Extendiendo Excel . . . . . . . . . . . . . . Crea tus propias funciones . . . . . . . Agrega documentación a tus fórmulas Parámetros opcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 43 45 47 https://excel.facilparami.com ÍNDICE GENERAL Instalar y desinstalar complementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Crea tus propios complementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Corrigiendo Errores . . . . . . . . . . . . . . . . Que tipos de errores podemos esperar . . . Como depurar código en el editor de VBA. Control de errores en tiempo de ejecución . Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 53 56 64 68 Mensajes y cuadros de diálogo . . . . . . . . . . . . Mostrar mensajes en la barra de estado de Excel Mostrar mensajes usado MsgBox . . . . . . . . . Ventana de diálogo para trabajar con archivos . Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 69 70 72 74 Crear formularios avanzados . . . . . . . . . . . . Introducción a userforms . . . . . . . . . . . . . Tu primer formulario . . . . . . . . . . . . . . . Como utilizar botones de comando . . . . . . . Como utilizar etiquetas . . . . . . . . . . . . . . Como utilizar cuadros de texto . . . . . . . . . Como utilizar botones de radio . . . . . . . . . Como utilizar casillas de selección o checkbox Como utilizar listas de selección . . . . . . . . . Trabajando con eventos . . . . . . . . . . . . . . Algunas macros para nuestro formulario . . . Como leer la información de un formulario . . Como agregar validaciones a tu formulario . . Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 75 76 79 83 85 87 89 90 91 93 95 96 98 Uso de Workbooks . . . . . . . . . . . . . . . . . . . . . Crear un nuevo archivo de Excel . . . . . . . . . . Abrir un archivo de Excel . . . . . . . . . . . . . . . Abrir un archivo de Excel indicado por el usuario Verificar si un archivo está abierto . . . . . . . . . Cerrar un archivo de Excel . . . . . . . . . . . . . . Borrar un archivo . . . . . . . . . . . . . . . . . . . . Guardar un archivo de Excel . . . . . . . . . . . . . Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 99 100 101 102 104 105 106 107 Uso de WorkSheets . . . . . . . . . . . . . . . Agregar hojas a un archivo de Excel . . Borrar una hoja de un archivo de Excel Mover una hoja de un archivo de Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 108 109 109 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . https://excel.facilparami.com ÍNDICE GENERAL Copiar y pegar hojas de Excel . . . . . . . . . Ocultar una hoja de Excel . . . . . . . . . . . . Cambiar el nombre de una hoja de Excel . . Proteger un archivo de Excel con contraseña Imprimir una hoja de Excel . . . . . . . . . . . Ejercicio . . . . . . . . . . . . . . . . . . . . . . Trabajando con Rangos . . . . . . . . . . . Usando Rangos . . . . . . . . . . . . . . Recorrer todos los valores de un rango Combinar múltiples rangos . . . . . . . Uso de Offset . . . . . . . . . . . . . . . Borrar rangos . . . . . . . . . . . . . . . Ocultar rangos . . . . . . . . . . . . . . Rangos con nombres . . . . . . . . . . . Modificar tamaño de rangos . . . . . . Ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 110 112 112 114 115 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 116 117 118 121 123 124 124 125 128 https://excel.facilparami.com Tus primeras macros En este capítulo voy a introducirte al mundo de las macros, aprenderás que es una macro, por que necesitas usarlas, como puedes usarlas y como crear macros sencillas. Que es una macro Una macro es una secuencia de comandos o pasos para realizar una tarea. En nuestro caso una macro de Excel no es más que una serie de acciones que puedes realizar en Excel. Por ejemplo, si te envían una hoja de cálculo y te piden preparar un reporte con esos datos, entonces tú sigues una serie de paso o acciones en Excel para preparar ese reporte. Si los pasos que sigues son siempre los mismos o muy similares, entonces puedes crear una macro de Excel para que haga ese trabajo por ti. Como pueden ayudarte las macros en tu trabajo La mayor limitante de todos nosotros es nuestro tiempo, ese es tu recurso más valioso. Puedes usar tu tiempo para ver una película, leer un libro, pasar tiempo con tus seres queridos, trabajando o en lo que tú desees. Por su puesto, todos necesitamos y debemos trabajar para poder sobrevivir, pero con la ayuda de las computadoras y las macros de Excel, puedes hacer que la computadora haga gran parte del trabajo en tu lugar, y así poder ganar un poco de tiempo extra para hacer algo que te guste más. Por otra parte, también puede ayudarte a ser mucho más productivo en tu trabajo y sobresalir de entre todos tus compañeros. Como se usan las macros Ahora vas a comenzar a trabajar con macros, para el resto del capítulo vamos a tomar un caso hipotético: Imagina que tienes una hoja de Excel que frecuentemente debes compartir con otras personas, no te afecta que las personas vean los datos, pero no quieres que conozcan las fórmulas que usas para calcularlas (es algo secreto, como la fórmula de la Coca-Cola o algo así). Entonces cada vez que debes enviar la hoja de cálculo a alguien, pasas todas las fórmulas a valores absolutos. Pero para ahorrarte ese trabajo, has creado una macro. 2 Tus primeras macros Como aún no hemos visto como crear macros, puedes descargar la macro de la que hablo haciendo clic aquí¹ Ahora vamos a activar un menú secreto de Excel, primero haces clic en el menú Archivo Menú Archivo Luego seleccionas Opciones ¹https://my.pcloud.com/publink/show?code=XZN9jd7Z1hwPMri9O681FVEH44EWBjO6qVAV https://excel.facilparami.com 3 Tus primeras macros Opciones Y seleccionas Personalizar cinta de opciones y marcas la casilla de selección que dice Programador, finalmente haces clic en Aceptar y listo, ya has activado el menú secreto. https://excel.facilparami.com 4 Tus primeras macros Activar menú programador Abre el archivo que descargaste y verás que en la celda C6 hay una formula (es una formula muy sencilla, pero esto no es importante por ahora) Si vas al nuevo menú Programador, luego presionas el botón que dice Macros veras que se abre una ventana, selecciona la primera macro en la lista y presiona el botón Ejecutar, esto hará que todas las fórmulas en esta hoja sean reemplazadas por su valor en texto, eliminado su fórmula, pero no su resultado https://excel.facilparami.com 5 Tus primeras macros Ejecutar una macro Existen otras formas para ejecutar una macro, pero por el momento vamos a utilizar esta. Tu primer macro Ahora que ya ejecutaste tu primera macro es hora de que crees tú primer macro. Crea un archivo nuevo de Excel y en el menú Programador presiona el botón Grabar macro Luego veras una ventana en la que tienes que colocar un nombre para la macro, una descripción y presionar el botón Aceptar Los nombres de macros no pueden llevar espacios en blanco, pero puedes usar guiones para separar palabras. Tampoco puedes usar caracteres especiales. https://excel.facilparami.com 6 Tus primeras macros Grabar macros Ahora Excel va a grabar todo lo que hagas, por ejemplo, selecciona primera fila de la hoja de cálculo y coloca un color de fondo, puedes hacer cualquier cosa que desees. Cuando termines presiona el botón Detener grabación Detener grabación Ya está, has creado tu primer macro. Puedes ejecutarla como lo hiciste con la macro que descargaste, https://excel.facilparami.com 7 Tus primeras macros pero para poder ver que repite todo, puedes seleccionar una hoja nueva. Si intentas grabar este archivo, vas a recibir una advertencia, y es que las hojas de cálculo “normales” no pueden contener macros. Para poder grabar y conservar tu macro debes de elegir el formato de archivo Libro de Excel habilitado para macros Archivo con macros Hasta ahora las macros que crees, son parte del archivo en que estas trabajando, si el archivo no está abierto, la macro no está disponible. En otros capítulos vamos a aprender a hacer que tu macro este siempre disponible Ejercicio Ahora viene la parte práctica, imagina algo que has estado haciendo en Excel, y que repites una y otra vez. Intenta crear una macro que automatice el trabajo y lo haga por ti. https://excel.facilparami.com 8 Tus primeras macros Tiene que ser algún muy sencillo como dar formato a algo, cambiar algún nombre, borrar columnas que no usas o algo así, recuerda que estas comenzando, luego podrás hacer cosas más difíciles. https://excel.facilparami.com Introducción a VBA En este capítulo aprenderás qué es VBA, cómo usar el editor de VBA para crear macros usando código de programación y a editar macros grabadas con la grabadora de macros. Qué es VBA VBA significa Visual Basic for Applications, este es un lenguaje de programación hecho por Microsoft para automatizar cualquier cosa en su suite de oficina Office. Está basado en Visual Basic, por lo que sus comandos son prácticamente los mismos. Cada opción, cada botón que presionas, cada cosa que haces en Excel Puede ser realizada mediante código de VBA, de hecho, cuando grabas una macro usando la grabadora, cada acción que haces se guarda como código de VBA. Pero la grabadora de macros tiene sus limitaciones Cuando escribes código de VBA, no existen los límites. Si puedes hacer algo en Excel, también puedes hacerlo usando VBA. Este es un ejemplo de código de VBA: 1 2 3 4 5 6 7 8 9 10 Sub formula_a_valor() ' Convierte todas las formulas a valores absolutos ' Cells.Select Selection.Copy Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A1").Select End Sub Lo sé, se ve bastante confuso ahora, pero no te preocupes, aun si nunca has programado. Este libro está diseñado no solo para enseñarte a utilizar VBA, sino también para enseñarte a programar. Editor de VBA Para ingresar al editor de VBA, abre alguna hoja de Excel y presiona las teclas ALT+F11, al hacer esto verás una ventana como esta: 10 Introducción a VBA Editor de VBA Esta está dividida en varias secciones, no te preocupes si no puedes verlas todas en este momento, esto se debe a que tu hoja de Excel aún no tiene macros. En la parte superior izquierda verás el explorador de proyectos, cada libro de Excel o archivo se trata como un proyecto, el código de VBA ira dentro de una carpeta llamada Módulos, dentro de esta carpeta existirá uno o más archivos que a su vez contiene código de programación (macros). En la parte derecha hay una ventana, ahí es en donde se puede visualizar el código de las macros. Ver el código de programación Existen varios menús y herramientas, pero los iremos viendo en detalle poco a poco para no saturarte https://excel.facilparami.com 11 Introducción a VBA con información. Editar una grabación de macros Ahora vamos a practicar con algo sencillo, ya sabes crear macros usando la grabadora, entonces crea una macro sencilla, por ejemplo, una macro en la que cree o modifique los encabezados de una hoja de cálculo colocando en la celda A1 la palabra Nombre y en la celda B1 Apellidos. Luego de grabar la macro, abres el editor de VBA (presionando las teclas Alt+F11) y posiblemente veas algo como esto: Macro a editar Ahora imagina que tu necesidad ha cambiado y en la columna C1 necesitas que diga Teléfono, entonces en lugar de grabar otra macro, solo la abres en el editor y debes hacer dos cosas • Seleccionara la celda C1 • Escribir el texto Teléfono El código para eso sería: 1 2 Range("C1").Select ActiveCell.FormulaR1C1 = "Teléfono" Si lo agregas a la macro, ésta deberá verse así: https://excel.facilparami.com 12 Introducción a VBA 1 2 3 4 Sub encabezados() ' ' encabezados Macro ' 5 6 7 8 9 10 11 12 ' Range("A1").Select ActiveCell.FormulaR1C1 = "Nombre" Range("B1").Select ActiveCell.FormulaR1C1 = "Apellidos" Range("C1").Select ActiveCell.FormulaR1C1 = "Teléfono" 13 14 End Sub Ahora solo debes de probar la macro y tendrás que ver que automáticamente rellena las celdas A1, B1 y C1 con los textos que has programado en tu macro. Ya has modificado tu primera macro escribiendo código. Sé que este ejemplo es muy sencillo y posiblemente te preguntas cómo sería hacer algo más complicado. No te preocupes, a medida que avances en esta lectura, iras aprendiendo más trucos y los ejemplos y ejercicios se irán complicando cada vez más, hasta que te conviertas en un experto. Comentarios en el código Si has puesto atención, cuando observas el código que genera la grabadora de macros de Excel, genera algunos textos, que no son comandos en las macros, estos se llama comentarios y ayudan a que el código sea más fácil de leer y entender por nosotros los humanos. Los comentarios son parte fundamental de todo programa, pero muchos programadores no los usan porque creen que les hace perder el tiempo. Pero en realidad es todo lo contrario, los comentarios pueden ayudarte a no perder tu tiempo. Voy a explicarte por qué debes utilizar siempre comentarios en todos los programas que escribas. Nuestra memoria no siempre es confiable y cuando escribimos código, todo está claro en nuestra mente, pero rara vez escribimos un programa y no volvemos a verlo o modificarlo nunca. Un programa debe revisarse y corregirse a lo largo de toda su vida útil. Entonces ¿qué pasa si debes agregar alguna funcionalidad a una macro 6 meses después de haberla creado?, lo más probable es que no recuerdes cómo funciona alguna fórmula que usaste, de donde tomas algún valor o por qué haces algo de una forma, en lugar de otra. Todos estos problemas (y otros más) se resuelven al leer los comentarios que has escrito en el código. Ahora que ya sabes por qué debes usar los comentarios, veamos cómo puedes usarlos. https://excel.facilparami.com 13 Introducción a VBA Si escribes una comilla simple ', eso indica que toda la línea es un comentario y será ignorada como código. Y ya que los comentarios no se ejecutan, entonces otro uso que se le da a los comentarios es el de deshabilitar temporalmente un bloque de código. Pero si deseas convertir en comentario un bloque grande de código, no es práctico hacerlo línea por línea, entonces debes activar una barra de herramientas de Excel que te ayude en este proceso. Haz clic derecho sobre la barra de herramientas actual y selecciona la opción Edición como se muestra en esta imagen: Activar barra de herramientas Edición Ahora para comentar un bloque, solo marcas el texto y presionas uno de los botones en la barra de herramientas para comentar o descomentar el bloque. Intenta hacerlo tú mismo. https://excel.facilparami.com 14 Introducción a VBA Comentar bloque Ejercicio Tan solo hemos iniciado a conocer VBA, entonces el ejercicio de este capítulo es sencillo, debes grabar una macro (usando la grabadora), haz algo sencillo, por ejemplo una macro que escriba “Hola mundo” en la celda en donde te encuentres, luego entra al editor de VBA y explora la macro, revisa el código que se generó e intenta modificar “Hola mundo” por cualquier otro texto, luego corre la macro y comprueba que lo hiciste bien. https://excel.facilparami.com Introducción a la programación Como has visto hasta ahora, puedes crear macros sin necesidad de programar, todo se ha hecho usando la grabadora de macros. Pero para sacar el máximo provecho de las macros de Excel, necesitas crear macros usando código de VBA. Por eso ahora vas a crear tu primer macro desde cero y usando solo código de programación. Pero no te preocupes si nunca has programado, porque este capítulo cubre todos los conceptos básicos de programación. Tu primer macro usando VBA Ahora imagina que trabajas en una empresa en donde te dan una hoja de Excel con una lista de productos y sus costos, tu trabajo es calcular los precios. Como política de la empresa, los precios se calculan como el costo más un 30% extra. Entonces básicamente lo que debes hacer es crear una nueva columna y calcular el precio como el costo más 30%. Crea una hoja de Excel que se vea como esta: Lista de productos Ahora presiona las teclas Alt+F11 para abrir el editor de VBA y haz clic derecho sobre el proyecto VBAProject con el nombre de tu hoja de cálculo y selecciona la opción de menú Insertar > Módulo 16 Introducción a la programación Insertar modulo Ahora vas a crear una subrutina, todas las macros que creas en la grabadora son subrutinas. Para crearla solo debes escribir algo como esto: 1 Sub calcula_precios() 2 3 End Sub En donde Sub y End Sub marcan el inicio y el fin de la subrutina, la palabra calcula_precios es el nombre de tu macro y siempre va seguido de paréntesis. Dentro de los paréntesis pueden ir algunos parámetros, pero vamos a dejarlo de esta forma por ahora. Acabas de crear una macro vacía, para que funcione necesita algo de código (instrucciones de lo que debe hacer), ahora puedes modificarla de forma que te quede así: https://excel.facilparami.com 17 Introducción a la programación 1 Sub calcula_precios() 2 3 4 Dim costo Dim fila As Integer 5 6 7 'Coloca encabcezado Range("D1").FormulaR1C1 = "Precio" 8 9 10 11 12 13 14 'Recorrer todas las filas fila = 2 costo = Range("C" & fila).FormulaR1C1 Do While IsNumeric(costo) 'Procesar mientras el costo sea un numero 'Calcular el precio Range("D" & fila).FormulaR1C1 = costo * 1.3 15 16 17 18 19 'Pasar a las siguiente fila y leer el costo fila = fila + 1 costo = Range("C" & fila).FormulaR1C1 Loop 20 21 End Sub Hay mucho código nuevo aquí, no te preocupes por ahora, voy a ir explicando algunos conceptos que necesitas para comprender todo. Por el momento puedes descargar la hoja de cálculo y hacer unas pruebas ejecutando la macro. Puedes descargar la hoja de Excel junto con su macro haciendo clic aquí². Funciones o subrutinas En VBA usualmente ingresas el código en una función o en una subrutina, ambos términos se refieren a fragmentos de códigos que realizan una tarea específica y puede ser llamados las veces que necesites. Realmente no hay una limitante sobre la cantidad de tareas que pueda realizar una subrutina o una función, esto es simplemente una buena práctica, ya que de esta forma puedes reutilizar el código fácilmente, es menos propenso a errores y es más fácil de modificar o mejorar. Ahora, la diferencia entre una función y una subrutina es que la función puede regresar un valor, por ejemplo, puedes crear una función que reciba como parámetro un código de cliente y regrese el nombre del cliente. En cambio, las subrutinas no pueden regresar ningún valor. El ejemplo más común de funciones son las funciones que vienen en Excel, por ejemplo, la función SUMA que recibe un rango de celdas y regresa la suma de todos sus valores. Un ejemplo de una ²https://my.pcloud.com/publink/show?code=XZLyWE7ZsQiRtGafe8Y3Wp5zRw9FpVB9DgoX https://excel.facilparami.com 18 Introducción a la programación subrutina es una macro que genera un reporte de Excel, esta subrutina no regresa ningún valor, pero si puede realizar cambios en una hoja de Excel. Las funciones también pueden hacer cambios en una hoja de Excel, pero su uso habitual es devolver un valor. Otra diferencia importante es que solo puedes llamar macros desde una hoja de Excel a aquellas que has creado como subrutinas que no lleven ningún parámetro. Puedes hacer la prueba con la subrutina que acabas de crear. Insertar modulo Variables, constantes y tipos de datos Las variables son zonas de memoria en tu computadora, a las que puedes acceder para guardar o consultar información. Para poder decirle a la computadora a que parte de la memoria te refieres, usas un nombre para tu variable. https://excel.facilparami.com 19 Introducción a la programación Los nombres de variables no pueden llevar espacios y solo deben contener letras o números, pero puedes usar algunos caracteres como el guion bajo para separar palabras. También hay algunos nombres que no puedes usar, estos nombres se conocen como palabras reservadas. Algunas de estas palabras que no puedes usar son: Function, Sub, Dim, etc. Para una lista completa puedes consultar este artículo que detalla todas las palabras reservadas³. Ahora, para declarar una variable utilizas la palabra Dim seguida del nombre de tu variable y opcionalmente la palabra as seguida del tipo de datos, por ejemplo, para declarar una variable llamada fila y de tipo numérico usamos un código como este: 1 Dim fila As Integer Si has intentado aprender VBA por tu cuenta, quizá sepas que no es necesario declarar una variable para poder usarla, pero si es una buena práctica hacerlo. Te recomiendo que siempre las declares, si no lo haces podrías crear errores lógicos, los cuales son muy difíciles de corregir. Por ejemplo, imagina que usas una variable llamada impuestos, luego haces algunos cálculos y tratas de consultar su valor, pero te equivocas y escribes impuesto, es decir, olvidas colocar la letra s al final. Lo que pasará es que no obtienes ningún error, pero leerás el contenido de una variable sin declarar y sin el valor que esperas. Para evitar este tipo de error puedes forzar a VBA a que siempre te pida declarar las variables, para esto seleccionas el menú Herramientas > Opciones y en la pantalla que se muestre debes marcar la opción Requerir declaración de variables. Solicitar declaración de variables ³https://excel.facilparami.com/2019/04/palabras-reservadas-en-vba https://excel.facilparami.com 20 Introducción a la programación Ahora te verás obligado a declarar siempre cada variable que utilices, pero a cambio ahorrarás mucho tiempo tratando de encontrar errores lógicos. Para declarar una variable puedes usar cualquiera de estos tipos de datos: Tipo de datos Boolean Integer Long Single Double Double Date String Object Variant Currency Rango de valores True o False (Verdadero o Falso) números del –32,768 al 32,767 números del –2,147,483,648 al 2,147,483,647 números del –3.402823E38 al 1.401298E45 números del –1.79769313486232E308 al –4.94065645841247E-324 números del 4.94065645841247E–324 al 1.79769313486232E308 Fechas del 1/1/100 al 31/12/9999 Cualquier texto Cualquier objeto Cualquier valor de cualquier tipo –922,337,203,685,477.5808 a 922,337,203,685,477.5807 Nota: El tipo Double está dos veces, por que posee dos rangos, uno para valores negativos y otro para valores positivos. Ya sabes cómo declarar una variable, ahora, para asignarle un valor solo escribes el nombre de la variable y escribes un signo = y el valor que deseas asignar, por ejemplo: 1 2 Dim fila as Integer Dim texto as String 3 4 5 fila = 1 texto = "Hola mundo" Como puedes notar los valores numéricos se colocan tal y como los ves, pero los valores de texto se escriben entre comillas dobles. Ahora que tienes valores definidos en tus variables, puedes utilizarlos en tu macro, veamos un ejemplo sencillo del uso de variables, donde tendremos una macro que actualiza el contenido de una celda. 1 2 Sub variables() Dim texto As String 3 4 texto = "Hola mundo" 5 6 7 'Accedemos y cambiamos el contenido de la celda activa ActiveCell.FormulaR1C1 = texto 8 9 End Sub https://excel.facilparami.com 21 Introducción a la programación Intenta crear y ejecutar la macro anterior en una hoja de Excel, y verás que una vez que hayas asignado un valor a la variable texto, podrás usarla y la macro entenderá que debe usar el valor asignado en la variable. Modifica el valor de la variable texto y revisa lo que pasa cuando la ejecutas de nuevo. Una vez que crees la subrutina anterior puedes ejecutarla posicionando el cursor sobre cualquier parte de su código y luego presionando la tecla F5 o presionando el botón Ejecutar. Ejecutar una macro desde el editor de VBA Nota: Con ActiveCell.FormulaR1C1 puedes acceder al valor de la celda actual, esto es algo muy útil en muchas macros y a lo largo de este libro vas a aprender muchas otras cosas que te serán de utilidad al crear macros. El contenido de una variable puede ser modificado en cualquier momento, esta es la única diferencia entre una variable y las constantes. Para declarar una constante utilizas la palabra Const seguida del nombre de la constante, el tipo de datos y su valor. Aquí hay un ejemplo en que se define una constante llamada FactorIVA de tipo single y con valor 0.13 Const FactorIVA As Single = 0.13 Quizá te preguntes por que declarar la constante anterior, si puedes usar su valor 0.13 y sabes que no va a cambiar, bueno hay dos razones muy importantes por las que debes usar constantes en lugar de los valores: Para el caso anterior 0.13 es el factor para el IVA (un impuesto) y cuando estas leyendo el código de tu macro es más fácil de entender cuando usas constantes mira estos dos ejemplos idénticos y piensa cual es más legible: https://excel.facilparami.com 22 Introducción a la programación 1 impuesto = precio * 0.13 2 3 impuesto = precio * FactorIVA La segunda razón es porque, si bien es cierto que el valor de la constante no va a cambiar durante toda la ejecución de tu macro, si puede darse el caso en que debes actualizar su valor, por ejemplo, ahora el valor del impuesto (IVA) es del 13%, pero que pasaría si el gobierno decide subirlo a 15%, en ese caso tendrías que leer todo tu código y evaluar si ese 0.13 se refiere al impuesto y si es así, entonces cambiarlo en todas las líneas de código en los que lo has usado, pero si decidiste utilizar una constante, solo debes modificar su valor y ya tienes todo arreglado. Posiblemente también te preguntas, ¿por qué necesito la constante, si puedo hacer todo lo anterior usando una variable?, la respuesta es sencilla, las constantes existen para evitar que por error modifiques su valor en algún momento del programa. Como vimos puedes asignar un valor a una constate en tu código, pero si intentas asignar un valor a una constante ya definida, veras un error de compilación al intentar ejecutar tu macro. Error al modificar una constante Compilación es un proceso en el cual el código que escribes se traduce a código que la computadora pueda entender y ejecutar. Que son los arreglos Un arreglo o array es un tipo especial de variable, que puede contener múltiples valores. Puedes acceder a todo el conjunto de valores o a un valor individual al especificar su índice, también puedes agregar o eliminar más valores al arreglo. Puedes ver los arreglos como una lista de cosas, por ejemplo, una lista del supermercado, en la que puedes agregar más cosas que deseas o borrar algo que ya no quieres, también puedes leer la lista de forma secuencial, es decir, del primer ítem, hasta el último, o puedes consultar: “Cual es el primer producto en mi lista” y leer solo ese, por que has dado su índice (el primero en la lista). https://excel.facilparami.com 23 Introducción a la programación Como declarar un arreglo A diferencia de una variable normal, los arreglos siempre deben de ser declarados, otra regla que debes de seguir es que debes declarar la cantidad de elementos que piensas almacenar. Para tener todo más claro veamos un ejemplo de cómo declarar un arreglo con 25 ítems. 1 Dim ListaSupermercado(1 To 25) As String Como vemos, el tamaño se declara 1 to 25 entre paréntesis, con eso indicamos que el índice va desde 1 hasta 25. Trabajar con los valores del arreglo Ahora para asignar un valor a un arreglo, debemos hacer referencia a él, por su índice y luego asignar su valor como se hace con cualquier otra variable. 1 2 3 Dim ListaSupermercado(1 To 25) As String 'Asignar un valor al indice #1 ListaSupermercado(1) = "Pollo" Si declaraste un arreglo de 25 posiciones y tratas de utilizar un índice que no existe, por ejemplo, el 26, obtendrás un error como este: Error en índice del arreglo Si no conoces la cantidad de posiciones que vas a necesitar, puedes declarar un arreglo dinámico sin detallar la cantidad de posiciones y luego redimensionarlo con la sentencia ReDim, aquí hay un ejemplo: https://excel.facilparami.com 24 Introducción a la programación 1 Sub Arreglos() 2 3 4 'Arreglo dinamico, no detallamos la cantidad de posiciones Dim ListaSupermercado() As String 5 6 7 'Asignamos una cantidad inicial ReDim ListaSupermercado(1 To 1) 8 9 ListaSupermercado(1) = "Pollo" 10 11 12 13 14 15 'Ahora lo cambiamos a 2 posiciones, pero usamos 'la palabra Preserve para no perder los datos 'que ya teniamos ReDim Preserve ListaSupermercado(1 To 2) ListaSupermercado(2) = "Queso" 16 17 MsgBox ListaSupermercado(1) & " y " & ListaSupermercado(2) 18 19 End Sub Ahora puedes cambiar en cualquier momento la cantidad de elementos, pero ahora es más difícil saber si estás haciendo referencia a un elemento que no existe, pero esto se puede solucionar con las funciones LBound y UBound, las cuales regresan el índice inferior y superior, respectivamente. Veamos de nuevo unos ejemplos: 1 Sub Arreglos() 2 3 4 5 'Arreglo dinamico, no detallamos la cantidad de posiciones Dim ListaSupermercado() As String Dim indice As Integer 6 7 8 'Asignamos una cantidad inicial ReDim ListaSupermercado(1 To 2) 9 10 11 ListaSupermercado(1) = "Pollo" ListaSupermercado(2) = "Queso" 12 13 14 15 16 'Obtener el indice inferior y superior para recorrer el arreglo For indice = LBound(ListaSupermercado) To UBound(ListaSupermercado) MsgBox ListaSupermercado(indice) Next indice 17 18 End Sub https://excel.facilparami.com 25 Introducción a la programación También puedes usar estas funciones para obtener el primer y el último elemento de un arreglo o para validar si el arreglo tiene un índice, antes de intentar leerlo. Decisiones y operadores lógicos Los programas deben de tomar decisiones y ejecutar un bloque de código u otro dependiendo de la información que estén procesando. Las personas hacemos eso todo el tiempo, por ejemplo, si vas a tomar un café, lo pruebas y tomas una decisión, si está muy caliente, esperas a que se enfríe, si no entonces sigues tomando. La forma de tomar decisiones es con bloques if, la estructura más general es la siguiente: 1 2 3 4 5 If evaluación Then 'Bloque de codigo si la condicion es cierta Else 'Bloque de codigo si la condicion es falsa End If La evaluación debe ser una expresión que regrese falso o verdadero, la palabra else separa los bloques de código que se ejecuta cuando la evaluación es verdadera o falsa y las palabras End If marcan el fin de la decisión. Esto se verá mejor con un ejemplo, abre un archivo de Excel para crear y ejecutar esta macro: 1 Sub decisiones() 2 3 Dim edad As Integer 4 5 6 7 8 9 10 edad = 15 If edad >= 18 Then MsgBox "Ya eres mayor de Edad" Else MsgBox "Eres menor de edad" End If 11 12 End Sub En la macro anterior la decisión consiste en evaluar si la edad es mayor o igual a 18, luego usamos la función MsgBox de VBA para mostrar un mensaje en la pantalla. Intenta cambiar el valor de la variable edad para ver cómo se comporta. En el código anterior usamos el signo >=, esta es una comparación entre dos valores. Las comparaciones que puedes hacer son: https://excel.facilparami.com 26 Introducción a la programación Operador = <> > < >= <= Resultado Verdadero, si ambos valores son iguales, sino regresa Falso Verdadero, si ambos valores son diferentes, sino regresa Falso Verdadero, si el primer valor es mayor que el segundo, sino regresa Falso Verdadero, si el primer valor es menor que el segundo, sino regresa Falso Verdadero, si el primer valor es mayor o igual que el segundo, sino regresa Falso Verdadero, si el primer valor es menor o igual que el segundo, sino regresa Falso Tanto en la vida como en las macros, las decisiones no siempre son sencillas, puedes necesitar hacer más de una evaluación y para esto necesitas operadores lógicos para unir todas las evaluaciones que necesites. Por ejemplo, si vas a aplicar un descuento especial y necesitas que la cantidad que compren sea mayor a 10 unidades y que además el cliente sea de categoría “vip” entonces necesitas un operador lógico para unir ambas condiciones. Veamos un ejemplo: 1 2 3 4 Sub OperadoresLogicos() Dim categoria As String Dim cantidad As Single Dim precio As Currency 5 6 7 8 cantidad = 10 categoria = "vip" precio = 100 9 10 11 12 13 14 15 16 'Evaluar descuento If cantidad >= 10 And categoria = "vip" Then 'Aplicar 30% de descuento precio = precio * 0.7 MsgBox "El nuevo precio es " & precio End If End Sub Si buscas la sentencia (bloque de código) if veras que hay dos comparaciones unidas por una palabra And, esta es un operador lógico. Intenta cambiar los valores de las variables cantidad y categoria para ver si aplica el descuento. En total existen 3 operadores lógicos los cuales son: And, Or y Not. El operador And trabaja sobre dos expresiones a su izquierda y derecha y si ambas expresiones son verdaderas entonces regresa verdadero, pero si cualquiera de las dos es falso, entonces regresa falso. El operador Or también trabaja sobre dos expresiones a su izquierda y derecha y si cualquiera de las expresiones es verdadero entonces regresa verdadero y regresa falso únicamente si ambas expresiones son falsas. https://excel.facilparami.com 27 Introducción a la programación El operador Not trabaja solamente sobre la expresión a su derecha, lo que hace es invertirla o negarla, por ejemplo, si la expresión es falsa, entonces regresa verdadero y si la expresión es verdadera entonces regresa falso. Veamos una tabla con algunos ejemplos: Expresión 1 = 1 And 1=2 1 = 1 And 2=2 1 = 1 Or 1 = 2 1 = 2 Or 2 = 2 1 = 2 Or 2 = 1 Not 1 = 1 Not 1 = 2 Resultado Falso (el primero bloque es cierto, pero el segundo es falso entonces todo es falso) Verdadero (ambas expresiones son verdaderas) Verdadero (la primera expresión es verdadera, entonces no importa el resultado de la segunda) Verdadero (la segunda expresión es verdadera, entonces no importa el resultado de la primera) Falso (Ambas expresiones son falsas) Falso (La expresión es verdadera, pero esta negada) Verdadero (La expresión es falsa, pero esta negada) Cuando usamos una expresión if, la parte del else es opcional y también debes de saber que puedes anidar sentencias if, para comprender mejor esto, veamos un ejemplo: 1 2 3 4 Sub OperadoresLogicos() Dim categoria As String Dim cantidad As Single Dim precio As Currency 5 6 7 8 cantidad = 10 categoria = "vip" precio = 100 9 10 11 12 13 14 15 16 17 18 19 'Evaluar descuento If cantidad >= 10 Then 'If anidado: es un if dentro de otro if If categoria = "vip" Then 'Aplicar 30% de descuento precio = precio * 0.7 MsgBox "El nuevo precio es " & precio End If End If End Sub El if anidado es un bloque if, dentro de otro bloque if, puedes utilizarlo para tomar decisiones más complicadas, sin embargo, anidar muchos if puede generar código difícil de leer. Para evitar este problema existe otra sentencia llamada Select Case, en ella se evalúan varias condiciones y se puede ejecutar un bloque de código por cada evaluación. https://excel.facilparami.com 28 Introducción a la programación Para comprender mejor cuando usar una sentencia if o Select Case veamos una misma macro en las dos versiones. Imagina que te piden una macro para determinar el descuento que aplica a un producto en base a la cantidad que compran aplicando estos criterios: • • • • • Si la cantidad esta entre 0 y 20 no hay descuento Si la cantidad es mayor que 20 el descuento es de 10% Si la cantidad es mayor que 30 el descuento es de 15% Si la cantidad es mayor que 40 el descuento es de 20% Si la cantidad es mayor que 50 el descuento es de 25% La macro usando if que resuelve este problema es la siguiente (como siempre debes crear y probarla en tu computadora) 1 2 3 4 Sub DescuentoIf() Dim cantidad As Single Dim descuento As Single cantidad = InputBox("Ingrese cantidad") 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 If cantidad > 50 Then descuento = 25 Else If cantidad > 40 Then descuento = 20 Else If cantidad > 30 Then descuento = 15 Else If cantidad > 20 Then descuento = 10 End If End If End If End If 22 23 24 MsgBox "El descuento es de " & descuento & "%" End Sub Como puedes observar, tantos if anidados puede ser algo confuso. También debes notar que he introducido la función InputBox que permite preguntar al usuario un valor y guardarlo en una variable, esto hará que sea más fácil probar esta macro. Después de probar esta macro intenta probar la versión Select Case y verás que el resultado es el mismo, pero el código es más limpio y fácil de entender. https://excel.facilparami.com 29 Introducción a la programación 1 2 3 4 Sub DescuentoSelectCase() Dim cantidad As Single Dim descuento As Single cantidad = InputBox("Ingrese cantidad") 5 6 7 8 9 10 11 12 13 14 15 16 17 Select Case cantidad Case 0 To 20 descuento = 0 Case 21 To 30 descuento = 10 Case 31 To 40 descuento = 15 Case 41 To 50 descuento = 20 Case Else descuento = 25 End Select 18 19 20 MsgBox "El descuento es de " & descuento & "%" End Sub Posiblemente ya descifraste la forma de usar la sentencia Select Case, pero si no lo has hecho, voy a explicar con mayor detalle cómo se usa. Todo el bloque se define entre las palabras Select Case Variable y finalizan con End Select, luego hay una o más sentencias Case con una expresión y su respectivo bloque de código. Existe un caso Else que es el que se ejecuta si ninguno de los casos anteriores fue ejecutado. Como ya habrás notado, la sentencia Select Case es un poco más compleja que la sentencia if, pero más fácil de leer cuando hay varias posibles opciones a una decisión. Pero la mejor forma de dominar esta sentencia es por medio de algunos ejemplos prácticos, afortunadamente puedes leer algunos en este artículo⁴. Operaciones con variables Trabajar con Excel es (la mayoría de las veces) realizar cálculos y para ello necesitas realizar sumas, restas, etc. En esta tabla tenemos una lista de los operadores disponibles: ⁴https://excel.facilparami.com/2019/04/ejemplos-practicos-de-la-sentencia-select-case https://excel.facilparami.com 30 Introducción a la programación Operador + * / ^ \ Mod & Descripción Suma Multiplicación División Resta Exponenciación División entera (regresa solo la parte entera, sin decimales) Regresa el residuo de una división, por ejemplo 5 mod 2 = 1 Concatenar dos cadenas de texto (unir dos textos) Ya hemos utilizado algunos de estos operadores de los ejemplos anteriores, pero tener esta lista te servirá como referencia. Qué son los ciclos Los ciclos son repeticiones de un bloque de código, regresando al ejemplo de las decisiones, cuando te sirven una taza de café, primero lo pruebas si está muy caliente esperas un rato y lo vuelves a probar, repites este paso de probar y decidir hasta que la temperatura sea de tu agrado para tomar tu café. Lo mismo sucede con los programas, un bloque de código puede necesitar repetirse un numero conocido o desconocido de veces. El ciclo for se usa cuando conoces la cantidad de veces que necesitas repetir el bloque de código, la sintaxis (estructura) del bloque for es: 1 2 3 for variable = valorInicial to valorFinal Step 1 'Ejecutar codigo Next variable Debes declarar una variable que se usará como contador, luego defines un valor inicial y un valor final, opcionalmente puedes definir el valor del incremento con la instrucción Step que de forma predeterminada es 1, si piensas hacer incrementos de 1 puedes no usarla. El ciclo funcionará así: si la variable tiene un valor inicial de 1, un valor final de 5 y un incremento (step) de 1, entonces la primera vez que se ejecuta la variable contiene un 1, la segunda vez la variable se incrementa a 2, luego a 3, luego a 4 y finalmente se incrementa a 5 y es la última vez que se ejecuta el bloque de código. Por ejemplo, imagina que debes generar una hoja de Excel que contiene el número de filas en la columna A, y que inicia desde la celda A2, entonces la celda A2 tendrá 1, la celda A3 tendrá 2 y así sucesivamente hasta llegar a 10. Entonces el código para hacer eso sería este: https://excel.facilparami.com 31 Introducción a la programación 1 2 Sub CicloFor() Dim fila As Integer 3 4 5 6 For fila = 1 To 10 Range("A" & fila + 1) = fila Next fila 7 8 End Sub La función Range se puede usar para hacer referencia a una celda de la hoja actual, recibe como parámetro el nombre de la celda por ejemplo A1 pero como sabemos que es la columna A, pero desconocemos el número de la fila, entonces usamos una concatenación de la A y el contenido de la variable fila + 1 y le asignamos el contenido de la variable fila que en cada ciclo contendrá 1, 2, 3…10 El ciclo Do While ejecuta un bloque de código durante un número desconocido de veces, se hace mientras se cumpla la condición que definimos, por ejemplo, mientras el café este muy caliente. La sintaxis de este ciclo es: 1 2 3 Do While Condicion ' Bloque de codigo Loop Como vemos, se colocan las palabras Do While seguidas de una condición y se cierra el bloque de código con una palabra Loop. El bloque de código va a ejecutarse mientras la condición sea verdadera. Usamos este ciclo en la macro que creamos al inicio del capítulo, aquí está de nuevo para que la recuerdes: 1 Sub calcula_precios() 2 3 4 Dim costo Dim fila As Integer 5 6 7 'Coloca encabcezado Range("D1").FormulaR1C1 = "Precio" 8 9 10 11 12 13 14 'Recorrer todas las filas fila = 2 costo = Range("C" & fila).FormulaR1C1 Do While IsNumeric(costo) 'Procesar mientras el costo sea un numero 'Calcular el precio Range("D" & fila).FormulaR1C1 = costo * 1.3 15 https://excel.facilparami.com 32 Introducción a la programación 16 17 18 19 20 'Pasar a las siguiente fila y leer el costo fila = fila + 1 costo = Range("C" & fila).FormulaR1C1 Loop End Sub Creamos una variable llamada costo con el contenido de la celda que corresponde la fila que estamos procesando, luego usamos la función IsNumeric para preguntar si su valor es un número, así sabremos si ya hemos terminado, porque no encontrará un número, sino una celda vacía cuando termine de procesar todas las filas con datos. También debes notar que ahora usamos Range("C" & fila).FormulaR1C1 en lugar de solo Range("C" & fila), hacemos esto para poder usar la función IsNumeric ya que Range("C" & fila) convertirá el valor vacío a un cero y entonces IsNumeric siempre va a regresar Verdadero. FormulaR1C1 regresa el contenido de la celda sin hacer ninguna conversión. Hay algo muy importante que debes conocer, como ves este ciclo se repite un valor indefinido de veces y al final de este ciclo, he actualizado el valor de la variable costo, con el contenido de la siguiente fila, si no hago esto entonces la comparación que hace el ciclo no va a cambiar nunca y el resultado será siempre verdadero, no habrá forma de terminar el ciclo y esto se conoce como ciclo infinito, tu computadora quedara atrapada en un ciclo sin fin hasta que reinicies tu computadora o termines el proceso con el administrador de tareas. También existen algunas variantes de este ciclo y son las siguientes: Repetir mientras la condición sea falsa, se termina si la condición es verdadera. 1 2 3 Do Until Condicion 'Bloque de Codigo Loop Repetir al menos una vez sin importar la condición, y luego repetir mientras la condición sea verdadera. 1 Do 2 'Bloque de Codigo Loop While Condicion 3 Repetir al menos una vez sin importar la condición, y luego repetir mientras la condición sea falsa. 1 Do 2 'Bloque de Codigo Loop Until Condicion 3 https://excel.facilparami.com 33 Introducción a la programación Ejercicio El ejercicio de este capítulo es sencillo, con la macro que creamos al inicio y con lo que has aprendido trata de hacer algunas modificaciones, por ejemplo: 1. 2. 3. 4. Cambia el factor de 1.3 a 1.25 Cambia el titulo Precio, por Precio Unitario Agrega más filas de productos y mira que pasa Cambia el ciclo Do While por un ciclo For y revisa si todo sigue funcionando. Interactuando con Excel En este capítulo aprenderás las bases para trabajar con las hojas de cálculo de Excel, podrás entender los objetos de Excel, sus eventos y como acceder a los libros, hojas y celdas. ¿Que son los objetos y clases? Excel fue desarrollado usando programación orientada a objetos, esto significa que utiliza objetos para trabajar con las celdas, hojas y libros. Ahora debes estarte preguntando que son estos objetos, así que voy a definir esto para que no tengas ninguna duda. En la programación orientada a objetos se usan clases y objetos, la clase contiene una definición general del objeto, en esta definición hay métodos, eventos y propiedades. Los métodos realizan un proceso y las propiedades contienen información sobre el objeto, los eventos son señales que se envían cuando ocurre algo previamente definido. Pero veamos una analogía de la vida real, digamos que tenemos una clase que se llama vehículo, que describe de forma general un vehículo, entonces tiene estos métodos: 1. Encender vehículo, esto realiza un proceso, envía gasolina al motor, y todo lo demás que se necesita para encender el motor. 2. Acelerar, esto incrementa la velocidad 3. Frenar, esto disminuye la velocidad 4. Apagar vehículo, detiene el motor. Y también tiene estas propiedades: 1. Estado del motor (puede ser encendido o apagado) 2. Velocidad del vehículo Algunos eventos podrían ser: https://excel.facilparami.com 34 Introducción a la programación 1. Motor sobre calentado: Envía señal informando que el motor está muy caliente. 2. Gasolina a nivel mínimo: Envía señal informando que la gasolina está por terminarse. Esa fue la clase vehículo, entonces cuando quieres crear un vehículo en específico por ejemplo un Mazda3, lo declaras como un objeto de la clase vehículo (como cuando declaras una variable) y este obtiene toda la definición de la clase, puedes consultar su velocidad actual, acelerarlo, frenarlo y apagarlo. Ahora veamos cómo se aplica esto a Excel, existe una clase llamada Workbook (en español seria Libro, es decir un archivo de Excel) y cada vez que se crea o se abre un archivo de Excel se crea un objeto con la definición de esa clase. Este objeto va a tener muchos métodos, propiedades y eventos, pero voy a mencionar solo un ejemplo de cada uno. • Método Save: Guarda el libro, este método se usa cuando presionas el botón guardar. • Propiedad Sheets: Guarda una referencia a todas las hojas de este libro, en este caso cada hoja es otro objeto, entonces un objeto puede contener más objetos almacenados como propiedades. • Evento BeforeSave: Este evento te avisa que el libro está a punto de ser guardado, usualmente usamos este evento para validar que todo esté bien antes de guardar o para guardar información adicional antes de guardar. Objetos de Excel Ahora que ya sabes que son los objetos, es hora de conocer los objetos más importantes para trabajar con macros en Excel. Application Este objeto representa la aplicación de Excel, desde aquí puedes acceder a todo, a los libros, las hojas de cada libro, las celdas y todo su contenido. Para nuestra conveniencia hay algunos objetos que se puede acceder directamente sin hacer referencia a este objeto, aunque todos estén dentro de este objeto Application, sin embargo, hay algunas opciones de configuración que solo puede ser utilizadas desde aquí. Workbooks Es en realidad una colección de objetos, aquí se encuentran todos los objetos Workbook, los cuales a su vez representan un libro o archivo de Excel. Desde aquí puedes acceder a todos los libros que están abiertos y crear o abrir otros. https://excel.facilparami.com 35 Introducción a la programación Sheets Se encuentra dentro de un objeto Workbook y es una colección que contiene todas las hojas del libro al que pertenece, desde cada hoja individual puedes acceder a todo lo relacionado ella, como su nombre y celdas, Además desde esta colección puedes crear, eliminar o modificar las hojas del libro. Range Ya usamos anteriormente este objeto, y puede representar una celda individual o un rango de celdas el cual puede abarcar todas las celdas de la hoja a la que pertenece. Para dejar todo más claro aquí hay una imagen con la jerarquía de cómo están organizados todos estos objetos. Representación de objetos en Excel ## Referencias a objetos La forma larga para acceder a cada objeto es a través de la jerarquía que vimos anteriormente, por ejemplo, para acceder a la celda A1 de la primera hoja, del primer libro abierto seria esta: 1 Application.Workbooks(1).Sheets(1).Range("A1") https://excel.facilparami.com 36 Introducción a la programación Como Workbooks es una colección de libros, debemos decir entre paréntesis, a cuál libro queremos referenciar, y lo hacemos por el número de 1 a n, o también por su nombre, aunque lo más probable es que no vamos a conocer el nombre del libro. Lo mismo ocurre con el objeto Sheets. La buena noticia es que existen referencias o atajos para no tener que escribir tanto para llegar al objeto que necesitamos, las referencias a objetos más utilizadas son: • • • • ActiveWorkbook: Hace referencia al libro con el que estás trabajando actualmente. ActiveSheet: Hace referencia a la hoja en la que estás trabajando. ActiveCell: Hace referencia a la celda en la que estás trabajando. Range: Si no escribes su ruta completa, asume que estás trabajando en la hoja actual, es lo mismo que decir ActiveSheet.Range Eventos de Excel Hasta ahora ya sabes cómo ejecutar una macro manualmente y como lo mencione antes, los eventos de un objeto envían un mensaje de que algo ha ocurrido. Lo que debes de saber ahora es que el evento también te permite ejecutar una macro o cualquier código de VBA de forma automática en respuesta a ese evento. Básicamente hay dos tipos de eventos: los eventos de libros (Workbook) y los eventos de hojas (Worksheet), cada uno tiene varios eventos, aunque lo más probable es que nunca llegues a usar más de 5 eventos, es bueno que los conozcas todos, porque nunca sabes cuándo podrían serte útil. Eventos más usados en Libros Evento Activate AddinInstall AddinUninstall BeforeClose BeforePrint BeforeSave Deactivate NewSheet Open SheetActivate SheetBeforeDoubleClick SheetBeforeRightClick SheetCalculate SheetChange SheetDeactivate Cuando se ejecuta El libro es activado, por ejemplo, estabas en otra ventaja y regresa al libro de Excel Cuando instalas un complemento Cuando desinstalas un complemento Justo antes de cerrar el libro Justo antes de imprimir Justo antes de guardar Cuando cambias a otro libro u otro programa que no sea Excel Creas una nueva hoja Cuando abres el libro Cuando cambias de hoja Antes de dar doble clic sobre una celda Antes de dar clic derecho en una celda Cuando la hoja calcula las formulas Cuando escribes algo en una celda Cuando dejas de usar una hoja, porque cambias a otra https://excel.facilparami.com 37 Introducción a la programación Evento SheetFollowHyperlink SheetSelectionChange WindowActivate WindowDeactivate WindowResize Cuando se ejecuta Cuando haces clic sobre un enlace Cuando cambias la selección de celdas Cuando cambias de libro Cuando dejas de usar un libro, porque cambias a otro Cuando la ventana o pantalla en que estás viendo un libro, cambia de tamaño. Eventos más usados en hojas Evento Activate BeforeDoubleClick BeforeRightClick Calculate Change Deactivate FollowHyperlink SelectionChange Cuando se ejecuta Cuando cambias de hoja Antes de hacer doble clic sobre una celda Antes de hacer clic derecho sobre una celda Cuando la hoja calcula las formulas Cuando el contenido de una celda cambia Cuando cambias de hoja Haces clic en un enlace Cuando cambias la selección de celdas Como acceder a los eventos Para ingresar código en estos eventos, primero debes ir al editor de VBA, luego haces doble clic ya sea en cualquier hoja de las que están en la ventana de proyecto (a la izquierda) o en ThisWorkbook (dependiendo de si deseas trabajar con un evento de hoja o libro, respectivamente). Luego en parte central en donde escribes el código selecciona de la lista desplegable Workbook o Worksheet, y en la lista que está a la par, seleccionas el evento con el que deseas trabajar, tal y como se muestra en esta imagen: https://excel.facilparami.com 38 Introducción a la programación Agregar un evento Al hacer eso, Excel va a generar una plantilla para el evento como esta: 1 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 2 3 End Sub En este caso hay algunos parámetros entre paréntesis, puedes notar que el primero inicia con ByVal, eso significa que puedes hacer uso de lectura de ese parámetro (ByVal significa por valor), el segundo parámetro no tiene esa palabra, eso significa que tienes acceso total y puedes leerla y modificarla. Entonces vamos a modificar ese parámetro Cancel, si lo hacemos igual a True, entonces el proceso se cancela y Excel no va a guardar el documento, esto puede ser útil para realizar alguna validación. Validemos que la celda A1 deba tener algún valor antes de guardar, escribiendo este código: 1 2 3 4 5 6 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Range("A1").FormulaR1C1 = "" Then MsgBox "Antes de guardar debe ingresar un valor valido, en la celda A1" Cancel = True End If End Sub Si tienes algún problema para crear la macro, puedes descargarla haciendo clic aquí⁵. Para probarla debes borrar el valor en la celda A1 e intentar guardar los cambios. ⁵https://my.pcloud.com/publink/show?code=XZc8iE7ZsBUoilhT0UyjDe8C9inQqm5VkyAX https://excel.facilparami.com 39 Introducción a la programación Ejemplo practico Ya tenemos bastante teoría hasta ahora, ya es tiempo de ver cómo aplicar todo esto mediante un ejemplo. Imagina que tienes un libro de Excel con 3 listas de precios: Clientes regulares, Clientes al mayoreo y Clientes VIP. Cada lista de precios está en una hoja diferente, pero en el mismo libro y si un cliente te solicita la lista de precios no puedes enviarle las 3 listas, además la lista contiene una columna de costo y no quieres que el cliente conozca tus costos, pero si tus precios. Puedes descargar una hoja con la macro ya hecha para que puedas probarla, haciendo clic en este enlace⁶ Estos son los problemas que necesitas solucionar: 1. Debes generar un archivo por cada lista de precios (cada hoja en el libro.) 2. Pedir al usuario en donde guardar los libros nuevos. 3. Debes eliminar la columna de costo, pero solo en el archivo que vas a enviar, sin afectar tu archivo, por que tú si necesitas el costo. Primero vamos a necesitar una macro para poder solicitar al usuario en que carpeta guardar los archivos nuevos, para esto vamos a usar una macro genérica que podremos reutilizar en otros proyectos. 1 2 3 4 ' Pedir a usuario que seleccione una carpeta Function SolicitarCarpeta() As String Dim dialogoArchivo As FileDialog Set dialogoArchivo = Application.FileDialog(msoFileDialogFolderPicker) 5 6 7 8 9 10 11 12 13 dialogoArchivo.Title = "Select a Folder" dialogoArchivo.AllowMultiSelect = False dialogoArchivo.InitialFileName = Application.DefaultFilePath If dialogoArchivo.Show <> -1 Then SolicitarCarpeta = "" Else SolicitarCarpeta = dialogoArchivo.SelectedItems(1) End If 14 15 End Function Ahora vamos a crear la macro que haga el resto del trabajo, el código es el siguiente: ⁶https://my.pcloud.com/publink/show?code=XZNO7O7ZDo7kOteNyVbcpxdJymoktphcqsKy https://excel.facilparami.com 40 Introducción a la programación 1 2 3 4 5 6 'Genera un archivo por cada hoja en este libro Sub GeneraArchivosPrecios() Dim carpeta As String Dim i As Integer Dim LibroNuevo As Workbook Dim LibroActual As Workbook 7 8 9 'Preguntar en que carpeta colocar este archivo carpeta = SolicitarCarpeta 10 11 12 13 14 If carpeta = "" Then MsgBox "No selecciono la carpeta en donde se guardaran los archivos" Else Set LibroActual = ActiveWorkbook 15 'Se deshabilita la actualizacion de la pantalla 'para evitar ver un parpadeo en la pantalla Application.ScreenUpdating = False For i = 1 To LibroActual.Sheets.Count 'creamos un libro nuevo..... Set LibroNuevo = Workbooks.Add 16 17 18 19 20 21 22 'Hacemos la copia de toda la hoja en el nuevo libro LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1) 23 24 25 'Eliminar columna de costo (C) LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete 26 27 28 'Guardar libro en la carpeta definida y con el nombre de la hoja LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name 29 30 31 32 33 34 35 36 37 'Cerrar el libro LibroNuevo.Close Next i 'Habilitar de nuevo la actualizacion de pantalla Application.ScreenUpdating = true End If 38 39 End Sub En el código anterior, primero declaramos algunas variables, en las que LibroNuevo y LibroActual son de la clase Workbook, en ese caso van a ser objetos y para asignar objetos no es suficiente utilizar el signo = también tienes que anteponer la palabra let tal y como se ve en la línea: https://excel.facilparami.com 41 Introducción a la programación 1 Set LibroActual = ActiveWorkbook La macro es realmente sencilla, pero los más probable es que te estés preguntando, como harías para saber que métodos o propiedades utilizar si quisieras hacer otra cosa, por ejemplo, imprimir una hoja. Con el tiempo y la práctica vas a conocer muy bien todos estos objetos, pero para comenzar puedes usar la documentación, para acceder a ella, desde el editor de VBA presionas la tecla F2 y veras una pantalla como esta: Examinador de objetos En la parte izquierda se encuentra una lista de todas las clases (yo use la clase Sheets para acceder a las hojas) y cuando seleccionas una clase, en la parte derecha puedes ver la lista de propiedades (las que tienen un icono con una mano) y métodos (los que tienen un icono con un rectángulo verde). Si tienes dudas de cómo usar algún método, puedes hacer clic derecho y seleccionara Ayuda del menú contextual. Eso te llevara a una página web como ésta, con más detalle: https://excel.facilparami.com 42 Introducción a la programación Ayuda de clases Ejercicio En el capítulo 3 hicimos una macro que calculaba el precio en base a un costo, modifica esa macro para que además de generar la columna de precios, también genere dos hojas más, en ese mismo archivo con diferentes precios basados en márgenes de 30%, 25% y 20%. https://excel.facilparami.com Extendiendo Excel Ahora que ya tienes conocimientos más profundos sobre VBA y los objetos de Excel, es hora de extender un poco a Excel y agregar algunas cosas que nos ayuden a trabajar más rápido, como empaquetar algunos cálculos que realices con frecuencia y convertirlos en funciones o ir un poco más allá y convertir macros en complementos de Excel que puedas usar en todas las hojas de Excel. Crea tus propias funciones Posiblemente la función Suma de Excel sea la función más utilizada por todos, pero en tu caso particular podría haber fórmulas o cálculos que uses con frecuencia, por ejemplo, el cálculo de precio en base a un costo y luego agregar el impuesto de ventas. Vamos a una función que haga eso, va a recibir un valor (el costo) y a hacer el cálculo del precio final, crea un archivo de Excel y agrega un módulo y este código: 1 2 Function calculaPrecio(costo As Currency) Dim precio As Currency 3 4 5 'Agregar 30% de margen precio = costo * 1.3 6 7 8 'Agregar 13% de IVA (Impuesto de ventas) precio = precio * 1.13 9 10 11 12 13 'El mismo nombre de la funcion tambien funciona como 'variable en donde se asigna el valor a devolver calculaPrecio = precio End Function Ahora si regresamos a la hoja de Excel, podemos seleccionar una celda y hacer clic sobre el botón para insertar una función. En el cuadro de diálogo que aparezca podemos seleccionar la categoría Definida por el usuario y luego se nos presenta la lista de funciones disponibles. Podemos seleccionar la que acabamos de crear y utilizarla para calcular el precio (la función recibe un único parámetro y es el costo) 44 Extendiendo Excel Función definida por el usuario Entonces para crear tus propias funciones, solo debes crear una función en VBA que reciba los parámetros que necesites y que regrese un valor, ese valor que regrese será el valor que se muestre en la celda que uses. Ahora hay algunos problemas que debemos resolver, tú conoces muy bien la fórmula que creaste y sabes para que sirve y que parámetros usas, pero otras personas no lo saben y es por eso que debes agregar descripciones a la función y a sus parámetros. https://excel.facilparami.com 45 Extendiendo Excel Función sin descripciones Agrega documentación a tus fórmulas Para agregar las descripciones a la fórmula, vamos a utilizar el evento Open para el libro (Workbook). Primero hacemos doble clic sobre ThisWorkbook en el panel de proyecto (a la izquierda), luego en las listas desplegables elegimos Workbook y Open respectivamente. Esto creara una macro en blanco, ahí debemos escribir el código para decirle a Excel las descripciones de nuestra función. https://excel.facilparami.com 46 Extendiendo Excel Descripción de funciones Vamos a usar como ejemplo la función que ya creamos, sigue los pasos anteriores y la macro debe de quedar de esta forma: 1 2 3 4 5 Private Sub Workbook_Open() 'Declarar un array para las descripciones de cada argumento Dim Param(1 To 1) As String 'Asignar la descripcion Param(1) = "Costo del producto" 6 7 8 9 10 11 12 'Registrar la descripcion de la macro y de los parametros Application.MacroOptions Macro:="calculaPrecio", _ Description:="Calcula un precio en base a un costo y agrega el impuesto de venta\ s", _ ArgumentDescriptions:=Param End Sub Primero declaramos un arreglo, en este caso será de 1 a 1, porque solo hay un parámetro, luego asignamos la descripción del parámetro al elemento 1 del arreglo. Finalmente usamos la función Application.MacroOptions con 3 parámetros: (1) el nombre de la macro, (2) la descripción de la macro y (3) el arreglo que contiene las descripciones de los parámetros. Ahora, como esta macro se creó en el evento Open, deberás cerrar el libro y volver a abrirlo para que tome los cambios o ejecutar el evento manualmente la primera vez. Nota: VBA no tiene ningún signo que defina el fin de línea, como un punto o punto y coma, entonces se entiende que la instrucción o sentencia termina cuando haces un salto de línea, pero puedes escribir una sentencia en varias líneas si escribes un guion bajo para indicar que la sentencia continua en la siguiente línea, tal y como lo hice en la macro anterior. Esto hace que la macro sea más legible en los casos en que el código es demasiado largo para verse completamente en la pantalla. https://excel.facilparami.com 47 Extendiendo Excel Veamos como seria ahora, si tuviéramos que registrar dos o más macros y con más de un parámetro. La forma más ordenada seria creando una macro para generar las descripciones de cada macro y luego llamarlas desde el evento Open de esta forma: Descripción para varias funciones Puedes descargar este ejemplo con las dos funciones haciendo clic aquí⁷. Parámetros opcionales En ocasiones podemos tener una función con parámetros opcionales, imaginemos una función para aplicar un descuento que recibe el precio y el tipo de cliente. Dependiendo de si el tipo de cliente es VIP o no, se aplicará un descuento diferente, si no se define un tipo de cliente entonces se aplica el descuento mínimo que es 5%. Para definir que el parámetro es opcional se antepone la palabra Optional al nombre del parámetro y al final se puede definir un valor predeterminado, el cual se asigna automáticamente cuando omitimos su valor al llamar a la función. Veamos la definición de los parámetros en este ejemplo: ⁷https://my.pcloud.com/publink/show?code=XZt1YO7ZLsiRr5DGnwRDr58Ha5su0RC4O3Ck https://excel.facilparami.com 48 Extendiendo Excel 1 2 3 4 'Calcula un descuento de acuerdo al tipo de cliente Function aplicaDescuento(precio As Currency, Optional tipoCliente As String = "regul\ ar") Dim precioConDescuento As Currency 5 6 7 8 9 10 11 12 13 Select Case tipoCliente Case "vip" precioConDescuento = precio * 0.7 Case "silver" precioConDescuento = precio * 0.9 Case Else precioConDescuento = precio * 0.95 End Select 14 15 16 aplicaDescuento = precioConDescuento End Function Ahora, si usas esa función, verás que, si no defines el segundo parámetro, toma el valor predeterminado y aplica el 5% de descuento. Función con parámetros opcionales https://excel.facilparami.com 49 Extendiendo Excel Instalar y desinstalar complementos Como abras notado, todas las macros que creas están disponibles únicamente cuando tienes abierto el libro en donde las creaste, si el libro está cerrado, no hay forma de poder utilizar tus macros. Pero esto se soluciona creando complementos. Los complementos son programas que extienden o complementa las funcionalidades de Excel, puedes crear complementos usando código de otros lenguajes de programación como Visual Basic o C#, pero también puedes crearlos usando VBA y reutilizando las macros que ya creaste. Veamos primero como instalar un complemento en tu Excel, imagina que haces facturas o recibos en Excel y debes de escribir una cantidad en números y en letras, por ejemplo $130.00 en una celda y CIENTO TREINTA CON 00/100 DOLARES en otra celda y piensas que sería bueno tener un complemento que escriba la cantidad en letras en tu lugar, y de hecho existe uno en mis blogs: https://excel.facilparami.com⁸. Para continuar el ejercicio descargar el complemento haciendo clic aquí⁹. Ahora en el menú Programador haces clic en la opción Complementos de Excel y en la ventana que se mostrará, haces clic sobre el botón Examinar... y buscas y selecciones el complemento que acabas de descargar y finalmente haces clic en el botón Aceptar. Instalar complementos ⁸https://excel.facilparami.com ⁹https://my.pcloud.com/publink/show?code=XZlMxz7Zvw3VmJyECY4BOueWgSR9RJnlvLt7 https://excel.facilparami.com 50 Extendiendo Excel Ahora tienes el complemento instalado, has ganado la función numletras y puedes usarla en cualquier hoja de Excel. Probar complemento Nota: En ocasiones puede suceder que cuando cierras Excel y lo abres de nuevo, el complemento desaparece o deja de funcionar, eso pasa por que la ubicación en donde guardaste el complemento no es de confianza. Puedes solucionar eso siguiendo los pasos que están en este articulo: Qué hacer si un complemento desaparece cada vez que cierras Excel¹⁰ Si por alguna razón te cansas de un complemento y quieres desinstarlo puedes ir al menú Programador y luego a Complementos de Excel y en la lista de complementos solo debes desmarcar el cheque del complemento que ya no deseas y hacer clic en el botón Aceptar. ¹⁰https://excel.facilparami.com/2018/04/que-hacer-si-un-complemento-desaparece-cada-vez-que-cierras-excel/ https://excel.facilparami.com 51 Extendiendo Excel desinstalar-complemento Crea tus propios complementos Ahora que has visto los complementos de Excel y lo que pueden hacer, es hora de crear tu propio complemento. Esto es muy sencillo, solamente necesitas un archivo con macros en él. Vamos a tomar como ejemplo el archivo que creamos con las funciones para calcular el precio y descuento. Abres el archivo y le das guardar como... y te aseguras de elegir el tipo Complemento de Excel (*.xlam) eso va a generar tu código como un complemento que puedes instalar en cualquier computadora y dejar que tus macros estén disponibles, siempre. https://excel.facilparami.com 52 Extendiendo Excel Crear complemento ## Ejercicio Toma la macro que hiciste en el ejercicio del capítulo 4 y convierte esa hoja en un complemento, luego instala el complemento en tu Excel y prueba si funciona correctamente. https://excel.facilparami.com Corrigiendo Errores Somos humanos y siempre cometemos errores, lo importante es que aprendemos de ellos y hacemos lo posible por no repetirlos, entonces es de esperar que al inicio nuestras macros tengan muchos errores, pero con el tiempo eso va a cambiar. Sin embargo, todo código escrito por humanos podría contener errores y todos los lenguajes de programación nos proveen de herramientas para minimizarlos. En este capítulo voy a explicarte los tipos de errores que puedes esperar y como encontrarlos y corregirlos. Que tipos de errores podemos esperar Cuando programamos, nuestro código puede tener 3 tipos de errores: de sintaxis, errores en tiempo de ejecución y errores lógicos. Errores de sintaxis Estos errores son los más sencillos de detectar y corregir, ya que el mismo editor de VBA nos advierte y no permite ejecutar la macro hasta que lo corregimos. Los errores de sintaxis se dan porque nos hemos equivocado al usar alguna instrucción o no hemos seguido las reglas. Por ejemplo, observa esta macro y trata de encontrar el error. 1 2 3 4 5 6 Sub TengoUnError() Dim numero As Integer If numero >= 0 'Hacer algo End If End Sub La sintaxis de la instrucción if es: 1 2 3 If numero >= 0 then 'Hacer algo End If Entonces nos equivocamos al omitir la palabra then. Para evitar estos errores vamos a necesitar obtener un conocimiento de las sentencias de VBA y eso solo nos lo puede dar la práctica, entre más código escribas, mejor te volverás. 54 Corrigiendo Errores Errores en tiempo de ejecución Estos errores se dan por que el programa se encuentra con datos para los que no estaba preparado, el ejemplo clásico de esto es la división entre cero, ninguna computadora puede realizar este cálculo y por lo tanto genera un error. División entre cero Una forma de eliminar estos errores es validando los datos antes de usarlos, aquí está el código anterior con su corrección: 1 2 3 4 Sub divisionEntreCero() Dim precio As Currency Dim cantidadPagos As Single Dim cuota As Currency 5 6 precio = 125 7 8 9 10 11 12 If cantidadPagos > 0 Then cuota = precio / cantidadPagos Else cuota = precio 'Todo en una sola cuota End If 13 14 End Sub En este caso resolvimos el error asignado un valor predeterminado para cuando la cantidad de pagos sea cero, en otros casos no hay forma de asignar un valor predeterminado, entonces lo mejor es detener la ejecución y emitir un mensaje de error. https://excel.facilparami.com 55 Corrigiendo Errores 1 2 3 4 Sub divisionEntreCero() Dim precio As Currency Dim cantidadPagos As Single Dim cuota As Currency 5 6 precio = 125 7 8 9 If cantidadPagos > 0 Then cuota = precio / cantidadPagos 10 '... continuar con el codigo 11 12 13 14 15 16 Else '... detener todo y emitir mensaje de error MsgBox "Por favor defina una cantidad de pagos para continuar" End If 17 18 End Sub Los errores en tiempo de ejecución son difíciles de predecir, la mejor forma de evitarlos es realizando pruebas del código con valores que no esperamos, por ejemplo, si tu macro calcula la edad de una persona y solicita como parámetro la fecha de nacimiento, intenta enviarle una fecha futura como 12/12/2099 y mira cómo se comporta. En el mundo real nuestros programas no siempre obtienen datos validos o los datos que esperan. Errores lógicos Estos son los errores más difíciles de detectar y corregir, se dan por que el programa ha implemento un código equivocado, por ejemplo, imagina que debes calcular el margen de un producto y sabes que la fórmula para eso es: 1 margen = ingresos - costos Entonces si implementas esa fórmula, pero terminas con un código como este: 1 2 3 Function margen(ingresos As Currency, costos As Currency) margen = costos - ingresos End Function No vas a obtener un error visible, simplemente un mal cálculo por haber invertido (por error) las variables de la fórmula. Nuevamente, la única forma de detectar estos errores es probando tu código y revisando si genera los resultados esperados. Una vez detectas que tu programa tiene errores lógicos, lo que sigue es realizar un proceso de depuración. https://excel.facilparami.com 56 Corrigiendo Errores Como depurar código en el editor de VBA. La depuración en programación es el proceso por el cual se detectan y corrigen errores en el código, esto se hace usualmente ejecutando el código instrucción por instrucción y revisando los valores de las variables. Para comprender como es el proceso de depuración y las herramientas que tenemos disponibles, vamos a tomar como ejemplo, una función que debe calcular un descuento. Imagina que te han reportado que en ocasiones no calcula el descuento de forma correcta y los clientes se molestan, entonces te han pedido que revises el código y resuelvas el problema. Como regla del negocio todos los clientes vip tiene 30% de descuento, los clientes silver tienen un 15% y los demás tienen un 5% de descuento. La función que debes revisar es esta: 1 2 3 4 5 'Calcula un descuento de acuerdo al tipo de cliente Function aplicaDescuento(precio As Currency, _ Optional tipoCliente As String = "regular") _ As Currency Dim precioConDescuento As Currency 6 7 8 9 10 11 12 13 14 Select Case tipoCliente Case "vip" '30% de descuento precioConDescuento = precio * 0.7 Case "silver" '15% de descuento precioConDescuento = precio * 0.9 Case Else '5% de descuento precioConDescuento = precio * 0.95 End Select 15 16 17 aplicaDescuento = precioConDescuento End Function Lo primero que debes de saber es que no puedes iniciar la depuración con una función, si deseas depurar la función entonces necesitas crear una subrutina que llame a la función e iniciar la depuración ejecutando la subrutina. Entonces agregas este código: https://excel.facilparami.com 57 Corrigiendo Errores 1 2 3 'Subrutina para llamar a la funcion de descuentos Sub depurarFuncionDescuentos() Dim descuento As Currency 4 5 6 'Probar descuentos VIP descuento = aplicaDescuento(100, "vip") 7 8 9 'Probar descuentos Silver descuento = aplicaDescuento(100, "silver") 10 11 12 'Probar otros descuentos descuento = aplicaDescuento(100, "") 13 14 End Sub Ejecutar código paso a paso Ahora para iniciar el proceso de depuración puedes colocar el cursor o hacer clic sobre la subrutina que debes corregir y elegir el menú Depuración y la opción Paso a paso por instrucciones. https://excel.facilparami.com 58 Corrigiendo Errores Depurar paso a paso Ahora has iniciado la ejecución de código paso a paso, para avanzar puedes presionar las teclas F8, Mayus+F8, Cltr+Mayus+F8 o Ctrl+F8. Opciones de ejecución Cada tecla o combinación hacen algo diferente, si presionas F8 iras avanzado instrucción por instrucción y si la instrucción es la llamada a otra función o subrutina, entonces ingresarás a esa https://excel.facilparami.com 59 Corrigiendo Errores función o subrutina y avanzaras instrucción por instrucción. Si presionas Mayus+F8 entonces avanzaras instrucción por instrucción, pero si la instrucción es la llamada a una función o subrutina, pasas a la siguiente instrucción sin ingresar al detalle de esa función o subrutina. Si presionas Ctrl+Mayus+F8, entonces vas a saltar directo a al final de la función o subrutina actual. Si presionas Ctrl+F8 entonces avanzas hasta donde este posicionado el cursor. Nota: Para comprender mejor todo esto, lo mejor es que lo intentes tú mismo, puedes descargar esta hoja de ejemplo en este enlace¹¹. Puntos de interrupción Los puntos de interrupción son líneas de código que marcas para que cuando la ejecución del código llegue a esa línea, el programa se interrumpa e inicie el modo de depuración justo desde esa línea. Para establecer un punto de interrupción solo debes hacer clic en la barra gris que está a la izquierda del código, cuando lo hagas se activará un punto de interrupción justo en la línea de código que este en esa altura. Sabrás que hay un punto de interrupción cuando veas un círculo rojo en esa barra. Debes saber que solamente se pueden crear puntos de interrupción para líneas de código ejecutables, es decir, no puedes hacerlo para líneas como declaraciones de variables. Para desactivar un punto de interrupción solo debes de hacer clic sobre el círculo rojo que corresponde al que deseas eliminar. Has unas pruebas, para que veas como funciona esta parte Punto de interrupción ¹¹https://my.pcloud.com/publink/show?code=XZq3xO7ZXfM6ec7doVSQAV1sqRd65LXPpuPX https://excel.facilparami.com 60 Corrigiendo Errores Inspeccionar variables La inspección de variables permite visualizar el contenido de las variables, solo debes de estar en modo de depuración. Existen dos formas para ver el valor de la variable, la primera es colocando el puntero del mouse sobre la variable y esto hará que aparezca un mensaje tipo “tooltip” para mostrar la variable y su valor actual, tal y como se ve en esta pantalla: Inspeccionar un valor La segunda forma es agregando un punto de inspección, para esto haces clic derecho sobre la variable que desees y seleccionas la opción de menú Agregar inspección... https://excel.facilparami.com 61 Corrigiendo Errores Agregar inspección Y en la siguiente pantalla solo haces clic en el botón Aceptar. Agregar inspección Ahora se abrirá una ventana con todas las variables que estés inspeccionando y mostrará su valor actual. De esta otra forma puedes monitorear un conjunto de variables. Esto te ayudará a revisar si tu código está calculando los valores de la forma en que tú esperas que lo haga. https://excel.facilparami.com 62 Corrigiendo Errores Inspecciones Mostrar mensajes de depuración Otra forma de depurar código es mostrando mensajes de depuración, puedes imprimir en pantalla información como valores de variables, cálculos o mensajes que indiquen el camino que el código siguió, por ejemplo, si ingresó en un bloque if. Para esto utilizas la función Debug.Print, esta se usa igual que la función msgbox, veamos un ejemplo, ahora la función muestra un mensaje indicando que tipo de descuento va a calcular. 1 2 3 4 5 'Calcula un descuento de acuerdo al tipo de cliente Function aplicaDescuento(precio As Currency, _ Optional tipoCliente As String = "regular") _ As Currency Dim precioConDescuento As Currency 6 7 8 9 10 11 Select Case tipoCliente Case "vip" '30% de descuento Debug.Print "Calcula descuento VIP" precioConDescuento = precio * 0.7 Case "silver" '15% de descuento https://excel.facilparami.com 63 Corrigiendo Errores 12 13 14 15 16 17 Debug.Print "Calcula descuento silver" precioConDescuento = precio * 0.9 Case Else '5% de descuento Debug.Print "Calcula descuento para cliente regular" precioConDescuento = precio * 0.95 End Select 18 19 20 aplicaDescuento = precioConDescuento End Function Para poder ver estos mensajes primero debes mostrar la ventana Inmediato, esto se logra con el menú Ver y la opción Ventana Inmediato ventana-inmediato Ahora si ejecutas el código, verás los mensajes de depuración, en esta macro se llamó a la función 3 veces con diferentes parámetros y en la ventana inmediato, está el resultado de cada llamado. https://excel.facilparami.com 64 Corrigiendo Errores Ventana inmediato - ejemplo En la función Debug.Print también puedes usar el signo & para unir textos y variables, para crear mensajes más informativos, por ejemplo: 1 Debug.Print "El precio con descuento es: " & precioConDescuento Control de errores en tiempo de ejecución En ocasiones no importa lo que hagamos, los errores van a ser inevitables, por ejemplo, ¿recuerdas la macro que hicimos en el capítulo 4 para generar un archivo de Excel por cada hoja en un libro?, la macro solicita una carpeta y ahí crea un archivo por cada hoja, el nombre de cada archivo corresponde al nombre de la hoja. Si una hoja se llama “Lista Precios A” entonces genera el archivo “Lista Precios A.xlsx”, la macro pareciera funcionar sin problemas, pero cuando nombras una hoja con una letra no valida por ejemplo usando el signo |, la macro genera un error en tiempo de ejecución. https://excel.facilparami.com 65 Corrigiendo Errores Error en ejecución Como puedes ver el mensaje no es nada amigable y el usuario solo podrá pensar que el programa “no sirve” y que no puede hacer nada para solucionar este problema, cuando la verdad es que el mismo usuario puede solucionar el problema con solo cambiar el nombre de la hoja, pero no lo hace porque no sabe que ese es el problema. Tenemos dos opciones para tratar este problema, la primera es detener toda la ejecución y mostrar un mensaje indicando el problema, y la segunda es, ignorar el error y continuar con la ejecución del código restante. La decisión que tomes va a depender de lo critico que consideres que sea el error, solo responde esta pregunta: ¿El no haber ejecutado esta instrucción afectará el comportamiento del código que hace falta ejecutar o dará un resultado equivocado al usuario? Una vez tomes la decisión, la forma para ignorar el error y continuar con la ejecución es colocando esta instrucción al inicio de la subrutina o función: 1 On Error Resume Next El código completo quedará así: https://excel.facilparami.com 66 Corrigiendo Errores 1 2 3 4 5 6 'Genera un archivo por cada hoja en este libro Sub GeneraArchivosPrecios_IgnoraError() Dim carpeta As String Dim i As Integer Dim LibroNuevo As Workbook Dim LibroActual As Workbook 7 8 On Error Resume Next 9 10 11 'Preguntar en que carpeta colocar este archivo carpeta = SolicitarCarpeta 12 13 14 15 16 17 18 19 20 If carpeta = "" Then MsgBox "No selecciono la carpeta en donde se guardaran los archivos" Else Set LibroActual = ActiveWorkbook Application.ScreenUpdating = False For i = 1 To LibroActual.Sheets.Count 'creamos un libro nuevo..... Set LibroNuevo = Workbooks.Add 21 'Hacemos la copia de toda la hoja en el nuevo libro LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1) 22 23 24 'Eliminar columna de costo (C) LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete 25 26 27 'Guardar libro en la carpeta definida y con el nombre de la hoja LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name 28 29 30 31 32 33 34 35 'Cerrar el libro LibroNuevo.Close Next i Application.ScreenUpdating = True End If 36 37 End Sub Para terminar el programa y mostrar un mensaje de error, debes colocar esta línea de código al inicio de la función o subrutina: https://excel.facilparami.com 67 Corrigiendo Errores 1 On Error GoTo ControlErrores La palabra ControlErrores es una etiqueta puede tener el nombre que desees, pero sin espacios en blanco. Luego al final de la función o subrutina colocas estas líneas de código: 1 2 3 'Asegurarse que en ejecución normal 'no se llegue mas lejos de aqui Exit Sub 4 5 6 ControlErrores: MsgBox "Ocurrio este error al generar los archivos: " & Err.Description Si usas una función cambia las palabras Exit Sub por Exit Function, si usaste otra etiqueta que no sea ControlErrores, recuerda también cambiarla en esta parte dejando siempre los : en la parte derecha (ControlErrores:). También debes personalizar el mensaje que se muestra con MsgBox, la variable Err.Description contiene el mensaje de error que genera el sistema, eso ayudara al usuario a saber cúal es el problema. El código final deberá verse como este: 1 2 3 4 5 6 'Genera un archivo por cada hoja en este libro Sub GeneraArchivosPrecios_MuestraError() Dim carpeta As String Dim i As Integer Dim LibroNuevo As Workbook Dim LibroActual As Workbook 7 8 On Error GoTo ControlErrores 9 10 11 'Preguntar en que carpeta colocar este archivo carpeta = SolicitarCarpeta 12 13 14 15 16 17 18 19 20 If carpeta = "" Then MsgBox "No selecciono la carpeta en donde se guardaran los archivos" Else Set LibroActual = ActiveWorkbook Application.ScreenUpdating = False For i = 1 To LibroActual.Sheets.Count 'creamos un libro nuevo..... Set LibroNuevo = Workbooks.Add 21 22 23 'Hacemos la copia de toda la hoja en el nuevo libro LibroActual.Sheets(i).Copy Before:=LibroNuevo.Sheets(1) 24 https://excel.facilparami.com 68 Corrigiendo Errores 25 26 'Eliminar columna de costo (C) LibroNuevo.Sheets(1).Columns(3).EntireColumn.Delete 27 28 29 'Guardar libro en la carpeta definida y con el nombre de la hoja LibroNuevo.SaveAs carpeta & "\" & LibroActual.Sheets(i).Name 30 31 32 33 34 35 'Cerrar el libro LibroNuevo.Close Next i Application.ScreenUpdating = True End If 36 37 38 39 'Asegurarse que en ejecució normal 'no se llegue mas lejos de aqui Exit Sub 40 41 42 43 ControlErrores: MsgBox "Ocurrio este error al generar los archivos: " & Err.Description End Sub Puedes descargar una hoja con estos ejemplos¹², para que los pruebes y veas la diferencia, existen 3 macros para que puedas observar cómo funciona sin control de errores (GeneraArchivosPrecios), ignorando el error (GeneraArchivosPrecios_IgnoraError) y mostrando el mensaje de error (GeneraArchivosPrecios_MuestraError). Ejercicio ¿Recuerdas el caso del error que mencionamos al inicio y que nunca resolvimos?: “Imagina que te han reportado que en ocasiones no calcula el descuento de forma correcta y los clientes se molestan, entonces te han pedido que revises el código y resuelvas el problema. Como regla del negocio todos los clientes vip tiene 30% de descuento, los clientes silver tienen un 15% y los demás tienen un 5% de descuento.”. Descarga esta hoja de Excel¹³, revisa la macro depurarFuncionDescuentos, encuentra y resuelve el problema aplicando lo que has aprendido en este capitulo ¹²https://my.pcloud.com/publink/show?code=XZs0wO7ZvscEhVoCXTBjwJPVWlcVpFpkqpHy ¹³https://my.pcloud.com/publink/show?code=XZq3xO7ZXfM6ec7doVSQAV1sqRd65LXPpuPX https://excel.facilparami.com Mensajes y cuadros de diálogo En este capítulo aprenderás algunas formas en las que puedes comunicarte con las personas que usan tus macros, veremos como mostrar mensajes y cómo capturar información para utilizar en tus programas. Mostrar mensajes en la barra de estado de Excel La barra de estado en Excel, está ubicada en la parte inferior de la ventana, en la siguiente imagen puede apreciarse con el mensaje “Procesando macro…” Mensaje en barra de estado 70 Mensajes y cuadros de diálogo Usualmente se usan estos mensajes para mantener al usuario informado del proceso de la macro, cuando la misma se está tardando mucho tiempo, por ejemplo, mostrando el porcentaje de avance. También puedes usarla para otros tipos de mensajes como “Datos guardados”, “Archivo generado”. Para mostrar mensajes en la barra de estados puedes utilizar el siguiente código y solo debes de modificar el texto entre comillas, por el texto que desees. Sub msgStatusBar() Application.StatusBar = "Procesando macro..." End Sub Mostrar mensajes usado MsgBox Anteriormente habíamos utilizado MsgBox, para mostrar mensajes, pero existen algunos parámetros extra que puedes utilizar en esta función. MsgBox tiene tres parámetros que nos interesan: • Prompt: Es el mensaje que mostramos al usuario • Buttons: Es un número que representa los botones y los iconos que van a mostrarse • Title: Es el título de la ventaja en donde se muestra el mensaje, de esta forma podemos personalizar aún más, nuestros mensajes. Lista de valores posibles para el parámetro Buttons Constante vbOKOnly vbOKCancel vbAbortRetryIgnore Valor 0 1 2 vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 3 4 5 16 32 48 64 0 vbDefaultButton2 256 vbDefaultButton3 512 vbDefaultButton4 768 vbApplicationModal 0 vbSystemModal 4096 Descripción Muestra el botón OK. Muestra los botones OK y Cancel. Muestra los botones Abortar, Reintentar y el botón Ignorar. Muestra los botones Si, No y Cancelar. Muestra los botones Si y No. Muestra los botones Reintentar y Cancelar. Muestra un icono de mensaje critico. Muestra un icono de pregunta. Muestra un icono de Exclamación. Muestra un icono de información. Hace que el primer botón que se muestra sea el predeterminado*. Hace que el segundo botón que se muestra sea el predeterminado*. Hace que el tercer botón que se muestra sea el predeterminado*. Hace que el cuarto botón que se muestra sea el predeterminado*. Aplicación Modal: Excel se bloquea y no permite seguir trabajando hasta que se presione alguno de los botones del mensaje Sistema Modal: Todos los programas se bloquean y no permite seguir trabajando hasta que se presione alguno de los botones del mensaje https://excel.facilparami.com 71 Mensajes y cuadros de diálogo *El botón predeterminado se activa al presionar la tecla Enter. Podemos combinar los valores anteriores a nuestro antojo sumando las constantes, por ejemplo, para mostrar un mensaje con los botones Ok y Cancelar y colocar un icono de Exclamación, utilizamos este código: Sub msgbox1() MsgBox "Este proceso va a sobre-escribir el libro", vbExclamation + vbOKCancel End Sub y el resultado será este: msgbox1 Hacer una pregunta utilizando MsgBox En el ejemplo anterior hicimos una pregunta utilizando MsgBox, pero no capturamos ninguna respuesta. Como lo he dicho antes, ésta es una función y las funciones regresan un valor, en este caso regresa el código del botón que presiono el usuario. Ahora solo necesitas un bloque if, para determinar que hacer. 1 2 3 4 5 6 7 8 `Sub msgbox2() If MsgBox("Este proceso va a sobre-escribir el libro", vbExclamation + vbOKCancel) \ = vbOK Then 'El usuario acepta continuar Else 'El usuario cancela la operacion End If End Sub` Debes de notar, que para que la función regrese el valor, debes colocar todos los parámetros entre paréntesis. En este caso preguntamos si el valor de retorno es vbOK (el usuario presiono el botón Ok), para una lista completa de los valores de retorno puedes consultar esta lista: https://excel.facilparami.com 72 Mensajes y cuadros de diálogo Constante vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo Valor 1 2 3 4 5 6 7 Descripción Botón OK (o Aceptar) Botón Cancelar Botón Abortar Botón Reintentar Botón Ignorar Botón Si Botón No Ventana de diálogo para trabajar con archivos Cuando utilizas algún programa y necesitas abrir o guardar un archivo, estos programas te muestran una ventana o formulario para que elijas el archivo y su ubicación. Puedes hacer esto mismo con tus macros, cuando necesites abrir o guardar un archivo. Veamos algunos ejemplos: Mostrar un formulario para seleccionar un archivo Aquí hay un ejemplo de una función que regresa el nombre y ruta del archivo que seleccione un usuario a través del cuadro de diálogo Abrir archivo. El código se limita a regresar el nombre del archivo seleccionado, pero no realiza la lectura de este. 1 2 3 4 Function AbrirArchivo() ' Crear un objeto de tipo FileDialog. Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) 5 6 7 ' Titulo del formulario fd.Title = "Seleccione un archivo de texto" 8 9 10 11 12 13 14 ' Podemos agregar filtros para que solo muestre ciertas ' extensiones de archivos ' El metodo Add, recibe dos parametros: ' 1: Una descripcion ' 2: Un filtro, en este caso *.txt fd.Filters.Add "Archivos de texto", "*.txt" 15 16 17 18 19 20 ' Mostrar el cuadro de dialog. If fd.Show = True Then If fd.SelectedItems.Count > 0 Then Debug.Print fd.SelectedItems(1) ' Obtiene el archivo y ruta. Debug.Print Dir(fd.SelectedItems(1)) ' Solo el nombre del archivo. 21 https://excel.facilparami.com 73 Mensajes y cuadros de diálogo 22 23 24 25 26 ' Regresa el archivo con su ruta AbrirArchivo = fd.SelectedItems(1) End If End If End Function Mostrar un formulario para seleccionar una carpeta Con esta macro podemos pedir al usuario que seleccione una carpeta, luego podemos trabajar creando o leyendo archivos dentro de esa carpeta. Usamos la macro únicamente para que el usuario elija en que carpeta vamos a trabajar. 1 2 3 4 Function SeleccionarCarpeta() ' Crear un objeto de tipo FileDialog. Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDialogFolderPicker) 5 6 7 ' Titulo del formulario fd.Title = "Seleccione una carpeta" 8 9 10 11 12 ' Mostrar el cuadro de dialog. If fd.Show = True Then If fd.SelectedItems.Count > 0 Then Debug.Print fd.SelectedItems(1) ' Carpeta seleccionada. 13 14 15 16 17 18 ' Regresa el archivo con su ruta SeleccionarCarpeta = fd.SelectedItems(1) End If End If End Function Mostrar un formulario de tipo Guardar como… Si lo que necesitas es guardar un archivo, puedes solicitar a las personas, el nombre y ruta en donde desean guardar algún archivo utilizando esta macro: https://excel.facilparami.com 74 Mensajes y cuadros de diálogo 1 2 3 4 Function GuardarArchivo() ' Crear un objeto de tipo FileDialog. Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDialogSaveAs) 5 6 7 ' Titulo del formulario fd.Title = "Seleccione un archivo" 8 9 10 11 12 13 ' Mostrar el cuadro de dialog. If fd.Show = True Then If fd.SelectedItems.Count > 0 Then Debug.Print fd.SelectedItems(1) ' Obtiene el archivo y ruta. Debug.Print Dir(fd.SelectedItems(1)) ' Solo el nombre del archivo. 14 15 16 17 18 19 ' Regresa el archivo con su ruta GuardarArchivo = fd.SelectedItems(1) End If End If End Function Ejercicio Ahora necesitas practicar como comunicarte con los usuarios de tus macros. Crea una macro que solicite seleccionar una carpeta, si el usuario completa el proceso y selecciona una carpeta, debes mostrar la selección en la barra de estados. Si el usuario presiona el botón cancelar y no selecciona ninguna carpeta, debes mostrar un mensaje de error con el icono vbCritical e indicar que no selecciono alguna carpeta. https://excel.facilparami.com Crear formularios avanzados En este capítulo aprenderás a crear formularios; los formularios son ventanas en las que puedes utilizar cajas de textos, botones, listas desplegables, etc., con todo lo que necesitas para crear interfaces de usuario muy avanzadas. Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace: https://my.pcloud.com/publink/show?code=XZgSS4kZT0a9HhsI6bQOIk1dQwKvFQCQtCpy Introducción a userforms Este tema es bastante extenso y lleno de nuevos conceptos, es por eso que iré explicando todo mientras ponemos cada concepto en práctica. Vamos a desarrollar un formulario para el ingreso de productos, el cual tendrá estas características: 1. Usaremos los controles más comunes para capturar información 2. Vamos a validar que los datos se ingresen correctamente 3. Los datos capturados se usarán para llenar una hoja de Excel Al finalizar, el formulario se verá de esta manera: Vamos a crear un formulario como este 76 Crear formularios avanzados Tu primer formulario Para crear un formulario, debes hacer clic derecho sobre tu proyecto y seleccionar el menú Insertar > UserForm Crear un formulario Ahora ya tienes tu primer formulario, hay algunas cosas básicas que debes de saber: En los extremos del formulario verás unos pequeños cuadros, si acercas el puntero del mouse a ellos y haces clic, puedes arrastrarlos para cambiar el tamaño del formulario. También veras una pequeña ventana llamada Cuadro de Herramientas, en ella esta los controles que puedes usar en tus formularios, solo tienes que hacer clic sobre alguno de ellos para seleccionarlo y luego clic en la zona del formulario en donde deseas que aparezcan. Si no puedes ver el Cuadro de Herramientas, puedes hacerlo visible si seleccionas el menú Ver > Cuadro de Herramientas Y por último, pero no menos importante, se encuentran las propiedades del formulario o controles, desde aquí puedes configurar los formularios y controles para que se adapten a tus necesidades. https://excel.facilparami.com 77 Crear formularios avanzados Editar un formulario Vamos a hacer algunos cambios a este formulario, primero vamos darle un nombre, actualmente se llama UserForm1, pero es importante darle un nombre que podamos usar para identificarle fácilmente. Usualmente utilizamos un prefijo para indicar el tipo de objeto y un nombre nemotécnico, por ejemplo, frmProducto (frm nos recuerda que es un formulario y Producto nos recuerda que se usa para insertar un producto). Para cambiar el nombre, hacemos clic sobre el formulario (en caso de que no esté seleccionado previamente) y luego escribimos el nombre (frmProducto) al lado derecho de la propiedad Name https://excel.facilparami.com 78 Crear formularios avanzados Cambiar el nombre Ahora vamos a cambiar el título del formulario, actualmente dice “UserForm1” pero vamos a cambiarlo por “Productos”. Para hacer esto, seleccionamos el formulario y cambiamos la propiedad Caption, escribiendo “Productos”. https://excel.facilparami.com 79 Crear formularios avanzados Cambiar el titulo Como has visto, es muy sencillo adaptar el formulario por medio de sus propiedades, algunas propiedades son sencillas de comprender, por ejemplo, utilizando Font puedes modificar el tipo de letra que se usa. Intenta modificar algunas propiedades y observa cómo afectan al formulario, así podrás familiarizarte mucho mejor con todas estas opciones. Como utilizar botones de comando Los botones de comandos permiten ejecutar algún código cuando el usuario los presiona. En este ejemplo vamos a crear dos botones, uno para agregar los datos en la hoja de cálculo y otro para cerrar el formulario sin hacer nada. Ahora vamos a insertar los botones, para esto necesitamos el cuadro de herramientas, si no puedes verlo, debes activarlo en menú Ver > Cuadro de herramientas. https://excel.facilparami.com 80 Crear formularios avanzados Cuadro de herramientas Para agregar los botones, haces clic sobre el icono de “Botón de comando” para seleccionarlo y luego haces clic sobre el formulario, después debes usar esos pequeños cuadros blancos del botón de comando para cambiar su tamaño. Repite este proceso para crear un segundo botón. https://excel.facilparami.com 81 Crear formularios avanzados Agregar un botón Para mover un botón o cualquier otro control a la posición que deseemos, primero hay que seleccionarlo haciendo clic sobre él, luego hacemos clic sobre ese borde con muchos puntos y sin soltar el botón del mouse, lo arrastramos hasta donde necesitemos que se encuentre. https://excel.facilparami.com 82 Crear formularios avanzados Mover un botón De la misma forma en que cambiaste las propiedades del formulario, debes cambiar el nombre y el texto de los botones, utiliza esta tabla como referencia: boton1 boton2 Nombre (name) cmdAceptar cmdCancelar Texto (Caption) Aceptar Cancelar Como lo mencione antes, los botones se usan para ejecutar algún código. Aún no estamos listos para crear el código del botón Aceptar, pero podemos escribir el código para el botón Cancelar, para esto debes hacer doble clic sobre el botón Cancelar. Esto te llevará a la ventana de edición de código del formulario y al evento click de botón cmdCancelar, el código que escribas aquí se ejecutará cuando alguien haga clic sobre el botón cmdCancelar. Evento Click Vamos a hacer que el formulario se cierre cuando alguien hace clic sobre este botón, para eso debes completar el código de esta forma: https://excel.facilparami.com 83 Crear formularios avanzados 1 2 3 Private Sub cmdCancelar_Click() Me.Hide End Sub Existe un objeto predeterminado llamado Me, éste hace referencia al formulario, entonces en el código anterior usamos el método Hide del formulario para esconderlo (cerrarlo) cuando el usuario presione el botón Cancelar. Como ya tenemos un botón y algo de código, podemos probar el formulario, en este caso solo tenemos un formulario, pero en el caso de tener más de uno, podemos asegurarnos de que vamos a ejecutar el formulario correcto, regresando a la vista de diseño del formulario, para hacer eso solo hacemos doble clic sobre el nombre del formulario en la ventana de proyecto y para ejecutarlo, presiona el botón Ejecutar o presiona la tecla F5 Ejecutar un formulario Ahora verás el formulario en acción, para cerrarlo solo debes hacer clic sobre el botón cancelar y si se cierra es por qué has hecho todo bien hasta ahora. Como utilizar etiquetas Las etiquetas son esos textos que se encuentra la izquierda de los campos de texto, estas ayudan a que las personas tengan claridad de que información se les está solicitando. Para insertar una etiqueta haces clic sobre el icono con una letra A, en el cuadro de herramientas, y luego haces clic en el formulario. https://excel.facilparami.com 84 Crear formularios avanzados Agregar una etiqueta Ahora debes ajustar el nombre y el texto, esto se hace cambiando las propiedades name y caption respectivamente, tal y como se ve en esta imagen. El prefijo lbl en el nombre, es por label (etiqueta en inglés) https://excel.facilparami.com 85 Crear formularios avanzados Propiedades de la etiqueta Repite el proceso anterior para crear 3 etiquetas adicionales y cambias sus propiedades para que tengan estos valores Nombre lblNombre lblCantidad lblUnidad Texto Nombre Cantidad Unidad Como utilizar cuadros de texto Los cuadros de texto se utilizan para agregar información, de esta forma puedes solicitar al usuario que ingrese un dato y luego trabajar con ese dato. Para agregar un cuadro de texto, haces clic sobre el icono que se muestra en la siguiente imagen, y luego haces clic sobre el formulario. https://excel.facilparami.com 86 Crear formularios avanzados Agregar un cuadro de texto En este caso, solo debemos cambiar el nombre del control, vamos a colocarle txtCodigo, txt es por Texto y Codigo es para recordarnos que contiene el código del producto. Propiedades del cuadro de texto Ahora debes agregar dos cuadros de texto adicionales con estos nombres: txtNombre y txtCantidad https://excel.facilparami.com 87 Crear formularios avanzados Como utilizar botones de radio Los botones de radio se utilizan para solicitar al usuario que seleccione una sola opción de entre una cantidad pequeña de opciones, por ejemplo, si deseas conocer el género de la persona, puedes crear dos botones de radio, uno para masculino y otro para femenino. En este caso lo vamos a utilizar para preguntar si el producto se encuentra activo o inactivo. Debido a que un formulario puede tener más de un grupo de botones de radio, para información o preguntas diferentes, entonces es necesario poder agruparlos. Para agruparlos usamos un control especial llamado marco. Para agregar un marco hacemos clic sobre este icono y luego hacemos clic sobre el formulario. Agregar un marco Ahora vamos a cambiar dos de sus propiedades: Nombre (Name) y Texto (Caption), tal y como lo vemos en esta imagen y también vamos a hacerlo un poco más grande para que quepan dos botones de radio. https://excel.facilparami.com 88 Crear formularios avanzados Propiedades del marco Ahora vamos a agregar dos botones de radio sobre este marco para esto seleccionamos el icono que vemos en la figura de abajo, y luego hacemos clic dentro del marco que creamos anteriormente. Es importante que agreguemos el botón de radio dentro del marco, ya que de esta forma VBA va a saber que todos los botones de radio dentro del marco, pertenecen a un mismo grupo. Agregar un botón de radio Repetimos el paso anterior para tener dos botones de radio y cambiamos sus propiedades de acuerdo a la siguiente tabla: https://excel.facilparami.com 89 Crear formularios avanzados Nombre (Name) optActivo optInactivo Texto (Caption) Activo Inactivo Al final tendrás algo como esto: Ejemplo de botones de radio Si ejecutas el formulario en este momento (presionando la tecla F5), podrás observar que cuando seleccionas un botón de radio, el otro se desmarca, de forma que solamente uno puede estar seleccionado. Como utilizar casillas de selección o checkbox Las casillas de selección o checkbox se usan para preguntar algo cuya respuesta es Si o No. En nuestro caso, haremos uso de ellas para preguntar si el producto permite realizar descuentos. Para agregar la casilla de selección debes marcar el icono que se muestra en la imagen y luego hacer clic sobre el formulario. Agregar una casilla de selección Luego lo acomodas en la posición que desees y cambias su nombre y texto, como se muestra en esta imagen: https://excel.facilparami.com 90 Crear formularios avanzados Opciones para la casilla de selección Como utilizar listas de selección Las listas de selección (también conocida como Combo Box en inglés) se utilizan para seleccionar una opción de entre muchas otras opciones. En este ejemplo vamos a utilizarla para seleccionar la unidad de medida del producto, la cual podría ser: Cajas, Unidad, Docenas, Litros, etc. Para crear una lista de selección, haz clic en el icono Cuadro Combinado y luego haces clic sobre el formulario Combo box o lista de selección https://excel.facilparami.com 91 Crear formularios avanzados Cuando agregues este control debes cambiar su nombre a cboUnidad, para poder ejecutar el código que vamos a escribir más adelante. Si has seguido todos los pasos, ya tienes todos los controles que necesitamos para hacer funcionar el formulario. Si aún no has ordenado todos los controles en su lugar y con su tamaño respectivo, aquí está de nuevo la imagen de cómo debe de lucir: Formulario Trabajando con eventos Cada vez que realizas una acción sobre un formulario, esta se procesa como un evento, por ejemplo, hacer clic sobre un botón, escribir sobre un cuadro de texto, seleccionar un botón de radio, etc. Estos eventos ejecutan un código o conjunto de instrucciones para responder a ese evento. Hasta ahora nuestro formulario se ve muy bien, pero no hace nada útil. Vamos a comenzar usando el evento Activate del formulario para llenar los valores de la lista de unidades, el evento activate se dispara cada vez que el formulario se “Activa” o se torna visible, usualmente porque lo llamas por primera vez o por que estabas en otra aplicación y regresas a tu macro. Para ingresar al evento, primero haces doble clic sobre cualquier parte del formulario para ingresar al código, luego verás dos listas en la parte superior, en la primera seleccionas UserForm, que es el formulario, y en la segunda lista seleccionas Activate, que es el evento Activate del formulario. https://excel.facilparami.com 92 Crear formularios avanzados Seleccionar un evento Ahora ingresas este código en el evento: 1 2 3 Me.cboUnidad.Clear Me.cboUnidad.AddItem ("Unidad") Me.cboUnidad.AddItem ("Caja 12 unidades") Como vamos a trabajar con la lista de opciones (combo box), primero escribimos Me que representa al formulario, luego escribimos un . y el nombre de la lista (cboUnidad), luego otro . y el método (o función) Clear, el cual borra todas las opciones que existan en la lista, hacemos esto para limpiar la lista de cualquier otro valor. Luego escribimos un código similar, pero ahora llamamos al método AddItem de la lista y entre paréntesis le enviamos los nombres de las opciones que necesitamos agregar. Si ejecutamos el formulario ahora, podremos ver que la lista ya tiene opciones para seleccionar. https://excel.facilparami.com 93 Crear formularios avanzados Al ejecutar el evento Algunas macros para nuestro formulario Ahora que ya tenemos nuestro formulario bien diseñado, vamos a la parte de crear el código. Primero vamos a crear una macro para llamar a este formulario y luego vamos a crear una función que inserte líneas en la hoja de cálculo. Entonces abrimos el editor de VBA y creamos una macro con este código: 1 2 3 4 Sub MostrarFormularioProducto() Dim f As New frmProducto f.Show End Sub En la primera línea declaramos una variable de tipo frmProducto, este es el nombre de nuestro formulario, también usamos la palabra New para inicializar la variable. Luego en la siguiente línea usamos el método show del formulario para mostrarlo. https://excel.facilparami.com 94 Crear formularios avanzados Como mostrar un formulario Ahora creamos la macro para insertar una línea de contenido en la hoja de cálculo, usando este código: 1 2 3 Sub InsertarProducto(codigo As String, nombre As String, Estado As String, Cantidad \ As String, unidad As String, Descuentos As String) Dim fila As Long 4 5 6 7 8 9 'Buscar ultima linea vacia. fila = 2 While Sheets("Lista de productos").Range("A" & fila).Value <> "" fila = fila + 1 Wend 10 11 12 13 14 15 16 17 Sheets("Lista Sheets("Lista Sheets("Lista Sheets("Lista Sheets("Lista Sheets("Lista Sheets("Lista de de de de de de de productos").Range("A" productos").Range("B" productos").Range("C" productos").Range("D" productos").Range("E" productos").Range("F" productos").Range("G" & & & & & & & fila).Value fila).Value fila).Value fila).Value fila).Value fila).Value fila).Value = = = = = = = codigo nombre Estado Cantidad unidad Now() Descuentos 18 19 End Sub Para este momento el código anterior debe ser bastante familiar para ti, pero hay algunas partes que aún debo explicar. Primero declaro una variable llamada fila, para encontrar y guardar el número de la primera fila vacía que encuentre, debido a que la primera fila contiene el encabezado, entonces inicio buscando desde la fila número 2. https://excel.facilparami.com 95 Crear formularios avanzados Utilizo un ciclo While para recorrer la hoja de cálculo, porque no sé cuántas filas debo revisar hasta encontrar una celda vacía. Cuando encuentro una celda vacía, entonces el ciclo termina y ya tengo mi primera fila vacía. Luego comienzo a llenar cada celda de esa fila, con los valores que recibí como parámetro. La columna F contiene la fecha de creación, esta fecha no se recibe como parámetro, así que se toma la fecha del sistema, usando la función Now(). Como leer la información de un formulario Ahora que tenemos la función para agregar filas a la hoja de cálculo, vamos a leer la información del formulario e ingresarla en la hoja de Excel. Primero abrimos el formulario y hacemos doble clic sobre el botón aceptar para ingresar este código. 1 2 Dim Estado As String Dim Descuentos As String 3 4 5 6 7 8 If obActivo.Value Then Estado = "Activo" Else Estado = "Inactivo" End If 9 10 11 12 13 14 If ckDescuentos.Value Then Descuentos = "Si" Else Descuentos = "No" End If 15 16 17 InsertarProducto txtCodigo.Value, txtNombre.Value, Estado, txtCantidad.Value, cbUnid\ ad.Value, Descuentos 18 19 Me.Hide Primero declaro dos variables para poder leer los valores de los botones de radio y de las casillas de selección. En general para leer el valor de un control, usamos la propiedad Value de cada control. Por ejemplo, txtCodigo.Value me regresa el código del producto. Pero en el caso de los botones de radio y las casillas de selección, esa propiedad va a regresar un valor True si está marcada y False si no lo está. Por eso usamos un bloque IF para darle sentido y luego almaceno su interpretación en una variable. Finalmente, en las últimas dos líneas del código, se llama a la función InsertarProducto para agregar la fila y luego se usa el método Hide para cerrar el formulario. https://excel.facilparami.com 96 Crear formularios avanzados Hasta ahora el código de tu formulario debe verse igual a esta imagen: Código del formulario Y la buena noticia es que ya tienes un formulario completamente funcional. Puedes ejecutar la macro que creamos MostrarFormularioProducto para llamar a tu formulario cuando lo necesites desde tu hoja de cálculo. Como agregar validaciones a tu formulario El formulario que has creado funciona muy bien, pero si alguien ingresa información con errores, entonces tu hoja de cálculo va a tener información sucia. Para evitar esto, debemos crear validaciones que no permitan ingresar datos equivocados. Para validar los datos, vamos a reemplazar el código del botón Aceptar, por este otro código: 1 2 3 Dim EsCorrecto As Boolean Dim Estado As String Dim Descuentos As String 4 5 EsCorrecto = True 6 7 8 9 10 If txtCodigo.Value = "" Then MsgBox "Debe ingresar un codigo" EsCorrecto = False End If https://excel.facilparami.com 97 Crear formularios avanzados 11 12 13 14 15 If txtNombre.Value = "" Then MsgBox "Debe ingresar un nombre" EsCorrecto = False End If 16 17 18 19 20 21 22 23 24 25 If txtCantidad.Value = "" Then MsgBox "Debe ingresar la cantidad" EsCorrecto = False Else If Not IsNumeric(txtCantidad.Value) Then MsgBox "La cantidad debe ser numerica" EsCorrecto = False End If End If 26 27 28 29 30 If cbUnidad.Value = "" Then MsgBox "Debe ingresar una unidad" EsCorrecto = False End If 31 32 33 34 35 36 If obActivo.Value Then Estado = "Activo" Else Estado = "Inactivo" End If 37 38 39 40 41 42 If ckDescuentos.Value Then Descuentos = "Si" Else Descuentos = "No" End If 43 44 45 46 47 48 If EsCorrecto Then InsertarProducto txtCodigo.Value, txtNombre.Value, Estado, txtCantidad.Value\ , cbUnidad.Value, Descuentos Me.Hide End If Básicamente usamos instrucciones IF para preguntar si el dato de cada control es correcto, y si no lo es, entonces mostramos un mensaje de error y hacemos que una variable llamada EsCorrecto, sea falsa. Finalmente preguntamos si el valor de la variable EsCorrecto es verdadero, si es así entonces llamamos a la función e ingresamos los datos en la hoja de cálculo. https://excel.facilparami.com 98 Crear formularios avanzados Ejercicio Imagina que alguien te pide que agregues el precio del producto, a esta hoja de cálculo. Observas detenidamente todo el desarrollo y miras que para hacer eso debes realizar estos cambios (y por supuestos los realizas) 1. Agregar una columna en la hoja de Excel, posiblemente la columna H 2. Agregar un cuadro de texto en el formulario 3. Modificar la función InsertarProducto para que tome el precio como parámetro y además lo inserte en la columna H 4. Modificar el código del botón aceptar para enviar este nuevo parámetro en la función InsertarProducto. https://excel.facilparami.com Uso de Workbooks En el capítulo 4 aprendimos sobre el modelo de objetos de Excel y que eran los Workbooks, en este capítulo vamos a profundizar un poco más en este tema, mientras vemos algunos ejemplos acerca de su utilización. Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace: https://my.pcloud.com/publink/show?code=XZ2SS4kZLjL4xaQXM6pPKajhuCLDCyK59tEX Crear un nuevo archivo de Excel Podemos crear y guardar un archivo de Excel usando el objeto Workbooks y sus métodos Add y SaveAs respectivamente. Vamos a crear un archivo que nos servirá para hacer los demás ejemplos, para hacerlo puedes utilizar una macro como esta: 1 2 3 Sub CrearArchivo() Dim NombreArhivo As String Dim Libro As Workbook 4 5 6 'Nombre del archivo NombreArhivo = "demo.xlsx" 7 8 9 'Crear un nuevo libro, usando metodo add Set Libro = Workbooks.Add() 10 11 12 13 14 'Guardar el libro con el nombre que digamos 'Si no definimos una ruta, se guarda 'en la carpeta en donde esta este archivo con macros Libro.SaveAs NombreArhivo 15 16 End Sub Cuando creamos un libro usando Workbooks.Add() podemos guardar una referencia al nuevo libro creado, al asignarlo en una variable de tipo Workbook y usando la palabra reservada Set. 100 Uso de Workbooks Abrir un archivo de Excel Para abrir un archivo de Excel podemos usar el método Open del objeto Workbooks, como parámetro obligatorio debemos pasar el nombre del archivo de Excel y su ruta completa, si omitimos la ruta, entonces Excel va a buscar el archivo en la misma carpeta en donde se encuentra. Un ejemplo de cómo hacerlo es mediante la macro que mostraré a continuación, solo debes de tener en cuenta de que debe haber un archivo llamado demo.xlsx en la misma carpeta. 1 2 3 Sub AbrirWorkbook() Workbooks.Open Filename:="demo.xlsx" End Sub Como puedes ver, al método Open le podemos pasar parámetros indicando el nombre del parámetro seguido de := y el valor del parámetro, que en este caso es el nombre del archivo. Si ejecutas el código anterior y el archivo no existe, entonces verás un error que quizá podría hacer pensar que la macro no funciona, cuando en realidad el problema es que el archivo no existe. Error al abrir archivo si no existe Podemos arreglar esto incluyendo una validación, como en este código: 1 2 Sub AbrirWorkbook2() Dim Archivo As String 3 4 Archivo = "demo.xlsx" 5 6 7 8 9 If Dir(Archivo) <> "" Then Workbooks.Open Filename:=Archivo Else MsgBox ("El archivo " & Archivo & " no existe") https://excel.facilparami.com 101 Uso de Workbooks 10 11 End If End Sub Como puedes ver ahora el nombre del archivo se encuentra en una variable, y usamos la función de VBA Dir para probar el nombre del archivo, si el resultado es diferente de una cadena vacía entonces abrimos el archivo, si no mostramos un error. La función Dir evalúa una cadena de texto en donde se encuentre el nombre o parte del nombre de un archivo y regresa el nombre del archivo que coincida con la búsqueda, por ejemplo, podrías usar un comodín como el * de esta forma: 1 Archivo = Dir("demo.x*") Si la función no encuentra ningún archivo entonces regresa una cadena vacía. Abrir un archivo de Excel indicado por el usuario El código anterior funciona muy bien, pero debes conocer el nombre archivo con el que vas a trabajar. En ocasiones debes permitir que el usuario busque el archivo que necesita, por ejemplo, si tu macro va a procesar los datos que se encuentra en un archivo de Excel. Vamos a necesitar una forma sencilla de pedir al usuario que nos de la ruta completa del archivo que necesita, en nuestro caso es mejor crear una función, de esta forma podemos reutilizar esta funcionalidad cuando lo necesitemos. Vamos a crear una función con este código: 1 2 3 4 Function AbrirArchivo() Dim Arch As Variant Arch = Application.GetOpenFilename(FileFilter:="Excel, *.xlsx", Title:="Archivos\ de Excel...") 5 6 7 8 9 If Arch <> False Then AbrirArchivo = Arch End If End Function Usaremos la función GetOpenFilename del objeto Application, primero le pasamos el parámetro FileFilter para mostrar solo archivos de Excel con extensión *.xlsx, luego le pasamos el parámetro Title para definir un título para la ventana que abrimos para solicitar el archivo. Como puedes observar usamos la variable Arch para obtener el resultado de la función y la hemos definido como Variant, este tipo de datos es un tipo que puede cambiar, por ejemplo, si la función GetOpenFilename se ejecuta y el usuario la cancela sin seleccionar un archivo, entonces regresa un valor False (Boolean) y si no regresa el nombre completo del archivo (String) Puedes modificar el filtro para buscar otro tipo de archivos, modificando la extensión en el filtro, por ejemplo, para mostrar solo archivos de texto puedes usar este código: https://excel.facilparami.com 102 Uso de Workbooks 1 Arch = Application.GetOpenFilename(FileFilter:="Texto, *.txt") La parte del filtro antes de la , es solo una descripción, lo que hace que el filtro funcione es lo que va después, en este caso *.txt Ahora veamos cómo debe de quedar la macro completa 1 2 3 4 Function AbrirArchivo() Dim Arch As Variant Arch = Application.GetOpenFilename(filefilter:="Excel, *.xlsx", Title:="Archivos\ de Excel...") 5 6 7 8 9 If Arch <> False Then AbrirArchivo = Arch End If End Function 10 11 12 13 Sub AbrirWorkbook3() Dim Archivo As String 14 15 Archivo = AbrirArchivo() 16 17 18 19 20 21 22 If Dir(Archivo) <> "" Then Workbooks.Open Filename:=Archivo Else MsgBox ("El archivo " & Archivo & " no existe") End If End Sub Verificar si un archivo está abierto Antes de intentar trabajar con un archivo, es una buena práctica, verificar si el archivo ya está abierto, de otra forma podríamos obtener un error. Por ejemplo si necesitamos obtener datos de un archivo, podemos verificar si ya lo abrimos, antes de intentar leerlo. El objeto Application.Workbooks contiene una referencia a todos los libros o archivos abiertos en Excel, podemos recorrerlos todos y verificar si ya está abierto el que necesitamos. Vamos a utilizar el ciclo For Each, este ciclo va a recorrer todos los elementos que se encuentren en un conjunto de datos. En el código siguiente, el ciclo For Each va a recorrer el contenido en Application.Workbooks y guardará temporalmente cada elemento en la variable libro para que podamos evaluar su contenido. https://excel.facilparami.com 103 Uso de Workbooks 1 2 Function LibroAbierto(NombreLibro) As Boolean Dim libro As Workbook 3 4 5 'Remover la ruta y dejar solo el nombre del archivo NombreLibro = Dir(NombreLibro) 6 7 8 9 10 11 12 13 14 15 16 'Inicializamos a falso mientras no comprobar que existe LibroAbierto = False For Each libro In Application.Workbooks If libro.Name = NombreLibro Then LibroAbierto = True 'Salimos, ya no hay necesidad de seguir buscando Exit For End If Next End Function La función anterior regresa True si el archivo se encuentra abierto, vamos a modificar la macro para abrir un libro, de modo que verifique si el libro ya se encuentra abierto, antes de intentar abrirlo nuevamente. El código completo quedará de esta forma: 1 2 Function LibroAbierto(NombreLibro) As Boolean Dim libro As Workbook 3 4 5 'Remover la ruta y dejar solo el nombre del archivo NombreLibro = Dir(NombreLibro) 6 7 8 9 10 11 12 13 14 15 16 'Inicializamos a falso mientras no comprobar que existe LibroAbierto = False For Each libro In Application.Workbooks If libro.Name = NombreLibro Then LibroAbierto = True 'Salimos, ya no hay necesidad de seguir buscando Exit For End If Next End Function 17 18 19 Sub AbrirWorkbook4() Dim Archivo As String 20 21 Archivo = AbrirArchivo() 22 https://excel.facilparami.com 104 Uso de Workbooks 23 24 25 26 27 28 29 30 31 32 If Dir(Archivo) <> "" Then 'Revisar si ya esta abierto... If LibroAbierto(Archivo) Then MsgBox "El archivo ya esta abierto" Else Workbooks.Open Filename:=Archivo End If Else MsgBox ("El archivo " & Archivo & " no existe") End If 33 34 End Sub Cerrar un archivo de Excel Una vez, terminemos de trabajar con un archivo, podemos cerrarlo. Como vimos anteriormente en el objeto Workbooks se encuentra una referencia a todos los libros abiertos, entonces, podemos usar su método Close para cerrar cualquier libro que necesitemos. Esta es una función que permite cerrar el libro que le enviemos como parámetro, antes de intentar cerrarlo vamos a utilizar la función que creamos anteriormente para verificar que el libro está abierto, antes de intentar cerrarlo. 1 2 3 Sub CerrarLibro(libro As String) 'Remover la ruta libro = Dir(libro) 4 5 6 7 8 9 'Verificar si el libro esta abierto antes de intentar cerrarlo If LibroAbierto(libro) Then Workbooks(libro).Close End If End Sub Vamos a modificar la macro de abrir un libro para que luego de procesar todo, cierre el libro que abre. El código completo es este: https://excel.facilparami.com 105 Uso de Workbooks 1 2 3 Sub CerrarLibro(libro As String) 'Remover la ruta libro = Dir(libro) 4 5 6 7 8 9 'Verificar si el libro esta abierto antes de intentar cerrarlo If LibroAbierto(libro) Then Workbooks(libro).Close End If End Sub 10 11 12 Sub AbrirCerrarWorkbook() Dim Archivo As String 13 14 Archivo = AbrirArchivo() 15 16 17 18 19 20 21 22 If Dir(Archivo) <> "" Then 'Revisar si ya esta abierto... If LibroAbierto(Archivo) Then MsgBox "El archivo ya esta abierto" Else Workbooks.Open Filename:=Archivo End If 23 24 25 26 27 CerrarLibro (Archivo) Else MsgBox ("El archivo " & Archivo & " no existe") End If 28 29 End Sub Borrar un archivo Para borrar permanentemente un archivo podemos utilizar la función Kill de VBA, esta función recibe como parámetro el nombre del archivo que necesitamos eliminar, si no especificamos la ruta completa (carpetas), entonces buscara el archivo en la carpeta en donde está el archivo con la macro que estamos ejecutando. https://excel.facilparami.com 106 Uso de Workbooks 1 Sub BorrarArchivo() 2 3 4 Kill ("demo.xlsx") End Sub Guardar un archivo de Excel Para guardar un archivo puedes usar cualquiera de los métodos Save o SaveAs del objeto Workbook. Ya hemos usado este método, pero ahora vamos a explorar otras opciones o parámetros que puedes utilizar. El método Save no tiene ningún parámetro, simplemente guardar el libro en el formato actual, ubicación actual, etc. Pero el método SaveAs tiene los siguientes parámetros: Parámetro FileName FileFormat Password WriteResPassword ReadOnlyRecommended CreateBackup Descripción Nombre completo del archivo incluyendo la ruta completa. Si no incluyes la ruta, Excel toma como referencia la carpeta actual. Es una constate para indicar el tipo de archivo que necesitamos usar para grabar la hoja de cálculo, por ejemplo, xlsm, xlsx, txt, etc. Para una lista completa, puedes consultar esta dirección https://docs.microsoft.com/enus/office/vba/api/excel.xlfileformat Puedes enviar aquí una clave de hasta 15 caracteres para proteger el archivo con contraseña. Puedes indicar una clave para poder abrir el archivo en modo de escritura, si la persona no tiene la clave, puede optar por abrirlo en modo de solo lectura. Si enviamos True, se mostrará un mensaje de que el archivo debería abrirse en modo de solo lectura. Si enviamos True, Excel creara una copia de respaldo. Existen otras opciones, y los más probable es que nunca las uses en toda tu vida, sin embargo, si aún sientes curiosidad puedes consultarlas en este enlace: https://docs.microsoft.com/en-us/office/vba/api/excel.workbook.saveas Cuando utilizamos estas opciones, lo más recomendable es usar sus nombres, por ejemplo, para guardar el archivo usando una clave podemos usar este código: 1 2 3 Sub GuardarConClave() ThisWorkbook.SaveAs Password:="MiClave" End Sub Hay que tener en cuenta, que no hemos especificado el nombre, entonces Excel va a guardar una https://excel.facilparami.com 107 Uso de Workbooks copia de este archivo, usando el mismo nombre, pero en la carpeta predefinida de Excel o en la carpeta de trabajo, lo más probables es que lo cree en la carpeta Documentos. Ejercicio Ahora que ya sabes trabajar con el objeto Workbook, intenta crear una macro que guarde una copia de cada archivo abierto, pero protegido con una contraseña para poder abrirlo en modo de escritura (usa la opción WriteResPassword) https://excel.facilparami.com Uso de WorkSheets En este capítulo vamos a aprender a trabajar con Hojas de Excel, como ya sabemos cada Libro de Excel está compuesto de Hojas y ahora veremos varios ejemplos como agregar, borrar, imprimir, proteger hojas, etc. Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace: https://my.pcloud.com/publink/show?code=XZRSS4kZFWYWuP7SIh03y8uk8CKVCuy7zmby Agregar hojas a un archivo de Excel Para agregar hojas en un libro, puedes usar el método Add de algún objeto Sheets. Este método puede tomar alguno de estos parámetros, los cuales son todos opcionales: Parámetro Before After Count Type Descripción Un objeto de tipo Sheet, que indica que deseas agregar la nueva hoja, antes de esta hoja. Un objeto de tipo Sheet, que indica que deseas agregar la nueva hoja, después de esta hoja. El número de hojas que deseas agregar, si omites este parámetro, se agrega una hoja. Indica el tipo de hoja que deseas agregar, por ejemplo, una hoja normal, un gráfico, etc. Para ver una lista completa, puedes consultar esta dirección: https://docs.microsoft.com/en-us/office/vba/api/excel.xlsheettype Si no definimos ninguno de los parámetros Before o After, la nueva hoja se agrega antes de la hoja activa. Veamos un ejemplo de cómo agregar una hoja al final de todas: 1 2 3 4 Sub AgregarHoja() ActiveWorkbook.Sheets.Add After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksh\ eets.Count) End Sub Para poder decirle a Excel que necesitamos agregar una hoja al final de todas, debemos usar el parámetro After. Como mencione en la tabla anterior, debemos incluir una referencia a la hoja en los parámetros After y Before. Usando ActiveWorkbook.Worksheets() podemos hacer referencia a una de las hojas en el libro actual, pero necesitamos el nombre o la posición (de 1 hasta el número de hojas) para hacer 109 Uso de WorkSheets referencia a una hoja en específico y ya que necesitamos la última hoja, entonces podemos usar ActiveWorkbook.Worksheets.Count para saber cuál es la última hoja. Ahora, veamos un ejemplo más, imagina que además de definir una hoja, necesitas realizar algún cambio sobre ella, como escribir algo sobre sus celdas o cambiar su nombre. En ese caso necesitas capturar una referencia a la nueva hoja y luego trabajar usando sus propiedades y métodos. Aquí hay un ejemplo sencillo: 1 2 3 Sub AgregarHoja2() 'Definir una variable de tipo Worksheet Dim hoja As Worksheet 4 5 6 'Capturar una referencia a la nueva hoja Set hoja = ActiveWorkbook.Sheets.Add() 7 8 9 10 'Cambiar el nombre de la hoja hoja.Name = "Hoja con nombre" End Sub Debes de tener en cuenta que cuando vas a capturar una referencia de la hoja que agregas, debes llamar al método Add usando paréntesis al final, si no vas a capturar una referencia, entonces no debes usar los paréntesis. Borrar una hoja de un archivo de Excel Puedes eliminar cualquier hoja en un libro de Excel siempre y cuando el libro no esté protegido contra cambios o se encuentre en modo de solo lectura, tampoco puedes borrar una hoja si ya no hay otras hojas (No puedes dejar un libro de Excel, sin ninguna hoja). Para borrar una hoja puedes usar el método Delete del objeto Sheets. Cada hoja puede ser referenciada por su nombre o por su número de índice (un número desde 1 hasta la cantidad de hojas que existan), a continuación, hay un ejemplo para borrar la hoja llamada “Hoja con nombre” del libro activo. 1 2 3 Sub BorrarHoja() ActiveWorkbook.Sheets("Hoja con nombre").Delete End Sub Mover una hoja de un archivo de Excel Puedes cambiar de posición una hoja dentro de un libro, al utilizar el método Move del objeto Sheets. Este método recibe 2 parámetros opcionales: Before y After para indicar que lo quieres mover antes https://excel.facilparami.com 110 Uso de WorkSheets o después de alguna hoja en específico, si omites ambos parámetros, entonces Excel creara un nuevo libro y moverá la hoja a dicho libro. Aquí hay un ejemplo para mover la hoja actual hasta la primera posición. ActiveSheet hace referencia al objeto de la hoja activa, podemos usarla con el método Move y para hacer referencia a la que ya es la primera hoja, vamos a usar el índice 1 de la colección de objetos Sheets del libro activo. 1 2 3 Sub MoverHoja() ActiveSheet.Move Before:=ActiveWorkbook.Sheets(1) End Sub Copiar y pegar hojas de Excel Para copiar y pegar hojas de Excel en un libro, puedes usar el método Copy del objeto Sheets. Al igual que el método Move, este método tiene 2 parámetros opcionales Before y After, si omitimos ambos parámetros entonces Excel crea un nuevo libro con la hoja que estamos copiando. Aquí hay un ejemplo para copiar una hoja y colocarla justo después de la hoja que copiamos. 1 2 3 Sub CopiarHoja() ActiveSheet.Copy After:=ActiveSheet End Sub Ocultar una hoja de Excel Puedes ocultar una hoja cambiando a False, la propiedad Visible de cualquier objeto Sheets. Esto puede ser muy útil para ocultar hojas con datos de configuración para tus macros y que no desees que las personas vean. No debes usar esto para intentar proteger hojas, ya que cualquier persona puede volver a colocarla como visible muy fácilmente. Puedes ocultar la hoja activa con este código: 1 2 3 Sub OcultarHoja() ActiveSheet.Visible = False End Sub Una vez oculta, puedes volver a mostrar la hoja haciendo clic derecho sobre cualquiera de las hojas visibles y luego seleccionando del menú, la opción Mostrar... https://excel.facilparami.com 111 Uso de WorkSheets Mostrar hojas ocultas Luego verás una lista de las hojas ocultas, entonces solo seleccionas una de la lista y presionas el botón Aceptar. Lista de hojas ocultas Si no quieres que las personas puedan hacer visibles las hojas ocultas muy fácilmente, puedes elegir la opción Muy Oculta, así, la única forma de hacer visible la hoja, será haciendo uso de VBA o el editor de VBA. https://excel.facilparami.com 112 Uso de WorkSheets Puedes hacer esto con una macro como esta y utilizando la constante predefinida xlSheetVeryHidden. 1 2 3 Sub OcultarHoja2() ActiveSheet.Visible = xlSheetVeryHidden End Sub Cambiar el nombre de una hoja de Excel Puedes cambiar el nombre de una hoja de Excel, cambiando la propiedad Name del objeto Sheets. Aquí hay un ejemplo, en el que abrimos una ventana para solicitar un nombre, luego asignamos ese nombre a la hoja activa. 1 2 Sub NombreHoja() Dim nombre As String 3 4 5 6 nombre = InputBox("Ingrese el nuevo nombre para esta hoja") ActiveSheet.Name = nombre End Sub Proteger un archivo de Excel con contraseña Si deseas restringir el acceso a una o más hojas de un libro, puedes proteger estas hojas y seleccionar de entre un grupo de opciones, que pueden hacer y que no pueden. Para esto puedes usar el método Protect del objeto Sheets. El método Protect tiene muchos parámetros y todos son opcionales. El parámetro Password es la clave que deseas colocar y todos los demás parámetros esperan un valor True para ser activados o un valor False para ser desactivados, aquí hay una lista de cada uno de ellos: Parámetro Password DrawingObjects Contents Scenarios Descripción Es la clave que deseas colocar para la hoja, si la omites las personas podrán desproteger la hoja sin escribir ninguna clave. Es importante saber que, si pierdes esta clave, no hay forma de poder recuperarla. True para proteger las formas. El valor predeterminado es True. True para proteger el contenido. En un gráfico, protege todo el gráfico. En una hoja de cálculo, protege las celdas bloqueadas. El valor predeterminado es True. True para proteger los escenarios. Este argumento solo es válido para las hojas de cálculo. El valor predeterminado es True. https://excel.facilparami.com 113 Uso de WorkSheets Parámetro UserInterfaceOnly AllowFormattingCells AllowFormattingColumns AllowFormattingRows AllowInsertingColumns AllowInsertingRows AllowInsertingHyperlinks AllowDeletingColumns AllowDeletingRows AllowSorting AllowFiltering AllowUsingPivotTables Descripción True para proteger la interfaz de usuario, pero no las macros. Si omite este argumento, la protección se aplica tanto a las macros como a la interfaz de usuario. True permite al usuario dar formato a cualquier celda de una hoja de cálculo protegida. El valor predeterminado es False. True permite al usuario dar formato a cualquier columna de una hoja de cálculo protegida. El valor predeterminado es False. True permite al usuario dar formato a cualquier fila de una hoja de cálculo protegida. El valor predeterminado es False. True permite al usuario insertar columnas en la hoja de cálculo protegida. El valor predeterminado es False. True permite al usuario insertar filas en la hoja de cálculo protegida. El valor predeterminado es False. True permite al usuario insertar hipervínculos en la hoja de cálculo protegida. El valor predeterminado es False. True permite al usuario eliminar columnas en la hoja de cálculo protegida, donde todas las celdas de la columna que se va a eliminar se desbloquearán. El valor predeterminado es False. True permite al usuario eliminar filas en la hoja de cálculo protegida, donde todas las celdas de la fila que se va a eliminar se desbloquearán. El valor predeterminado es False. True permite al usuario ordenar la hoja de cálculo protegida. Se deben desbloquear o desproteger todas las celdas del rango de ordenación. El valor predeterminado es False. True permite al usuario establecer filtros en la hoja de cálculo protegida. Los usuarios pueden cambiar los criterios del filtro, pero no puede habilitar o deshabilitar un filtro automático. Los usuarios pueden establecer filtros en un filtro automático existente. El valor predeterminado es False. True permite al usuario usar informes de tabla dinámica en la hoja de cálculo protegida. El valor predeterminado es False. Existe una gran cantidad de parámetros, pero para la mayoría de los casos posiblemente solo vas a necesitar el parámetro Password y dejar todas las demás opciones con sus valores predeterminados. Aquí hay una macro como ejemplo: https://excel.facilparami.com 114 Uso de WorkSheets 1 2 3 Sub ProtegerHoja() ActiveSheet.Protect Password:="123" End Sub Si ejecutas la macro y luego intentas modificar la hoja, verás un mensaje de error como este: Error al escribir en celdas protegidas También puedes eliminar la protección de la hoja usando el método Unprotect, aquí hay una macro de ejemplo: 1 2 3 Sub DesprotegerHoja() ActiveSheet.Unprotect Password:="123" End Sub Imprimir una hoja de Excel Puedes utilizar el método PrintOut para imprimir las hojas que desees. Al ejecutar este método puedes utilizar estos parámetros: Parámetro From To Copies Preview ActivePrinter PrintToFile Collate PrToFileName IgnorePrintAreas Descripción Número de la página en la que comienza la impresión. Si no se especifica este argumento, la impresión empieza por el principio. Número de la última página que se va a imprimir. Si no se especifica este argumento, la impresión finaliza en la última página. Número de copias que se imprimirán. Si no se especifica este argumento, se imprime una sola copia. True para que Microsoft Excel invoque la vista preliminar antes de imprimir el objeto. False (u omitido) para imprimir el objeto inmediatamente. Establece el nombre de la impresora activa. True para imprimir a un archivo. Si no se especifica PrToFileName , Excel solicita al usuario que escriba el nombre del archivo de salida. True para intercalar varias copias. Si PrintToFile se establece en true, este argumento especifica el nombre del archivo en el que desea imprimir. True para omitir las áreas de impresión e imprimir todo el objeto. https://excel.facilparami.com 115 Uso de WorkSheets Aquí hay un ejemplo de cómo imprimir la hoja actual mostrando la vista previa: 1 2 3 Sub ImprimirHoja() ActiveSheet.PrintOut Preview:=True End Sub Para poder ejecutar esta macro sin problemas, la hoja activa debe de tener algún contenido. Si la hoja está vacía, entonces Excel simplemente no hace nada. Ejercicio Para practicar un poco lo que has visto en este capítulo, intenta crear un macro que recorra todas las hojas del libro activo (ActiveWorkbook) y oculte todas las hojas excepto la primera. https://excel.facilparami.com Trabajando con Rangos Ahora vamos a trabajar con rangos, un rango es un conjunto de celdas que bien pueden ser columnas, filas, cualquier grupo de celdas o incluso una sola celda. Puedes descargar las macros que veremos en este capítulo haciendo clic en este enlace: https://my.pcloud.com/publink/show?code=XZJSS4kZJ85FEedg0qF8QXXloPVSkmO1I1ay Usando Rangos Para trabajar con rangos podemos usar el objeto Range, recordemos que este es un conjunto de celdas, entonces al usarlo, también tenemos que decir con cual celda vamos a trabajar, por ejemplo Range("A1:A3"). Select selecciona las celdas A1 a la A3. Selección de rango de celdas Usar Range, también equivale a usar Application.Range o ActiveSheet.Range , ya que asume que estás trabajando con la hoja activa. Si deseas trabajar con otra hoja u otro libro entonces debes especificarlo, por ejemplo, con un código como este: 117 Trabajando con Rangos 1 2 3 4 5 Sub SeleccionarCelda2() 'Hacer visible la hoja2 antes de seleccionar sus celdas ActiveWorkbook.Sheets("Hoja2").Select ActiveWorkbook.Sheets("Hoja2").Range("A1:A3").Select End Sub En el código anterior, primero seleccionamos la Hoja2, con esto hacemos que la Hoja2 se convierta en la hoja activa y este visible, si no hacemos esto, entonces no podríamos seleccionar ninguna de sus celdas por que la macro mostraría un error. Al usar rangos, puedes consultar y modificar cualquier cosa que esté relacionada a las celdas en el rango, como cambiar su formato o su contenido. Por ejemplo, veamos esta macro que cambia el formato de un rango de celdas a numérico con dos decimales separados por un punto: 1 2 3 Sub ModificarFormatoCelda() 'Formato de numero con dos decimales Range("A1:A3").NumberFormat = "0.00" 4 5 End Sub Recorrer todos los valores de un rango Ya que un rango es un conjunto de celdas, podemos utilizar un ciclo for each para poder recorrer cada una de ellas, esto es muy útil cuando necesitamos realizar alguna operación sobre las celdas en un rango. Existe un rango especial llamado Selection, el cual representa todas las celdas que esta seleccionadas en Excel, por ejemplo, estas 8 celdas seleccionadas, están contenidas en el objeto Selection https://excel.facilparami.com 118 Trabajando con Rangos rango-inicial Ahora veamos una macro que recorre todas las celdas seleccionadas y muestra su contenido en un mensaje usando la función MsgBox 1 2 3 4 5 Sub RecorrerRango() Dim celda As Range For Each celda In Selection MsgBox celda.FormulaR1C1 Next 6 7 End Sub En el código anterior, primero declaramos una variable llamada celda, luego en el ciclo for each pedimos que se recorra cada elemento del objeto Selection y se coloque su contenido en la variable celda, luego usamos la propiedad FormulaR1C1 de acceder al contenido de la celda. Combinar múltiples rangos Se puede ahorrar tiempo al trabajar con diferentes rangos con una sola instrucción; para esto debemos combinar los rangos haciendo uso de la función Union. https://excel.facilparami.com 119 Trabajando con Rangos La función Union recibe como parámetros 1 o hasta 30 rangos y los combina en uno solo. Veamos este ejemplo, en donde se definen 3 rangos y luego se unen en uno solo, para después cambiar su color de fondo a amarillo. 1 2 3 4 5 Sub UnirRangos() Dim Rango1 As Dim Rango2 As Dim Rango3 As Dim MisRangos Range Range Range As Range 6 7 8 9 Set Rango1 = Range("A:A") 'Seleccionar toda la columna A Set Rango2 = Range("C:C") Set Rango3 = Range("E:E") 10 11 12 'Unir los 3 rangos Set MisRangos = Union(Rango1, Rango2, Rango3) 13 14 15 16 'Cambiar el color de fondo MisRangos.Interior.Color = RGB(255, 255, 0) End Sub El resultado será algo como esto: https://excel.facilparami.com 120 Trabajando con Rangos Unir rangos Como puedes ver en el código anterior usamos la instrucción Let para asignar el valor a las variables por que se declararon como tipo Range el cual es un objeto. Cuando trabajes con tipos de datos de objetos debes usar siempre la palabra Let al asignarles un valor. Otra parte que puede ser confusa, es la forma en que le asignamos un color, en lugar de un código como Color = Amarillo, usamos Color = RGB(255, 255, 0). RGB es una función de VBA que permite definir un color como las mezclas de rojo, verde y azul, la intensidad de cada color se representa como un numero de 0 (ausencia del color) a 255 (color puro). Pero no necesitas dominar los colores en RGB, puedes usar páginas como https://www.w3schools.com/colors/colors_picker.asp en donde puedes generar códigos RGB de forma gráfica. https://excel.facilparami.com 121 Trabajando con Rangos Colores RGB Uso de Offset Al utilizar el método offset podemos definir un rango basado en el desplazamiento de otro rango. Aunque offset puede funcionar con rangos, es más usada cuando trabajamos con una sola celda, por ejemplo, si ya tienes la referencia de una celda y deseas ingresar algún dato en la celda que esta a la derecha, entonces solo te desplazas una columna a la derecha. Esto puede parecer un poco confuso al inicio así que vamos a ver algunos ejemplos y con eso lo comprenderás sin problemas. La función offset utiliza estos parámetros Parámetro RowOffset Descripción Número de filas que debe desplazarse, un número positivo indica que debe desplazarse hacia abajo, y un número negativo indica que debe desplazarse hacia arriba. https://excel.facilparami.com 122 Trabajando con Rangos Parámetro ColumnOffset Descripción Número de columnas que debe desplazarse, un número positivo indica que debe desplazarse hacia la derecha, y un número negativo indica que debe desplazarse hacia la izquierda. Ahora veamos un ejemplo, imagina que vas a escribir un valor monetario en la celda activa (ActiveCell) y en la celda que está a su derecha, debes escribir la moneda. El problema de hacer esto, es que no sabes cúal es la celda activa, podrías usar algo como Range("B2"), pero no puedes decir que vas a usar la celda B2 porque no sabes cúal es la celda activa. Existen formas de conseguir cual es la dirección de la celda activa, pero en casos como este, lo mejor es hacer referencia a una celda basada en otra celda. Veamos la solución más sencilla para este problema: 1 2 3 Sub EjemploOffset() 'Colocar un valor en la celda activa ActiveCell.Formula2R1C1 = 25.2 4 5 6 7 8 'Usamos offset para movernos cero filas 'y 1 columna a la derecha, luego escribimos un valor ActiveCell.Offset(0, 1).Formula2R1C1 = "$" End Sub Para tener una mejor idea de cómo usar offset, aquí hay grafico de cómo usarlo para seleccionar algunas celdas que están alrededor de una celda Ejemplos de Offset Ahora veamos cómo se comporta Offset al usarse con rangos, imagina que tienes seleccionadas las celdas A1:A3, que piensas que pasaría si ejecutas un código como este: https://excel.facilparami.com 123 Trabajando con Rangos 1 2 Sub EjemploOffsetRangos() Dim rango As Range 3 4 Set rango = Range("A1:A3") 5 6 7 rango.Offset(0, 1).Select End Sub El rango completo se desplaza una columna a la derecha y el resultado es que seleccionas las 3 primeras celdas de la columna B, en lugar de la columna A. Resultado del código anterior Borrar rangos Los rangos poseen un método llamado Delete, puedes usarlo para borrar un rango completo de celdas. De la misma forma en que sucede en Excel, cuando borras una o más celdas, Excel reorganiza las demás celdas para cubrir el espacio, por ejemplo, si borras la columna B, entonces mueve todas las columnas a la izquierda, y los datos de la columna C, pasan a la columna B. Aprovechando el ejemplo anterior, voy a introducir un nuevo rango predeterminado: Columns, con este objeto puedes hacer referencia a una columna completa, por medio de su índice, por ejemplo, la columna B es la segunda columna, entonces su índice es 2. Con este código puedes borrar la columna B, pero antes de probarla, asegúrate de agregar algunos datos en las columnas B y C, para que puedas apreciar el resultado. https://excel.facilparami.com 124 Trabajando con Rangos 1 2 3 Sub BorrarRango() Columns(2).Delete End Sub Ocultar rangos Ahora veremos cómo ocultar rangos. Una tarea habitual en Excel es ocultar filas o columnas que no usas o que tienen datos que no deseas que este visibles porque no son importantes. Para ocultar o mostrar una fila, podemos cambiar la propiedad Hidden a true para ocultar y a false para mostrar. Ahora voy a introducir el objeto Rows, este objeto puede hacer referencia a cualquier fila de la hoja de cálculo, por medio de su índice. Por ejemplo, el siguiente código oculta la fila 2, si necesitas volver a hacerla visible, recuerda que solo debes cambiar la propiedad Hidden de true a false. 1 2 3 Sub OcultarRango() Rows(2).Hidden = True End Sub Rangos con nombres Excel permite asignar nombres a celdas y rangos, los nombres son más fáciles de recordar e interpretar que las direcciones como “A23”. Si no has escuchado hablar sobre los nombres de rangos puedes leer este articulo breve: https://excel.facilparami.com/2012/06/trabajar-con-nombresde-celdas-y-o-rangos/ En VBA puedes usar la propiedad Name de un rango para asignarle un nombre, para explicar esto, vamos a crear dos macros: la primera va a asignar un nombre a una celda, en esta celda se encuentra el porcentaje de impuestos que debe pagar un producto. En la segunda macro vamos a completar una celda con el valor del impuesto para un producto. Macro para asignar el nombre a la celda B1, ésta contiene el porcentaje de impuestos: 1 2 3 Sub AsignarNombre() Range("B1").Name = "Impuesto" End Sub Ahora la macro para consultar este valor y hacer un cálculo usándolo: https://excel.facilparami.com 125 Trabajando con Rangos 1 2 Sub CalcularImpuesto() Dim Impuesto As Single 3 4 5 6 'Obtener el valor del impuesto, esta 'configurado en la celda Impuesto Impuesto = Range("Impuesto").Formula2R1C1 7 8 9 'Calcular el impuesto para un producto que vale 100 Range("A5").Formula2R1C1 = 100 * Impuesto 10 11 End Sub Modificar tamaño de rangos Se puede modificar el tamaño en filas y columnas de un rango, usando su método Resize, este método permite definir nuevamente la cantidad de filas y columnas que abarca. Por ejemplo, veamos este rango que inicia en la celda B1 y luego se extiende 4 filas hacia abajo y dos columnas a la derecha, hasta llegar a la celda C4. https://excel.facilparami.com 126 Trabajando con Rangos Rango de 4 filas y 2 columnas Entonces, si usamos el método Resize, indicando 10 filas y 2 columnas de esta forma: rango.Resize(10, 2) estamos diciendo que el rango debe modificarse y que a partir de la celda de referencia que siempre es la esquina superior izquierda, en este caso B1 debe contar 10 filas hacia abajo y 2 columnas a la derecha, dejando un rango como este: https://excel.facilparami.com 127 Trabajando con Rangos Rango final, luego de aplicar Resize El código de ejemplo es este: 1 2 Sub IncremetarRango() Dim rango As Range 3 4 Set rango = Range("B1:C4") 5 6 Set rango = rango.Resize(10, 2) 7 8 rango.Select 9 10 End Sub Como puedes ver, simplemente hemos definido nuevamente los límites del rango, pero también puedes lograr un código más genérico, como por ejemplo incrementar el rango en una fila más o una columna más. Para esto podemos usar las propiedades Rows.Count y Rows.Count del rango para https://excel.facilparami.com 128 Trabajando con Rangos conocer cuantas filas y columnas utiliza el rango y luego definir un incremento basado en esos números, por ejemplo, para incrementar el rango en 1 fila, podes usar este código: 1 2 Sub IncremetarFilaRango() Dim rango As Range 3 4 Set rango = Range("B1:C4") 5 6 Set rango = rango.Resize(rango.Rows.Count + 1, rango.Columns.Count) 7 8 rango.Select 9 10 End Sub Ejercicio Ahora que conoces los rangos y como realizar operaciones con ellos, crea una macro llamada Aplica20Descuento y que cambie el contenido de todas las celdas seccionadas al multiplicar su valor por 0.8, los valores de las celdas que seleccione la persona que llama la macro, deben ser numéricos. Puedes validar si una celda tiene un valor numérico , usando con un código como este: 1 2 3 If IsNumeric(celda.Formula2R1C1) Then 'Es un numero End If En donde celda es una referencia a la celda que necesitas validar. https://excel.facilparami.com