En este apartado entregaremos los conceptos generales de la codificación o programación de una macro, la que, tal como dijimos anteriormente, se realiza a través de VBA.
 

Ejemplo de Codificación

     Tomemos como ejemplo la macro que utilizamos en los apartados anteriores para ver como esta codificada, claro que este caso esta codificación la realizó automáticamente Excel.   Para esto debemos ir al menú Herramientas/Macro/Macros... donde nos aparecerá el mismo cuadro de diálogo utilizado anteriormente para ejecutar una macro, sólo que ahora seleccionaremos la opción Paso a paso.

 

 

     Una vez hecho esto, automáticamente se nos desplegará la siguiente pantalla, la cual corresponde al módulo de Edición de Visual Basic que incluye el paquete de Office.

    En este caso como hemos seleccionado la opción Paso a paso, nos aparece un línea destacada en amarillo, esto es por que a través de los botones Continuar, Interrumpir y Restablecer podemos ir monitoreando como se va comportando nuestra macro, es decir las tareas que va desarrollando.  Si hubiéramos seleccionado la opción Modificar, podríamos alterar el código generado automáticamente por la aplicación.

   Podemos ver como en el encabezado de la macro en cuestión hace referencia al nombre de la macro, a su fecha de grabación y al método abreviado para su ejecución.

 

¿Qué graba Excel?

    Para comprender lo que realmente graba Excel, tomaremos un ejemplo sencillo, para lo cual nos posicionaremos  en la Hoja3 de nuestro libro de trabajo y grabaremos la siguiente macro:

  1. Active la Celda B1 y escriba Lunes

  2. Luego muévase a la celda C1 y escriba Martes

  3. Continúe con este proceso hasta llegar al día Viernes

  4. El rango utilizado seguramente será desde B1 hasta F1, luego de esto active nuevamente la celda B1.

  5. Una vez hecho esto, detenga la grabación y grabe la macro con el nombre de semana.

    Antes de comenzar a grabar esta macro, abriremos el Editor de Visual Basic, para esto presionaremos "ALT + F11".   Posteriormente a través de los ajustes manuales pare redimensionar la pantalla de tanto Excel como del Editor se vean simultáneamente, y una vez que comencemos da grabar nuestra macro, haremos primero clic donde dice Módulo2 antes de comenzar a introducir los textos.  Finalmente, deberíamos obtener el siguiente resultado:

    Como podrá apreciar, a medida que se vayan introduciendo los textos, el Editor de Visual Basic irá transformando sus acciones automáticamente en código VBA.  Así entonces, intuitivamente puede ir probando esta opción con distintas tareas y empezará a entender como es la lógica de este lenguaje de programación.

    La desventaja de utilizar este método de creación de código es que puede resultar bastante menos eficiente que realizar directamente la programación en el Editor, es por esto que lo instamos a que profundice en este aspecto, ya que le podrá ayudará a optimizar aún más su trabajo.

    Como ejemplo de lo anteriormente expuesto, el siguiente será el código generado por nuestra nueva macro:

Sub semana()
'
' semana Macro
' Macro grabada el 24/05/2004 por Marci-Anto
'
'

      Range("B1").Select
      ActiveCell.FormulaR1C1 = "Lunes"
      Range("C1").Select
      ActiveCell.FormulaR1C1 = "Martes"
      Range("D1").Select
      ActiveCell.FormulaR1C1 = "Miércoles"
      Range("E1").Select
      ActiveCell.FormulaR1C1 = "Jueves"
      Range("F1").Select
      ActiveCell.FormulaR1C1 = "Viernes"
      Range("B1").Select
End Sub

    Como puede apreciar es bastante lógica la forma en como se va construyendo el código.  Así primero hace referencia a la celda activa y luego al contenido de ésta, repitiendo esta acción cela a celda.

    Pero este proceso puede realizarse de forma mucho más rápida y eficiente, por ejemplo, para realizar esta misma tarea bastaría con la siguiente macro que contiene tan solo dos instrucciones:

Sub optimizada()
'
' optimizada Macro
' Macro grabada el 24/05/2004 por Marci-Anto
'
'
     Range("B1").Select
      ActiveCell.Resize(,5)=Array("Lunes","Martes","Miércoles","Jueves","Viernes")
     
End Sub

    Todas las macros que hemos utilizado hasta el momento, han sido incluidas en el archivo que ejemplo, el cual podrá ser descargado en el siguiente apartado.


Referencias Relativas y Absolutas

    Cuando Excel construye las macros a través de grabar las acciones o tareas que se están realizando, normalmente graba referencias absolutas a las celdas.  Es decir, cuando se selecciona una celda, recordará o almacenará la posición exacta de esa celda dentro de la Hoja, y no su su posición relativa respecto de la celda anteriormente activa.

    Así por ejemplo, en el caso de nuestra macro semana, podemos ver como hace referencia a una posición específica para la primera celda activa, esto es B1. En este caso diremos entonces que se han utilizado referencias absolutas.  El uso de este tipo de referencias implicará que al ejecutar la macro se ejecutarán las mismas tareas programadas y exactamente en las mismas celdas, sin reparar en que celda se encontraba activa al momento de ejecutar la macro.

    En el caso de que se desee ejecutar una macro, partiendo de la posición en que se encuentra activa una celda (sea hacia la derecha, izquierda, arriba o abajo, según corresponda) deberán utilizarse referencias relativas.

    Realicemos ahora un ejemplo con este tipo de referencias. Supongamos que nos encontramos en la celda B4 y que necesitamos que tres filas más arriba se escriban automáticamente los días de Lunes a Viernes, esto es desde B1 a F1. Entonces comenzaremos a grabar nuestra macro, pero antes haremos clic en el icono de Referencia relativa que aparece al costado de la opción Detener Grabación.

    Si revisamos posteriormente veremos que la siguiente será la codificación que ahora nos mostrará Excel:

Sub relativa()
'
' relativa Macro
' Macro grabada el 25/05/2004 por Marci-Anto
'
     ActiveCell.Offset(-3, 0).Range("A1").Select
     ActiveCell.FormulaR1C1 = "Lunes"
     ActiveCell.Offset(0, 1).Range("A1").Select
     ActiveCell.FormulaR1C1 = "Martes"
     ActiveCell.Offset(0, 1).Range("A1").Select
     ActiveCell.FormulaR1C1 = "Miércoles"
     ActiveCell.Offset(0, 1).Range("A1").Select
     ActiveCell.FormulaR1C1 = "Jueves"
     ActiveCell.Offset(0, 1).Range("A1").Select
     ActiveCell.FormulaR1C1 = "Viernes"
     ActiveCell.Offset(0, -4).Range("A1").Select'    

End Sub

    Vemos ahora como la referencia hacia la celda activa  ya no es absoluta como antes (B1), sino que ahora hace referencia acerca de cuantas filas y columnas hacia arriba, abajo, izquierda o derecha respecto de la posición original.  En este caso específico a tres filas hacia arriba en relación a la celda que se encontraba activa al momento de ejecutar la macro (-3,0). 

    Una macro muy similar, la podríamos construir con una única línea de codificación, sólo que en este caso esta macro rellenaría los días de la semana a partir de la celda activa solamente:

Sub optimizada2()
'
' optimizada2 Macro
' Macro grabada el 25/05/2004 por Marci-Anto
'
'
     ActiveCell.Resize(,5)=Array("Lunes","Martes","Miércoles","Jueves","Viernes")
     
End Sub



    Finalmente diremos que para facilitar la ejecución de las macros que hemos utilizado hasta ahora, las cuales están incluidas en el archivo de ejemplo, éstas han sido asignadas a distintas autoformas correspondientemente identificadas.