Usar el grabador de macros de excel

Usar el grabador de macros de Excel (Parte II)

Excel Macros VBA

Excel permite la automatización de infinidad de tareas a través de macros. Si sabes programar con VBA (Visual Basic para Aplicaciones es el lenguaje, de momento, usado por las aplicaciones de Microsoft Office), esto te abre un inmenso mundo de posibilidades. Sin embargo, para aquellos que no tienen ni idea de programación, existe una opción para automatizar tareas que es usar el grabador de macros de Excel. Esta es la Parte II del artículo dedicado a este tema.

Introducción

En este artículo sobre como usar el grabador de macros de Excel (Parte II), continuaremos en el punto en que lo dejamos en la primera parte.

Para hacer memoria, los puntos tratados en dicha primera parte fueron:

  • Como se habilita la pestaña del programador (o desarrollador, dependiendo de tu configuración regional)
  • Descripción de las principales opciones de la pestaña del programador
  • Introducción del ejemplo a desarrollar
  • Pasos a seguir para realizar la grabación de una macro
  • Como visualizar el código grabado

Si necesitars refrescar alguno de estos puntos, puedes hacerlo en Usar el grabador de macros de Excel.

Objetivos

En esta Parte II de como usar el grabador de macros de Excel, veremos:

  • que pasos debemos seguir para ejecutar la macro grabada a nuestra voluntad y que diferentes opciones tenemos para realizar dicha ejecución
  • algunas recomendaciones sobre cómo modificar el código grabado para mejorar su flexibilidad y robustez

Ejecutar la macro grabada

Desde el editor de Visual Basic

La primera opción que tenemos para ejecutar la macro es desde el propio editor de Visual Basic. Si recuerdas lo comentado en la primera parte del artículo, existen varias opciones para acceder a dicho editor. Asumiendo que ya estamos en él mediante cualquiera de ellas, la forma mas rápida de ejecutar cualquier macro es posicionarse dentro del código de la misma y lanzar la ejecución pulsando F5.

También puedes posicionarte dentro del código (el cursor) y después hacer click en el botón similar a «Play» de la zona que te indico recuadrada en la imagen siguiente.

Usar el grabador de macros de Excel (Parte II) - Ejecutar macro desde el editor VBA

Esta opción puede ser interesante especialmente cuando estamos en la fase de depuración de la macro grabada y estamos viendo como modificarla o mejorarla. Después, en el funcionamiento normal, no es la forma mas eficiente.

Desde la opción Macros de la pestaña del Programador

Si recuerdas, cuando describí las opciones del menú del programador, una de ellas daba acceso a ver todas las macros disponibles, tanto en el libro activo, como en cualquier otro libro abierto.

Si ahora hacemos click sobre dicha opción, veremos que nos aparece la Macro1 grabada y que tenemos la opción de Ejecutar, además de otras.

Menú macro de la pestaña del programador de Excel

Haciendo click sobre Ejecutar, lanzaremos la ejecución de la macro completa.

Crear una combinación de teclas para lanzarla

Dentro del formulario de Macros de la imagen anterior, puedes ver que hay un botón llamado Opciones… Si clicas sobre él, verás que aparece una nueva ventana, Opciones de la macro, que permite definir un método abreviado para ejecutar la macro usando la tecla CTRL junto a otra tecla de nuestra elección.

Si, por ejemplo, escribimos P en la casilla y aceptamos, cuando pulsemos CTRL+P, la macro se ejecutará. Esta opción no diferencia mayúsculas de minúsculas.

Usar el grabador de macros de Excel (Parte II) - Asignar método abreviado a macro

Ten cuidado de tener seleccionada la macro adecuada antes de pulsar el botón Opciones… En este ejemplo, solo tenemos una macro, pero el método abreviado se asignará a la macro que tengamos seleccionada y cuyo nombre se muestra en esta ventana, en Nombre de la macro.

Desde la cinta de opciones

Si se trata de una macro que utilizas con mucha frecuencia e, incluso, en diferentes libros, mas que tenerla grabada en cada uno de ellos, lo mas eficiente es tenerla en un add-in que se cargue con Excel y que tengas un acceso rápido a la misma.

Como eso es un poco complicado para resumir aquí, te recomiendo que si estás interesado, leas el artículo al respecto Personalizar Excel con un fichero de add-ins.

Como ves, tienes bastantes opciones disponibles para ejecutar tu macro. Elige la que te haga sentir más cómodo ya que con cualquiera de ella conseguirás tu objetivo.

Revisando el código. Recomendaciones y mejoras

Únicamente nos queda ya echar un vistazo al código grabado por Excel y ver cómo podemos modificarlo, sin entrar en grandes cambios, para evitar algún problema potencial y flexibilizarlo.

Identificar bien la hoja con la que se interactúa

Empecemos por las primeras líneas de código grabadas:

Range("B1").Select
ActiveCell.FormulaR1C1 = "8/16/2020"

Simplemente seleccionan el Rango B1 y escriben en él la fecha de 8/16/2020. Si te fijas, el formato es mes/día/año.

El primer «problema» lo encontramos en como selecciona la celda en la que escribir la fecha. Selecciona el rango B1, pero no específica una hoja concreta. Recuerda que en el ejemplo teníamos dos hojas: Lunes y Martes y que en la hoja Lunes debíamos escribir la fecha para que en la hoja Martes, mediante una fórmula, pusiese la fecha de la hoja Lunes + 1.

Esto quiere decir que si nos descuidamos y lanzamos la macro desde la hoja Martes, en la celda B1 de dicha hoja, sustituiremos la fórmula que tenemos, referida a la celda B1 de la hoja Lunes por el valor 8/16/2020 y en la hoja Lunes nos quedará el valor de la fecha que tuviésemos.

La primera recomendación es siempre identifica de forma unívoca a que celda o rango nos estamos refiriendo. Esto lo podemos hacer de dos formas.

Usar el grabador de macros de Excel (Parte II) - Referencia a hoja

Cómo puedes ver en la imagen, en el editor de VBA puedes ver las hojas que tiene el libro. En concreto, la hoja Lunes ves que se identifica como Hoja1 (Lunes). Pues bien, nos podremos referir a ella usando cualquiera de estos dos identificadores.

El primero, Hoja1, es el identificador que utiliza VBA mientras que el segundo es el nombre visible en la pestaña de la hoja.

Ambos se pueden modificar, pero mientras el nombre (Lunes) lo puede cambiar cualquier usuario, para modificar la referencia de VBA (Hoja1) hay que entrar en el editor, seleccionar la hoja, visualizar las propiedades y modificarlo.

Obviamente, esto es mas complicado que ocurra por lo que te recomiendo que siempre hagas referencia a través del identificador de VBA. Evitarás de esta forma que si un usuario modifica el nombre de la hoja, tu macro ya no encuentre la misma (el nombre al que referencias ya no existirá) y la macro de un error en tiempo de ejecución.

Para hacer referencia al rango usando el identificador de VBA, debemos modificar el código a:

Hoja1.Range("B1").Select
ActiveCell.FormulaR1C1 = "8/16/2020"

Si lo que queremos es hacer referencia a la hoja usando el nombre de la pestaña, lo cambiaremos a:

Sheets("Lunes").Range("B1").Select
ActiveCell.FormulaR1C1 = "8/16/2020"

En este caso, hacemos referencia a un elemento de la colección Sheets que contiene todas las hojas del libro, a través de su nombre, que como es una cadena de texto, debe ir entre comillas.

Introducción de la fecha

Vemos que para introducir la fecha, se hace referencia a la celda activa (ActiveCell). Ésta ya le hemos definido en la línea anterior modificada de forma precisa, por lo que podríamos dejarlo así. De todas formas, podríamos ser mas específicos y sustituir ActiveCell por Hoja1.Range(«B1»).

También vemos que para introducir el valor de fecha, usa la instrucción FormulaR1C1. Esta instrucción es más adecuada para la introducción de fórmulas que de valores, como es el caso.

Además, al introducir el valor como si fuese una fórmula, modifica el formato de fecha, al menos en mi caso, de día/mes/año a mes/día/año que es el que usa VBA por defecto (muy americano…).

Como yo me siento mas cómodo con mi formato habitual, prefiero modificarlo para introducir un valor. Lo que haríamos sería cabiar la segunda línea por:

ActiveCell.Value = "16/08/2020"
Uniendo ambas líneas

Si bien esto no es necesario, podemos fusionar ambas lineas y, en vez de seleccionar una celda y después indicarle que cambie su valor, podemos hacerlo todo a la vez. Para ello, usaremos la siguiente línea de código para sustituir las dos anteriormente comentadas:

Hoja1.Range("B1").Value = "16/8/2020"
Eliminar innecesarios

La siguiente línea de código que nos encontramos es

Range("B2").Select

Está línea no la queremos para nada realmente. Lo que pretendemos es introducir en B1 el valor de la fecha inicial y no necesitamos seleccionar la celda B2 para nada.

El hecho de que aparezca en el código grabado viene únicamente de que cuando hemos sguido el proceso de grabación, trás introducir el valor 16/08/2020 en B1 hemos pulsado Enter y al hacer eso, Excel se mueve a la siguiente celda. Esto ha sido grabado por Excel y así nos lo muestra.

Podemos borrarla sin problemas.

Convertir la fecha en una variable

La macro que hemos grabado, funciona perfectamente, pero cada vez que la ejecutemos, introducirá la misma fecha 16/08/2020 en la celda B1 de la hoja Lunes.

Probablemente, lo que nos gustaría sería que, al ejecutar la macro, pudiésemos indicar que fecha es la de comienzo.

Vamos a hacer eso mediante una variable y aprenderemos además como hacer que la macro nos pregunte. Usaremos para ello la instrucción InputBox de la siguiente forma:

Dim Fecha As String
Fecha = InputBox("Introduce la fecha inicial", "Fecha inicial", Date)

La primera línea declara la variable Fecha como tipo String ya que va a contener una cadena de texto.

En la segunda línea, indicamos que cargue a dicha variable el valor que el usuario introduzca en la ventana que crea InputBox. Y los parámetros de ese InputBox son:

  • «Introduce la fecha inicial»: la cadena de texto que mostrará la ventana a modo de instrucción de lo que se debe hacer
  • «Fecha inicial»: el título de la ventana mostrada
  • Date: el valor por defecto que propondrá la ventana InputBox, en este caso la fecha actual que se obtiene con la instrucción Date. Este tercer parámetro no es obligatorio y si se deja en blanco, no mostrara nada en la propuesta.

Al ejecutar la macro con estas nuevas líneas de código, nos aparecerá la siguiente ventana:

Ventana del InputBox

Puedes ver dónde aparecen los parámetros indicados a la función InputBox y el valor por defecto que nos propone.

Lógicamente, deberemos modificar la línea de código que introduce el valor en la celda B1 para que introduzca el de la variable Fecha.

El código nos quedaría así:

Sub Macro1()
    Dim Fecha As String
    
    Fecha = InputBox("Introduce la fecha inicial", "Fecha inicial", Date)
    Hoja1.Range("B1").Value = Fecha
Personalizar el fichero pdf

La siguiente, y última, intrucción grabada es la que se encarga de guardar el libro en un fichero pdf.

ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
   "M:\Blog\Excel\VBA\VBA_005_GrabadoraMacros\EjemploGrabadoraMacros.pdf", _
    Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
        :=False, OpenAfterPublish:=False

Esta instrucción tiene definida la ruta y nombre del fichero pdf de forma fija. Esto significa que, cada vez que ejecutemos la macro, dicho fichero se re-escribirá, perdiendo las versiones anteriores.

Si no es esto lo que queremos, podríamos definir una variable y generar dicho nombre de fichero con el sufijo de la fecha, de forma que nos vaya guardando ficheros con nombre compuesto por nombre raíz + fecha.

Ahora que ya eres casí un experto, ya te imaginarás que para ello deberemos declarar una nueva variable, por ejemplo NombreFichero y crearla uniendo cadenas de texto.

Podríamos, hacer lo siguiente:

NombreFichero= "M:\Blog\Excel\VBA\VBA_005_GrabadoraMacros\EjemploGrabadoraMacros" & Fecha & ".pdf"

Donde como ves, NombreFichero, se genera uniendo las siguientes cadenas mediante el operador &:

  • «M:\Blog\Excel\VBA\VBA_005_GrabadoraMacros\EjemploGrabadoraMacros», base de la ruta y nombre que debe ir entrecomillada al tratarse de una cadena de texto
  • Fecha, que es la variable cargada con el InputBox. Esta no se debe entrecomillar ya que es una variable. Si lo hiciésemos, VBA no lo interpretaría como tal y en vez de usar su contenido, usaría la cadena literal «Fecha»
  • «.pdf» para mantener la extensión pdf del archivo

Deberíamos sustituir, dentro de la instrucción de impresión, la cadena fija grabada al usar el grabador de macros de Excel por la variable que contiene la cadena personalizada. Esto lo haremos de la siguiente forma:

ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        NombreFichero, _
        Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
        :=False, OpenAfterPublish:=False
Código completo

El código completo, una vez hechas las modificaciones necesarias quedará como sigue:

Sub Macro1()
    Dim Fecha As String
    Dim NombreFichero As String
    
    Fecha = InputBox("Introduce la fecha inicial", "Fecha inicial", Date)
    
    Hoja1.Range("B1").Value = Fecha
    
    NombreFichero = "M:\Blog\Excel\VBA\VBA_005_GrabadoraMacros\EjemploGrabadoraMacros" & Fecha & ".pdf"
    
    ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        NombreFichero, _
        Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
        :=False, OpenAfterPublish:=False
End Sub

Otras consideraciones

Lo hecho hasta aquí, nos ha servido para

  • robustecer el código: hemos evitado el posible error de ejecutar la macro sobre otra hoja diferente a Lunes y que nos estropee fórmulas, además de no obtener el resultado esperado
  • flexibilizar el código: mediante la solicitud de la fecha inicial y la modificación del nombre del pdf generado y poder así conservar archivos históricos

Quedarían otros temas importantes para tener un código 100% efectivo como es en tratamiento de errores. No es el objeto de este artículo, pero si comentaré algunas cosas que un buen código debiera tratar.

No hemos considerado que el usuario, cuando le aparece el InputBox, puede hacer click en Cancelar en vez de en Aceptar. Nuestro código debiera ser capaz de detectar esta situación y salir sin imprimir el pdf.

Tampoco hemos considerado el caso de que el usuario introduzca un valor que no sea una fecha válida. En tal caso, la celda B1 de la hoja Martes daría un error en el cálculo de la fecha. Deberíamos ser capaces de interceptar dicho error y, o bien cancelar la ejecución o, mucho mejor, informar al usuario de su error y solicitarle una fecha válida.

Conclusión

Hemos visto a lo largo de estos dos artículos Usar el grabador de macros de Excel y Usar el grabador de macros de Excel (Parte II) lo básico de su utilización y como mejorar alguna cosa del código generado.

Es un primer paso dentro del inmenso mundo de posibilidades que ofrece la programación de macros.

Si estás interesado en profundizar, tal y como te decía en la primera parte de este artículo, deberías comenzar a construir tu propia librería de consulta. Un libro muy adecuado para comenzar por el principio es VBA Excel 2013. Programación En Excel. Macros y Lenguaje VBA. Existe muchos otros e infinidad de recursos en internet. De todas formas, si quieres un consejo, aprende las bases por orden y recurre a los foros de internet para despejar dudas concretas.

Te deseo suerte en este apasionante camino y desde Informática Muy Fácil estaré encantado de ayudarte a avanzar resolviendo tus dudas en el foro.

2 comentarios sobre «Usar el grabador de macros de Excel (Parte II)»

  1. hola estimados quisiera pedir ayuda con un tema en macro.

    tengo un inventario de materiales en la cual le añadí una imagen con macro.

    el excel y la carpeta de fotos están en la misma dirección.

    el problema que no puedo resolver es el siguiente:

    1. al momento de deslizarme la foto se pierde mientras bajo la barra.

    2. al momento de filtrar ,la imagen se modifica de acuerdo ala cantidad de filas .

    quisiera que la imagen sea algo flotante y no se modifique.

Deja una respuesta