Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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:
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.
Application.Workbooks(Libro1.xlsx)
Application.Workbooks(Libro1.xlsx).Worksheets(Hoja1)
Application.Workbooks(Libro1.xlsx).Worksheets(Hoja1).Range(
A1)
Worksheets (Hoja1).Range(A1)
Si sabes que la hoja active es Hoja1, puedes simplificar la referencia todava
ms:
Range(A1)
Worksheets (Hoja1).Range(A1).Value
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.
Por ejemplo, para borrar los contenidos de la celda A1 de la hoja activa utiliza:
Range(A1).ClearContents
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.
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.
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.
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
End Sub.
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
Ejemplo 2
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.
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
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.
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.
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
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:
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.
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.
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: