Aprender a modificar macros grabadas en Excel

En esta entrada vamos a aprender a interpretar y modificar las macros grabadas en Excel. De esta manera generamos código automáticamente y podemos hacer las modificaciones que creamos oportunas para que la macro se comporte como deseamos. Además, nos permitirá detectar y corregir posibles errores en nuestras macros.

Si no sabemos cómo grabar una macro en Excel podemos repasar la entrada: Macros en Excel. También es recomendable conocer el Entorno de VBA en Excel y las nociones básicas sobre Programación orientada a objetos.

Primera macro grabada

Procedemos a grabar nuestra primera macro con las siguientes acciones:

  • Escribir el texto “Esta es mi primera macro”
  • Pulsar ENTER

A continuación, detenemos la macro y accedemos al Editor de Visual Basic.

Este es el código generado y almacenado en el Módulo1:

Sub primera_macro()
    ActiveCell.FormulaR1C1 = "Esta es mi primera macro"
    Range("A2").Select
End Sub

En primer lugar, tenemos la definición del procedimiento de subrutina, es decir, nuestra macro con el nombre primera_macro. Además, se han generado automáticamente dos instrucciones que corresponden a las dos acciones que hemos grabado.

  • Recordamos que Activecell es un objeto que hace referencia a la celda activa. Se ha utilizado la propiedad FormulaR1C1 para escribir el texto que se visualiza en la celda.
  • En la segunda instrucciones se usa el método Select para seleccionar la celda A2.

En realidad, la segunda instrucción no sería necesaria en esta macro que pretendía escribir texto en la celda activa. Se ha generado esta instrucción al pulsar la tecla ENTER cuando hemos grabado la macro. Por tanto, podemos eliminar esta línea de código.

Por otro lado, tampoco sería necesario usar la propiedad FormulaR1C1 en la primera instrucción. Esta propiedad nos permite escribir fórmulas en la celda. En este caso queríamos escribir un valor, una cadena de texto. Para ello podemos usar la propiedad Value.

Por tanto podríamos dejar la macro de la siguiente manera:

Sub primera_macro()
    ActiveCell.Value= "Esta es mi primera macro"
End Sub

Modificar macros grabadas: Macro grabada con referencias relativas

En un segundo ejemplo, vamos a utilizar referencias relativas a la hora de grabar la macro. Procedemos a grabar la macro y realizamos estas acciones:

  • Seleccionamos la celda que queda dos posiciones a la derecha y una abajo, es decir dos columnas a la derecha y una fila abajo.
  • Escribimos el texto: Me he desplazado una fila y dos columnas

Después de detener la grabación, podemos comprobar que este es el código generado

Sub Macro()
    ActiveCell.Offset(1, 2).Range("A1").Select
    ActiveCell.FormulaR1C1 = "Me he desplazado una fila y dos columnas"
End Sub

Nos encontramos con una nueva propiedad para el objeto ActiveCell. Es la propiedad offset. En realidad se trata de una función que sirve para poder moverse a través de la hoja de cálculo, tal como lo haríamos con las flechas de dirección del teclado. Indicaremos entre paréntesis el número de filas y columnas que nos desplazamos. Si los números son negativos el desplazamiento será hacia arriba y hacia la izquierda.

La propiedad Range(“A1”) no sería necesaria. Y, en este caso, tampoco necesitamos seleccionar la celda, pues la finalidad de la macro era escribir en ella. Por tanto, podríamos dejar el código de la siguiente manera:

Sub Macro()
    ActiveCell.Offset(1, 2).Value = "Me he desplazado una fila y dos columnas"
End Sub

Modificar macros grabadas: Propiedades de un objeto

En el siguiente ejemplo, vamos a definir algunas propiedades para un objeto. Queremos modificar el formato de la fuente de la celda activa. Por tanto, iniciamos la grabación,

  • Accedemos al cuadro de diálogo del formato de celdas / fuente
  • Modificamos el tipo de letra (Arial), tamaño (12), color (rojo) y definimos la letra en negrita, cursiva y subrayado simple.
  • Pulsamos aceptar y detenemos la grabación.

Este será el código generado:

Sub Macro()
  With Selection.Font
        .Name = "Arial"
        .FontStyle = "Negrita Cursiva"
        .Size = 12
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleSingle
        .Color = 255
        .TintAndShade = 0
        .ThemeFont = xlThemeFontMinor
    End With
End Sub

Se utiliza el objeto Selection, es decir, el objeto seleccionado actualmente en la hoja de cálculo activa.

Además, hace uso de la instrucción With. Esta sentencia permite ejecutar varias acciones sobre un mismo objeto sin tener que hacer referencia a él en cada caso. Es decir, en lugar de escribir distintas instrucciones con cada una de las propiedades:

Selection.Font.Name = "Arial"
Selection.Font.FontStyle = "Negrita Cursiva"
Selection.Font.Size = 12

Agrupamos todas las propiedades que se van a definir para el objeto mediante la sentencia With …. End With.

Por otro lado, se han aplicado más propiedades de las que definimos cuando grabamos la macro al aceptar el cuadro de diálogo Formato /Fuente. Podemos depurar el código y eliminar esas instrucciones:

Sub Macro()
    With Selection.Font
        .Name = "Arial"
        .FontStyle = "Negrita Cursiva"
        .Size = 12
        .Underline = xlUnderlineStyleSingle
        .Color = 255
    End With
End Sub

Modificar macros grabadas: Métodos

Por último, veamos un ejemplo de uso de métodos en nuestras macros. Creamos una macro que realiza las siguientes acciones:

  • Seleccionar la celda A1
  • Escribir el texto “HOLA”
  • Copiar la celda
  • Seleccionar la celda A2
  • Realizar un pegado especial de valores

Este es el código generado:

Sub Macro()

    Range("A1").Select
    ActiveCell.FormulaR1C1 = "HOLA"
    Range("A1").Select
    Selection.Copy
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

Podemos ver en el código que se usan varios métodos para el objeto Range o Selection.

  • Select: seleciona el rango de celdas
  • Copy: copia las celdas seleccionadas
  • PasteSpecial: Pegado Especial. Este método necesita una serie de argumentos. Sin embargo, el único que sería necesario en nuestro caso sería el primero, xlPasteValues para indicar que queremos pegar los valores.

Podríamos depurar el código y dejarlo de la siguiente manera:

Sub Macro()
    Range("A1").Value = "HOLA"
    ActiveCell.Copy
    Range("A2").PasteSpecial xlPasteValues
End Sub

En este enlace puedes consultar la Explicación del equipo de soporte de Microsot Excel sobre este tema.

Para poder avanzar en el desarrollo de macros en Excel debemos conocer:

Diseño de macros en Excel. Con ejemplos prácticos

Esta entrada es parte de nuestro curso Diseño de macros en Excel. Con ejemplos prácticos