INTRODUCCION:
Las macros son pequeños trozos de código VBA que no deberían tener más de 15 líneas y no devuelven un valor en su nombre, como las funciones, sino que hacen tareas especificas, estas tareas muchas veces pueden realizase manualmente y otras no, en definitiva sirven para automatizar Excel. Las macros pueden vincularse entre sí mediante la palabra recervada Call y de esta forma unirse para formar códigos mas grandes
Estos códigos por lo general se ejecutan a pedido del operador, pero también pueden hacerlo automáticamente, una forma es debido a que se produzca algún cambio en una hoja de Excel, como puede ser el cambio en el valor de una celda. A estos cambios se los denomina EVENTOS y para que se ejecuten las macros, hay que programar dichos EVENTOS.
La forma más práctica de poner en acción una macro es mediante botones asociados a ellas. Para hacerlo vamos a la pestaña programador y de allí pulsamos el botón Insertar para que se desplieguen los controles de formulario, como se ve en la figura
al apretar el ícono del botón aparece una cruz, ubicamos esta cruz en el lugar que nos parece conveniente y arrastrándola, con el botón izquierdo del mouse apretado, podemos darle el tamaño adecuado. Al soltar el mouse tenemos algo parecido a esta imagen
simultáneamente aparece un panel donde podemos seleccionar la macro que queremos asociar
al aceptar ya tenemos el botón asociado a la macro, posteriormente lo podemos rotular convenientemente.
A continuacion daremos un ejemplo práctico simple:
Un banco quiere dar de baja las cuentas que no tuvieron movimientos por 3 o más años, considerándolas inactivas en dicho caso y activas en caso contrario.
El banco tiene un listado con las cuentas activas y no activas
Se quiere actualizar dicho listado, o sea eliminar las cuentas inactivas
Este listado tiene 14 clientes y se lo podría actualizar manualmente, pero si imaginamos que la lista tiene 5000 o más clientes, se tardaría mucho tiempo, por tal motivo es un problema para resolver con una macro.
Coloquemos la lista en la hoja 1 de un libro de Excel 2007 o Excel 2003
insetamos el siguiente código
Luego de de oprimir el botón que asociamos a la macro, que llamamos ActualizarListado, el listado queda
Código para copiar y pegar
Sub ActualizarListado()
Range("E3").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Value = "inactiva" Then
Selection.EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Range("A1").Select
End Sub
Cuando se dispara una macro no hay vuelta atrás, si se borra un dato, este se pierde(a no ser que se cierre el archivo no se guarden los cambios y se lo abra otra vez). Muchas veces podemos necesitar el listado original, por ejemplo para obtener, en el caso que estamos tratando, otro con los clientes que fueron dados de baja, el que se haría con una macro casi idéntica a la dada más arriba, que dicho sea de paso la confeccionó un empleado del área de computación del banco, al que le pidieron las dos listas a último momento. Cacho (así le dicen al empleado), que por suerte no había apretado el botón ACTUALIZAR, decidió hacer las dos cosas al mismo tiempo, es decir: dejar en la Hoja1un listado con los clientes activos y en la Hoja2 los clientes dados de baja, a esta hoja la renombro "Bajas", también copio como respaldo, el listado original en la Hoja3. Cuando terminó el trabajo le quedaron las siguientes macros
y para el rótulo de "Bajas"
"CopiaRotulo" es llamada por "ActualizarListado2" mediante la palabra reservada "Call"
Las dos listas quedaron como se ve
Lista de los clientes activos
Lista de los clientes dados de baja
Cacho pensó que después de todo, se hubiera tomado menos trabajo cerrando el archivo y abriéndolo otra vez, aunque pensándolo mejor se dijo "ya tengo hecha la macro y seguro que la voy a volver a usar”.
Si, seguro que la iba a volver usar y esta vez todo el trabajo sería más rápido.
Macros para copiar y pegar
Option Explicit
Sub ActualizarListado2()
Dim i As Integer
Dim k As Integer
k = 1
Dim j As Integer
j = 1
Call CopiaRotulo
Sheets("Hoja1").Select
Application.CutCopyMode = False
Range("E3").Select
Do While ActiveCell.Value <> ""
If ActiveCell.Value = "inactiva" Then
Sheets("Bajas").Select
Range("E65536").End(xlUp).Offset(1, 0).Select
i = ActiveCell.Row
Range("C" & i).Value = Worksheets("hoja1").Range("C" & i + k - j).Value
Range("C" & i).Interior.ColorIndex = 24
Range("C" & i).Borders(xlEdgeBottom).LineStyle = xlContinuous
Range("C" & i).Borders(xlEdgeLeft).LineStyle = xlContinuous
Range("C" & i).Borders(xlEdgeTop).LineStyle = xlContinuous
Range("D" & i).Value = Worksheets("hoja1").Range("D" & i + k - j).Value
Range("D" & i).Interior.ColorIndex = 24
Range("D" & i).Borders(xlEdgeBottom).LineStyle = xlContinuous
Range("D" & i).Borders(xlEdgeLeft).LineStyle = xlContinuous
Range("D" & i).Borders(xlEdgeTop).LineStyle = xlContinuous
Columns("D:D").EntireColumn.AutoFit
Range("E" & i).Value = Worksheets("hoja1").Range("E" & i + k - j).Value
Range("E" & i).Interior.ColorIndex = 24
Range("E" & i).Borders(xlEdgeBottom).LineStyle = xlContinuous
Range("E" & i).Borders(xlEdgeLeft).LineStyle = xlContinuous
Range("E" & i).Borders(xlEdgeTop).LineStyle = xlContinuous
Range("E" & i).Borders(xlEdgeRight).LineStyle = xlContinuous
j = j + 1
Range("A1").Select
Sheets("Hoja1").Select
Selection.EntireRow.Delete
Else
k = k + 1
ActiveCell.Offset(1, 0).Select
End If
Loop
Range("A1").Select
End Sub
Option Explicit
Sub CopiaRotulo()
Range("C2:E2").Select
Selection.Copy
Sheets("Bajas").Select
Range("C2").Select
ActiveSheet.Paste
Columns("C:C").EntireColumn.AutoFit
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").EntireColumn.AutoFit
End Sub
Nos podríamos preguntar de donde se sacó la tabla que uso Cacho, bueno, esta es realidad una base de datos de la cual se ha obtenido la que tiene el rótulo “ESTADO” (cuenta activa, cuenta inactiva). La BASE DE DATOS se obtiene de los FORMULARIOS que tenemos que llenar cuando decidimos sacar una cuenta corriente en un banco
Este es un modelo real de formulario para la solicitud de una cuenta bancaria de una empresa
De la misma manera, una empresa, podría generar su propia BASE DE DATOS de clientes, recurriendo a la capacidad que tiene Excel para generar FORMULARIOS, o podríamos crear un directorio telefónico y esto es justamente lo que haremos en el próximo ejemplo de macros pero sin recurrir a los formularios, tema que dejaremos para despues..
En adelante, como se vio en caso del empleado del banco (Cacho), procuraré presentar casos de la vida cotidiana, con los que se puede encontrar el empleado de una empresa, o de una pyme, situaciones con las que frecuentemente se ven involucrados profesionales de cualquier orientación o de un usuario que en realidad no sabe que esta frente a una aplicación Excel
EJEMPLOS PRACTICOS DE MACROS Y CODIGO VBA
Se puede encarar el problema anterior usando formularios, este método tiene la desventaja de que el código se complica un poco, lo que no debería sorprendernos ya que una celda es un objeto mas simple, pero como veremos, las ventajas superan a las desventajas
DIRECTORIO TELEFONICO ( USANDO FORMULARIOS)
CONSULTA EN UNA LIBRERIA (USANDO FORMULARIOS)
COMBOBOX (CUADRO COMBINADO) ORDENADO ALFABRTICAMENTE