Вы находитесь на странице: 1из 12

Qu es una macro?

Una macro son un conjunto de instrucciones que sirven para automatizar procesos.
Refirindonos a Excel, supongamos que realizamos frecuentemente la accin de
seleccionar un rango para aplicarle negrita, cambio de fuente y centrado. En lugar de
hacer estas acciones manualmente, se puede elaborar una macro e invocarla para que
ejecute los tres procesos automticamente.

Objetos, propiedades y mtodos


Antes de comenzar a profundizar en cosas ms importantes, te sugerimos que leas este
artculo para tener una visin de conjunto sobre los captulos posteriores. Estos son los
temas que se darn por sabidos en siguientes secciones. A continuacin te presentamos
un rpido resumen de los conceptos ms usuales en VBA:

Cdigo: Realizamos acciones en VBA ejecutando cdigo VBA.

Mdulos: Los mdulos VBA estn almacenados en un libro de Excel, pero


vemos o editamos mdulos utilizando el editor de Visual Basic (VBE). Un
mdulo VBA consiste en procedimientos.

Procedimientos: Un procedimiento es bsicamente una unidad de cdigo


informtico que realiza alguna accin. VBA admite dos tipos de procedimientos:
Sub y Function.
o Sub: Un procedimiento Sub consiste en una serie de sentencias que
pueden ejecutarse de varias maneras. Aqu tienes un ejemplo de un
sencillo procedimiento Sub llamado Test. Este procedimiento realiza una
sencilla suma y despus muestra el resultado en un cuadro de mensaje.

Sub Test()
Sum = 1 + 1
MsgBox "La respuesta es " & Sum
End Sub
o Function: Adems de los procedimientos Sub, un mdulo VBA tambin
puede tener un procedimiento Function. Un procedimiento Function
devuelve un solo valor (o posiblemente una matriz). Se puede invocar un
Function desde otro procedimiento de VBA o podemos usarlo en una
frmula de hoja. A continuacin se muestra un ejemplo de una funcin
llamada AgregaDos:

Function AgregaDos(arg1, arg2)


AgregaDos = arg1 + arg2
End Function
Objetos: VBA manipula los objetos que se encuentran en su aplicacin husped
(en este caso, Excel es la aplicacin husped). Excel te ofrece ms de 100 clases
de objetos para manipular, entre los que se encuentran los libros, las hojas,
rangos de hojas, grficos o un tringulo dibujado. Hay muchos ms objetos a
disposicin del programador y puedes manipularlos utilizando el cdigo VBA.
Las clases de objetos estn ordenadas por jerarquas.

Los objetos pueden actuar como recipientes de otros objetos. Por ejemplo, Excel
es un objeto llamado Application y contiene otros objetos como Workbook y
CommandBar. El objeto Workbook puede contener otros objetos como Worksheet
y Chart. Un objeto Worksheet puede contener objetos como Range,
PivotTable y as sucesivamente. La disposicin de estos objetos recibe el
nombre de modelo de objetos de Excel.

Colecciones: Los objetos similares forman una coleccin. Por ejemplo, la


coleccin Worksheet se compone de todas las hojas de un determinado libro. La
coleccin CommandBars est formada por todos los objetos CommandBar. Las
colecciones son objetos por s mismos.

Jerarqua de objetos: Cuando haces referencia a un objeto miembro o


contenido, especificas su posicin en la jerarqua de objetos utilizando un punto
para separar los contenedores de los miembros. Por ejemplo, puedes hacer
referencia a un libro llamado Libro1.xlsx as:

Application.Workbooks(Libro1.xlsx)

Esto hace referencia al libro 1.xlsx de la coleccin Workbooks. La coleccin


Workbooks se encuentra dentro del objeto Application de Excel. Llevando esto
a otro nivel, puedes hacer referencia a la Hoja1 del Libro1 as:

Application.Workbooks(Libro1.xlsx).Worksheets(Hoja1)

Todava se puede llevar a otro nivel ms y referirse a celdas especficas como se


indica a continuacin:

Application.Workbooks(Libro1.xlsx).Worksheets(Hoja1).Range(
A1)

Objetos activos: Si omites una referencia especfica a un objeto, Excel utiliza


los objetos activos. Si el libro activo es Libro1, la referencia anterior se puede
hacer ms simple:

Worksheets (Hoja1).Range(A1)
Si sabes que la hoja active es Hoja1, puedes simplificar la referencia todava
ms:

Range(A1)

Propiedades de objetos: Los objetos tienen propiedades.

Podemos imaginar una propiedad como un valor de un objeto. Por ejemplo, un


objeto de rango tiene propiedades como Value y Name. Un objeto de grfico
tiene propiedades como HasTitle y Type. Puedes utilizar VBA para determinar
las propiedades de un objeto y tambin para cambiarlas.

Hacemos referencia a las propiedades combinando el objeto con la propiedad,


separados por un punto. Por ejemplo, podemos hacer referencia al valor de la
celda A1 de la Hoja1 como se indica a continuacin:

Worksheets (Hoja1).Range(A1).Value

Variables en VBA: Podemos asignar valores a variables VBA. Piensa en una


variable como en un nombre que puedes utilizar para almacenar un determinado
valor. Para asignar el valor de la celda A1 de la Hoja1 a una variable llamada
Precio, utiliza la siguiente instruccin VBA:

Precio = Worksheets (Hoja1).Range(A1).Value

Mtodos de objetos: Los objetos tienen mtodos.

Un mtodo es una accin que se realiza sobre el objeto. Por ejemplo, uno de los
mtodos para un objeto Range es ClearContents. Este mtodo borra los
contenidos del rango.

Los mtodos se especifican combinando el objeto con el mtodo, separados por


un punto.

Por ejemplo, para borrar los contenidos de la celda A1 de la hoja activa utiliza:

Range(A1).ClearContents

Constructores de programacin estndar: VBA tambin incluye todos los


constructores de programacin estndar de los lenguajes de programacin
modernos, incluyendo matrices, bucles y similares.
Eventos: Algunos objetos reconocen eventos especficos, y se puede escribir
cdigo VBA que se ejecute cuando ocurre un evento. Por ejemplo, abrir un libro
habr que se ejecute el evento Workbook_Open. Cambiar una celda en una hoja
hace que se ejecute un evento Worksheet_Change.

Aunque no lo creas, esto describe casi por completo VBA. A partir de ahora slo
aprenderemos los detalles para manejar todo esto.

Conjuntos
Un conjunto es una coleccin de objetos del mismo tipo, para los que conozcan algn
lenguaje de programacin es un array de objetos. Por ejemplo, dentro de un libro de
trabajo puede existir ms de una hoja (WorkSheet), todas las hojas de un libro de
trabajo forman un conjunto, el conjunto WorkSheets.

Cada elemento individual de un conjunto se referencia por un ndice, de esta forma, la


primera, segunda y tercera hoja de un libro de trabajo, se referenciarn por
WorkSheets(1), WorkSheets(2) y WorkSheets(3).

Objetos de Objetos

Es muy habitual que una propiedad de un objeto sea otro objeto. Siguiendo con el
coche, una de las propiedades del coche es el motor, y el motor es un objeto con
propiedades como cubicaje, caballos, nmero de vlvulas, etc. y mtodos, como
aumentar_revoluciones, coger_combustible, mover_pistones, etc.

En Excel, el objeto WorkSheets tiene la propiedad Range que es un objeto, Range


tiene la propiedad Font que es tambin un objeto y Font tiene la propiedad Bold
(negrita). Tenga esto muy presente ya que utilizaremos frecuentemente Propiedades de
un objeto que sern tambin Objetos. Dicho de otra forma, hay propiedades que
devuelven objetos, por ejemplo, la propiedad Range de un objeto WorkSheet devuelve
un objeto de tipo Range.

Programacin Orientada a Objetos o Programacin Basada en Objetos

Hay una sutil diferencia entre las definiciones del ttulo. Programacin orientada a
Objetos, significa que el programador trabaja con objetos fabricados por l mismo, es
decir, el programador es quien implementa las clases para luego crear objetos a partir de
ellas. Lo que haremos nosotros, por el momento, ser utilizar objetos ya definidos por la
aplicacin Excel (WorkSheets, Range,...) sin implementar ninguno de nuevo, por lo que
en nuestro caso es ms correcto hablar de programacin basada en objetos. Observe que
esta es una de las grandes ventajas de la OOP, utilizar objetos definidos por alguien sin
tener que conocer nada sobre su implementacin, slo debemos conocer sus
propiedades y mtodos y utilizarlos de forma correcta.

Bueno, despus de esta extensa pero necesaria introduccin pasemos ya a hacer alguna
cosa en Excel. No es necesario que se aprenda lo anterior al pi de la letra y tampoco es
necesario que lo comprenda al cien por cien, slo tngalo presente para las definiciones
que vienen a continuacin y ver como va asimilando los conceptos de Objeto,
propiedades, mtodos, etc.

Editor de Visual Basic


Todo el trabajo con VBA se realiza en el editor de Visual Basic (VBE). El editor de
Visual Basic es una aplicacin separada que trabaja perfectamente integrada en Excel.
Esto quiere decir que Excel se ocupa de abrir el editor cuando sea necesario. No se
puede ejecutar el editor de Visual Basic por separado; Excel debe estar ejecutndose
para poder ejecutar el editor.

Preparar un archivo nuevo


Para entrar en el editor de Visual Basic, ejecute los pasos siguientes.

1. Active opcin Herramientas/ Macro/ Editor de Visual Basic. Se abrir la


ventana siguiente

Maximize la ventana para trabajar ms cmodamente y procure tener activadas la


ventana Explorador de proyectos y la ventana Propiedades (Ver/ Explorador de
proyectos y Ver/ Ventana propiedades).

Insertar un nuevo mdulo


Un mdulo sirve para agrupar procedimientos y funciones. El procedimiento y la
funcin son entidades de programacin que sirven para agrupar instrucciones de cdigo
que realizan una accin concreta.
Para insertar un mdulo active opcin del men Insertar/ Mdulo. Se activar una
nueva ventana, si aparece demasiado pequea, maximcela.

Insertar un procedimiento
Ya hemos dicho que un procedimiento es un bloque de instrucciones de cdigo que
sirven para llevar a cabo alguna tarea especfica. Un procedimiento empieza siempre
con la instruccin

Sub Nombre_Procedimiento

Y termina con la instruccin

End Sub.

A continuacin crearemos un procedimiento para poner el texto "Hola" en la casilla A1.

Ejemplo 1

Sub Primero()

Range("A1").Value = "Hola"

End Sub

Observe el cdigo.

Range("A1").Value="Hola"

En esta lnea estamos indicando que trabajamos con un objeto Range. Para indicarle
que nos referimos a la casilla A1, encerramos entre parntesis esta referencia (ms
adelante ver otra forma de referirnos a las casillas). De este objeto, indicamos que
queremos establecer un nuevo valor para la propiedad Value, observe que para separar
el objeto de su propiedad utilizamos la notacin punto.

Recuerde que el conjunto Range es un objeto que pende del objeto WorkSheets, as por
ejemplo el siguiente cdigo hara lo mismo que el anterior.

WorkSheets(1).Range("A1").Value = "Hola"

Bueno, de hecho no hace lo mismo, en la primera opcin, el texto "Hola" se pone dentro
de la casilla A1 de la hoja activa, mientras que en el segundo es en la casilla A1 de
primera hoja ( del conjunto de hojas). La segunda notacin es ms larga, pero tambin
ms recomendable ya que se especifican todos los objetos. En muchas ocasiones se
pueden omitir algunos objetos precedentes, no le aconsejamos hacerlo, sus programas
perdern claridad y concisin.
Si desea hacer referencia a la hoja activa puede utilizar ActiveSheet, as, el primer
ejemplo lo dejaremos de la manera siguiente.

Sub Primero()

ActiveSheet.Range("A1").Value = "Hola"

End Sub

Si desea poner "Hola" (o cualquier valor) en la casilla activa, puede utilizar la propiedad
(objeto) Activecell de WorkSheets. As para poner "Hola" en la casilla activa de la hoja
activa seria,

Sub Primero()

ActiveSheet.ActiveCell.Value = "Hola"

End Sub

Para terminar con este primer ejemplo. WorkSheets estn dentro del Objeto
WorkBooks (libros de trabajo) y WorkBooks estn dentro de Application.
Application es el objeto superior, es el que representa la aplicacin Excel. As, el
primer ejemplo, siguiendo toda la jerarqua de objetos quedara de la forma siguiente.

Sub Primero()

Application.WorkBooks(1).WorkSheets(1).Range("A1").Value = "Hola"

End Sub

Insistiendo con la nomenclatura, Application casi nunca es necesario especificarlo,


piense que todos los objetos dependen de este, WorkBooks ser necesario
implementarlo si en las macros se trabaja con diferentes libros de trabajo (diferentes
archivos), a partir de WorkSheets, es aconsejable incluirlo en el cdigo, sobre todo si se
quiere trabajar con diferentes hojas, ver, sin embargo, que en muchas ocasiones no se
aplica.

Ejecutar un procedimiento o funcin


Pruebe ejecutar el primer procedimiento de ejemplo.

1. Site el cursor dentro del procedimiento.


2. Active opcin de la barra de mens Ejecutar/ Ejecutar Sub Userform.
Tambin puede hacer clic sobre el botn o pulsar la tecla F5.

Para ejecutar el procedimiento desde la hoja de clculo.

Debe estar en una hoja, no en el editor de Visual Basic


1. Active opcin de la barra de mens Herramientas/ Macro/ Macros. Se
despliega una ventana que muestra una lista donde ests todas las macros
incluidas en el libro de trabajo.
2. Seleccione la macro de la lista y pulse sobre el botn Ejecutar.

Ejemplo 2

En este segundo ejemplo simplemente ampliaremos la funcionalidad de la macro del


ejemplo 1. Adems de escribir "Hola" en la casilla A1 de la Hoja 1, la pondremos en
negrita y le daremos color al texto. Para ello utilizaremos las propiedades Bold y Color
del objeto Font.

Sub Segundo()

ActiveSheet.Range("A1").Value = "Hola"

ActiveSheet.Range("A1").Font.Bold = True

ActiveSheet.Range("A1").Font.Color = RGB(255,0,0)

End Sub

True.

True, que traducido es verdadero, simplemente indica que la propiedad Bold est
activada. Si se deseara desactivar, bastara con igualarla al valor False.

La funcin RGB
Observe que para establecer el color de la propiedad se utiliza la funcin RGB(Red,
Green, Blue), los tres argumentos para esta funcin son valores del 0 a 255 que
corresponden a la intensidad de los colores Rojo, Verde y Azul respectivamente.

Referenciar un rango de celdas.

Slo tiene que cambiar a la forma Casilla_Inicial:Casilla_Final. Por ejemplo aplicar el


ltimo ejemplo al rango de casillas que va de la A1 a la A8, ponga.

Sub Segundo()

ActiveSheet.Range("A1:A8").Value = "Hola"

ActiveSheet.Range("A1:A8").Font.Bold = True

ActiveSheet.Range("A1:A8").Font.Color = RGB(255,0,0)

End Sub
Variables
A continuacin vamos a repetir el programa Ejemplo1, pero en lugar de poner "Hola" en
la casilla A1 de la hoja activa, dejaremos que el usuario entre un texto desde teclado y a
continuacin guardaremos ese valor en esa casilla. Observe que el valor que entre del
usuario debe guardarse en algn lugar para poder ponerlo despus en la casilla A1; pues
bien, ese valor se guardar en una variable. Una variable es simplemente un trozo de
memoria que la funcin o procedimineto se reserva para guardar datos, la forma general
de declarar una variable es

DIM variable AS tipo.

Siendo variable el nombre que se asigna a la misma y Tipo el tipo de datos que se
guardarn (nmeros, texto, fecha, boleanos,...). En nuestro ejemplo, declararemos la
variable de tipo String (tipo texto), y lo haremos de la forma siguiente.

Dim Texto As String

Con esto estamos indicando que se reserve un trozo de memoria (el que sea) , que se
llama Texto y que el tipo de datos que se guardarn ah sern caracteres.

La funcin InputBox
Esta funcin muestra una ventana para que el usuario pueda teclear datos. Cuando se
pulsa sobre Aceptar, los datos entrados pasan a la variable a la que se ha igualado la
funcin. Vea la lnea siguiente.

Texto = InputBox("Introduzca el texto", "Entrada de datos").

Si en la ventana que muestra InputBox pulsa sobre el botn Aceptar, los datos tecleados
se guardarn el la variable Texto.

Estructuras condicionales
Los bucles son un componente fundamental de cualquier lenguaje de programacin. Si
conoces algn lenguaje, con toda seguridad te habrs encontrado con un bucle For
Next. Afortunadamente, VBA soporta todos los bucles normales adems de un bucle
especial que es excelente para utilizar con VBA.

Bucles For...Next
stas son las construcciones de bucle ms comunes. Todo lo que se encuentre entre For
y Next se ejecute mltiples veces. Cada vez que se ejecuta el cdigo, una determinada
variable de contador (especificada en el parmetro For) tiene un valor diferente.
Tenemos el siguiente cdigo:

For i = 1 To 10

Cells(i, i).Value = i

Next i

Cuando el programa se empieza a ejecutar, hemos asignado a la variable de contador el


nombre de i. la primera vez que pasa por el cdigo, la variable i est establecida en 1.
La primera vez que se ejecuta el bucle, i es igual a 1, por lo que la celda en la Fila 1 y
Columna 1 estar establecida en 1 (mira el dibujo).

Miremos detenidamente lo que sucede cuando VBA llega a la lnea que dice Next i.
Antes de ejecutar esta lnea, la variable i es igual a 1. Durante la ejecucin de Next i,
VBA debe tomar una decisin. VBA aade 1 a la variable i y la compara con el valor
mximo en la clusula To del parmetro For. Si se encuentra dentro de los lmites
especificados en la clusula To, entonces el bucle no se acaba. En este caso, el valor de i
se incrementa a 2. La ejecucin del cdigo vuelve entonces a la primera lnea del cdigo
detrs del parmetro For.

La segunda vez que se pasa por el bucle, el valor de i es 2. La celda en Fila2, Columna
2, (es decir, la celda B2) tiene un valor de 2, como muestra el dibujo:

A medida que contina el proceso, el parmetro Next i avanza i hasta 3, 4, etc. En el


dcimo paso por el bucle, la celda en Fila 10 Columna 10 tiene asignado el valor de 10.

VBA tiene que tomar ahora una decisin. Aade 1 a la variable i. i tiene ahora un valor
de 11, que es mayor que el lmite en el bucle ForNext. VBA mueve entonces la
ejecucin a la siguiente lnea en la macro detrs del parmetro Next. En caso de querer
volver a utilizar la variable i a lo largo de la macro, es importante darse cuenta de que
podra incrementar ms all del lmite especificado en la clusula To del parmetro For.
Al final del bucle se obtiene el resultado que se muestra en el siguiente dibujo:

El uso comn para un bucle de estas caractersticas es pasar por todas las filas en un
conjunto de datos y decidir realizar alguna accin en base a un criterio.

Salir de un bucle antes de cumplirse una


condicin
Habr momentos en que no necesitemos ejecutar todo el bucle. Quizs, simplemente
solo haya que pasar por el conjunto de datos hasta que que un registro cumple ciertos
criterios. En este caso, tendremos que encontrar el primer registro y luego detener el
bucle. Existe un parmetro denominado Exit For para realizar esto.

La siguiente macro busca una fila en el conjunto de datos donde el concepto en la


columna F es positivo y el concepto en la columna E es 0. Si se encuentra dicha fila,
podras indicar un mensaje que el archivo se tiene que procesar hoy manualmente y
mover el cursor a esa fila:

filafinal = Cells(65536, 1).End(xlUp).Row


Problema = False
For i = 1 To filafinal
If Cells(i, 6).Value > 0 Then
If Cells(i, 5).Value = 0 Then
Cells(i, 6).Select
Problema = True
Exit For
End If
End If
Next i

If Problema Then
MsgBox " Hay un problema en la fila " & i
Exit Sub
End If
Variaciones en un For...Next
En un bucle ForNext es posible hacer que la variable del bucle salte por algo que no
sea 1. Podramos utilizarlo para aplicar un formato de color verde a una fila s y a otra
no en un conjunto de datos, por ejemplo. En este caso querremos que la variable de
contador i examine una fila s y otra no en el conjunto de datos. Esto se indica al aadir
la clusula Step al final del parmetro For.

filafinal = Cells(65536, 1).End(xlUp).Row


For i = 2 To filafinal Step 2
Cells(i, 1).Resize(1, 8).Interior.ColorIndex = 35
Next i

Mientras se ejecuta este cdigo VBA aade una sombra de color verde claro a las filas
2, 4, 6, etc.

La clusula Step puede fcilmente ser cualquier nmero. Es posible que quieras
comprobar cada diez filas de un conjunto de datos y extraer una muestra aleatoria. En
este caso, utilizaras Step 10.

Tambin podemos hacer que un bucle ForNext se ejecute hacia atrs, de superior a
inferior. Esto es particularmente til si ests eliminando filas de forma selectiva. Para
ello, invertiremos el orden del parmetro For y haremos que la clusula Step
especifique un nmero negativo:

filafinal = Cells(65536, 1).End(xlUp).Row


For i = filafinal To 2 Step -1
If Cells(1, 3).Value = "Borrar" Then
Cells(i, 1).EntireRow.Delete
End If
Next i

Вам также может понравиться