Curso MACROS
Curso MACROS
Curso MACROS
AUTOMATIZACION DE
EXCEL
MACROS:
CONCEPTOS GENERALES
1. Seleccionarla
2. Abrir la paleta de bordes y colocar un borde exterior
3. Abrir la paleta de color de fondo y escoger un color
4. Abrir la paleta de color de texto y escoger un color
5. Pulsar un click en el botón del formato monetario
6. Pulsar un click en el botón del formato cursiva
7. Pulsar un click fuera de la tabla y extasiarnos con su belleza
Estos han sido sólo 7 pasos. Imagine una tarea rutinaria de 200 pasos. Para ello, podemos
crear una macro que nos realice el trabajo automáticamente. Evidentemente, los pasos de
la macro han de ser los correctos, evitando abrir y cerrar menús y opciones
innecesariamente, por lo que la macro tardaría más en ejecutarse.
- Sitúese en la Hoja1
- Abra el menú Herramientas - Macro - Grabar nueva macro. Aparecerá una ventana
donde deberá escribir un nombre para la macro o aceptar el que le ofrece Excel (Macro1)
- Acepte el cuadro de diálogo. Sale un pequeño botón con el que podemos finalizar la
grabación o hacer una pausa en la macro.
1. Seleccione la tabla
MODIFICACIÓN DE LA MACRO
Sub y End Sub marcan el inicio y el fin de la rutina, respectivamente. De momento no nos
comeremos mucho la cabeza con las rutinas. Simplemente tendremos una idea de cómo
trata Excel las macros. En posteriores lecciones veremos cómo modificar el código de una
macro a nuestro gusto.
- Cierre la ventana. Observe que deberá cerrar una ventana especial (Visual Basic) para
retornar a la ventana de Excel normal
EJECUCIÓN DE LA MACRO
Una Macro escrita por nosotros se ejecuta exactamente igual que si se tratase de
cualquier otra Macro.
1.- Abra el libro donde tienes guardada la Macro que creamos en la lección
anterior.
4.- Haga un clic sobre este nombre y después pulse el botón Ejecutar.
Ya hemos visto como crear, guardar y ejecutar Macros creadas utilizando el Editor
de Visual Basic.
A partir de esta lección iremos viendo pequeñas Macros que realizarán cosas muy
concretas. Estas Macros se podrán ir entrelazando para así poder conseguir lo que
nosotros deseamos.
Las macros que vamos a ver a lo largo de este curso las vamos a ir programando
directamente con el Editor de Visual Basic que viene incorporado con el mismo Excel.
Una vez seleccionada se abrirá una nueva ventana con dos ventanas acopladas a la
izquierda. La superior es la ventana que llamamos: de Proyecto y la inferior la de
Propiedades. En la primera aparecerán los elementos que forman parte de cada
Proyecto (grupo de macros y hojas de Excel) y la segunda son las propiedades de los
objetos que se pueden incorporar a nuestras macros. Más adelante veremos como se
utilizan estas dos ventanas y todas sus características.
Observe como en la ventana superior aparece una nueva carpeta llamada Módulos
y en su interior un nuevo elemento llamado Módulo1. Dentro de este módulo será
donde guardemos las macros que iremos creando.
Vamos a crear una Macro y esta nos servirá de ejemplo para ver como se deben
escribir.
Crearemos una Macro muy sencilla la cual nos servirá para que la página activa
pase a ser la segunda.
Sub Cambiardehoja()
Worksheets(2).Activate
End Sub
El comando Sub indica el principio de la Macro, mientras que End Sub marca el
final de esta. A continuación del comando Sub hemos puesto el nombre que deseamos
dar a nuestra Macro. Observe como después del nombre aparece un paréntesis que se
cierra y otro que se abre.
Vamos a ver tres Macros que trabajarán directamente con libros. Con ellas
podremos abrir un libro existente, activar un libro y por último crear un libro nuevo.
Sub AbrirLibro()
Workbooks.Open("C:\Misdocumentos\Ejemplo.xls")
End Sub
Sub ACtivarLibro()
Workbooks("Ejemplo.xls").Activate
End Sub
Con la siguiente Macro podremos crear un libro nuevo. Esta Macro es exactamente
igual que si activásemos la opción Archivo - Nuevo.
Sub NuevoLibro()
Workbooks.Add
End Sub
Los nombres de las Macros no tienen porqué ser necesariamente los mismos que
hemos puesto nosotros. Le recomiendo escriba estas MAcros y las ejecute para ver
como funcionan.
Vamos a ver Macros que nos permitan movernos por las celdas que contiene un
libro.
Podemos utilizar esta Macro para poder situarnos al final de una lista de
elementos. Interpretaremos que el final de la misma está en el momento en el que
encontramos una celda vacía.
Sub Final()
While ActiveCell.Value <> ""
ActiveCell.Offset(1,0). Select
Wend
End Sub
Deberemos observar que con esta Macro siempre queda activada la primera
celda que está en blanco después de toda la lista.
Vamos a imaginar que tenemos una tabla de datos en la cual nos interesa
buscar un elemento determinado y borrar todos los datos que hay en la misma fila.
Pongamos el caso que tenemos una tabla con nombre, población y teléfono y
deseamos buscar todos los datos de una población determinada y borrar el nombre y
la población Para hacer la búsqueda deberemos situarnos en la fila que se encuentra la
población.
Sub BorrarFilas()
While ActiveCell.Value <> ""
If ActiveCell.Value <> "Mendoza" Then
ActiveCell.Offset(1, 0).Select
Else
Selection.EntireRow.Delete
End If
Wend
End Sub
Imaginemos que tenemos una lista de datos dentro de la que hay espacios en
blanco, como mucho un espacio en blanco entre dato y dato. Si utilizásemos la primera
macro que hemos creado esta interpretaría como final de la lista el primer espacio en
blanco que encontrara. Realizaremos una macro que interpretará el final de la lista
cuando encuentre 2 espacios en blanco seguidos.
Sub FinalListaEspecial()
Salir = "No"
While Salir = "No"
While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Wend
ActiveCell.Offset(1, 0).Select
Los nombres de las Macros no tienen porqué ser necesariamente los mismos que
hemos puesto nosotros. Le recomendamos escribir estas Macros y ejecutarlas para ver
como funcionan.
Supongamos una empresa ficticia llamada "Libros Gromepeich" la cual se dedica a repartir
en las 4 provincias de Cataluña (Barcelona, Tarragona, Lérida y Gerona) sus libros,
clasificados por módulos (Venta minorista y venta mayorista), dentro de cada módulo por
categorías (Infantil, Arte, etc) y dentro de cada categoría por distintos niveles de precios
(Bajo, medio y alto) tal y como se muestra en la figura de la derecha. Tenemos, aparte una
pequeña hoja (si baja el archivo lo verá) con los tres tipos de precios.
Vamos a automatizar una serie de tareas a base de macros para recoger un informe de los
pedidos del mes anterior extrayéndolo del sistema de proceso de pedidos. El secreto de un
buen sistema de macros no está en crear una súper-macro largísima, sino en crear
pequeñas macros que realicen tareas y luego unirlas.
Si intentamos hacer toda la macro seguida, habrá que realizar cuatrocientos pasos, cruzar
los dedos, desearse lo mejor, y.... que no hayan demasiados fallos.
- Acceda a Edición - Ir a... (o bien pulsa F5), Especial... activa la casilla Celdas en
blanco y acepte.
b) Observar la macro
Vamos a ver cómo es el código de nuestra macro:
Sub RellenarEtiquetas()
'
' RellenarEtiquetas Macro
' Macro grabada el 22/01/01 por Miguel Laffont
'
Range("A1").Select
Selection.CurrentRegion.Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "=R[-1]C"
Range("A1").Select
Selection.CurrentRegion.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Como siempre, la macro comienza con Sub y finaliza con EndSub, y en su interior están
las sentencias que corresponden a las tareas.
La sentencia:
c) Ejecución de la macro
Para probar la macro, realice una copia de la hoja original y acceda a Herramientas -
Macro - Macros... y pulse el botón Ejecutar. La macro se ejecuta llenando las celdas
vacías.
Observe que al finalizar la ejecución de la macro, aún existe un rango de celdas que queda
seleccionado en color negro. Podríamos haber pulsado la tecla Esc y un click en cualquier
celda para desactivar esta zona, pero lo hemos hecho así porque vamos a ver cómo
podemos modificar y "tocar" el código de la macro.
- Suba hasta A1 y coloque los colores de texto (negrita) y fondo (azul claro) como en las
celdas de su derecha.
La macro volvería a colocar el mes de Marzo en el informe del próximo mes. Una solución
sería cambiar la macro cada mes con la nueva fecha, pero no parece la solución más
adecuada. Lo que haremos será que Excel nos pregunte la fecha a introducir.
Lo que hacemos es insertar la función InputBox que nos pedirá mediante un cuadro que le
introduzcamos un dato. A continuación, la macro rellenará las celdas con el dato que le
introduzcamos.
- Coloque esta última celda con el formato negrita y fondo azul claro
Esta fórmula busca el precio Medio (E2) de la primera columna del rango A1:C4 de la hoja
Precios. A continuación devuelva el valor de la columna número 2 de la lista. Así pues, el
precio para la venta Minorista de un libro con un precio medio es de 4,5 pesos.
EJERCICIOS DE APLICACIÓN:
En esta lección vamos a ver una macro la cual nos permitirá comparar dos columnas
de elementos, eliminando de la primera los elementos que existan en la segunda. Esta
macro me la pidieron para hacer borrar muchos elementos de una lista sin tener que
buscar uno a uno. En la primera columna están todos los elementos que forman parte
de la lista y en la segunda columna se van colocando los elementos que se desean
buscar y eliminar de la primera.
1 Sub Repetidos()
2 Range("B1").Select
3 Posicion = 1
4 While ActiveCell.Value <> ""
Antes de realizar la explicación tenemos que dejar muy claro que la columna A, será
donde tengamos todos los datos de nuestra lista y la columna B, los datos que
deseamos buscar y eliminar de la primera columna.
Línea 2: Con esta instrucción nos situamos en la primera celda de la columna B para
empezar a buscar los datos que deseamos borrar.
Línea 3: Creamos una variable llamada Posición para controlar en que fila nos
encontramos de la segunda columna
Línea 4: Aquí creamos un bucle que se repetirá hasta que no se terminen los
elementos a buscar.
Línea 7: Creamos una nueva variable llamada Salir con la que controlaremos si
debemos salir del bucle o no. Solamente saldremos en el momento en el que se
encuentre un elemento que está en la segunda y primera columna.
Línea 8: Aquí iniciamos un bucle que se repetirá hasta que se llegue al final de la
primera columna, (caso que se dará cuando no existan elementos comunes) o hasta
que se encuentre un elemento común, (esto nos lo indicará la variable Salir).
Línea 15: Aquí empezamos el caso en el que el valor que tenemos seleccionado en la
primera columna con el valor de la variable valorcomparacion no sea coincidente.
Lìnea 16: Si no coinciden los datos lo que hacemos es avanzar una posición dentro de
la primera columna.
Línea 20: Pasamos a la segunda columna para continuar con la comparación de los
elementos.
Línea 21: Avanzamos en la segunda columna tantas veces como se nos indique en la
variable Posición para iniciar nuevamente el proceso de comparación entre los
elementos de ambas columnas.
Hasta este momento hemos visto como poner en funcionamiento una macro utilizando
el menú de herramientas Herramientas - Macro tal y como explicamos en lecciones
anteriores. En muchas ocasiones puede ser que realicemos una macro la cual
tengamos que poner en funcionamiento muchas veces con lo que el hecho de abrir el
menú y buscar dicha macro nos puede ser un poco engorroso.
3.- Para nuestro ejemplo podríamos poner como nombre: Mis macros.
Podremos ver como dentro de la barra: Mis macros aparece el botón que hemos
arrastrado.
10.- Pulse este botón, muevase hasta la opción: Cambiar imagen del botón.
16.- De esta nueva ventana escoja la macro que desea asignar a este botón. En
nuestro caso seleccionaremos: EliminarRepetidosyRegistro, macro que servía para
eliminar elementos repetidos de una lista y crear un informe con el número de
repeticiones.
Ahora ya puede poner la barra en el lugar que más le convenga y utilizar este botón
siempre que quiera.
REFERENCIAS
DEL LENGUAJE
Y
EJEMPLOS
-17-
CURSO DE
AUTOMATIZACION DE
EXCEL
ACTIVAR UN LIBRO
Al activar un libro utilizando el método Activate, el libro se coloca en la ventana activa. El siguiente
procedimiento activa el libro abierto denominado "MiLibro.xls".
Sub Activar()
Workbooks("MiLibro.xls").Activate
End Sub
Para crear un nuevo libro en Visual Basic, utilize el método Add. El siguiente procedimiento crea un
nuevo libro. Microsoft Excel asigna automáticamente el nombre LibroN al libro, donde N es el siguiente
número disponible. El nuevo libro se convertirá en el libro activo.
Sub AgregarUno()
Workbooks.Add
End Sub
Una manera mejor de crear un nuevo libro es asignarlo a una variable de objeto. En el siguiente
ejemplo, el objeto Workbook devuelto por el método Add se asigna a la variable de objeto, nuevoLibro. A
continuación, se establecen varias de las propiedades de nuevoLibro. Puede controlar fácilmente el
nuevo libro utilizando la variable de objeto.
Sub AgregarNuevo()
Set nuevoLibro = Workbooks.Add
With nuevoLibro
.Title = "Ventas 1995"
.Subject = "Ventas"
.SaveAs filename:="Ventas95.xls"
End With
End Sub
Al abrir un nuevo libro utilizando el método Open, se convierte en un miembro del conjunto Workbooks.
El siguiente procedimiento abre un libro denominado MiLibro.xls, ubicado en la carpeta "MiCarpeta", en
la unidad C.
Sub AbrirLo()
Workbooks.Open("C:\MiCarpeta\MiLibro.xls")
End Sub
Un número de índice es un número secuencial asignado a una hoja, según la posición de su etiqueta,
contando desde la izquierda, respecto a las hojas del mismo tipo. El siguiente procedimiento utiliza la
propiedad Worksheets para activar la hoja de cálculo uno del libro activo.
Sub LaPrimera()
Worksheets(1).Activate
End Sub
Si desea trabajar con todos los tipos de hojas (hojas de cálculo, de gráficos, de módulos y de diálogo),
utilice la propiedad Sheets. El siguiente procedimiento activa la hoja cuatro del libro.
Sub LaCuarta()
-18-
CURSO DE
AUTOMATIZACION DE
EXCEL
Sheets(4).Activate
End Sub
Nota El orden del índice puede variar al mover, agregar o eliminar hojas.
Puede identificar las hojas por su nombre, utilizando las propiedades Worksheets y Charts. Las
siguientes instrucciones activan varias hojas del libro activo.
Worksheets("Hoja1").Activate
Charts("Gráfico1").Activate
DialogSheets("Diálogo1").Activate
Puede utilizar la propiedad Sheets para devolver una hoja de cálculo, de gráficos, de módulo o de
cuadro de diálogo, incluidos todos en el conjunto Sheets. El siguiente ejemplo activa la hoja denominada
"Gráfico1" del libro activo.
Sub ActivarGráfico()
Sheets("Gráfico1").Activate
End Sub
Nota Los gráficos incrustados en una hoja de cálculo son miembros del grupo ChartObjects, aunque
los gráficos que poseen sus propias hojas pertenecen al conjunto Charts.
Una tarea común cuando se utiliza Visual Basic es especificar una celda o rango y, a continuación,
realizar alguna acción en ellas, como escribir una fórmula o cambiar el formato. Normalmente esto se
realiza en una instrucción que identifica el rango y, además, cambia una propiedad o aplica un método.
Un objeto Range en Visual Basic puede ser una celda individual o un rango de celdas. Los siguientes
temas muestran las maneras más usuales de identificar y trabajar con objetos Range.
Puede hacer referencia a una celda o rango de celdas del estilo de referencia A1
utilizando el método Range. El siguiente procedimiento Sub cambia el formato de las
celdas A1:D5 a negrita.
Sub FormatoRango()
Workbooks("Libro1").Sheets("Hoja1").Range("A1:D5") _
.Font.Bold = True
End Sub
Referencia Significado
Range("A1") Celda A1
Range("A1:B5") Celdas de la A1 a la B5
Range("C5:D9,G9:H16")Selección de varias áreas
Range("A:A") Columna A
Range("1:1") Fila uno
Range("A:C") Columnas de la A a la C
Range("1:5") Filas de la uno a la cinco
Range("1:1,3:3,8:8") Filas uno, tres y ocho
-19-
CURSO DE
AUTOMATIZACION DE
EXCEL
Range("A:A,C:C,F:F") Columnas A, C y F
Puede utilizar la propiedad Cells para hacer referencia a una sola celda utilizando los
números de fila y de columna. Esta propiedad devuelve un objeto Range que representa
una sola celda. En el siguiente ejemplo, Cells(6,1) devuelve la celda A6 de la Hoja1.
Entonces, la propiedad Value se establece en 10.
Sub EscribirValor()
Worksheets("Hoja1").Cells(6, 1).Value = 10
End Sub
La propiedad Cells funciona bien para ejecutar bucles en un rango de celdas, ya que
puede sustituir las variables por los números de índice, como se muestra en el siguiente
ejemplo.
Sub BucleAtravés()
Dim contador As Integer
For contador = 1 To 20
Worksheets("Hoja1").Cells(contador, 3).Value = contador
Next contador
End Sub
Utilice la propiedad Rows o Columns para trabajar con filas o columnas enteras. Estas
propiedades devuelven un objeto Range que representa un rango de celdas. En el
siguiente ejemplo, Rows(1) devuelve la fila uno de la Hoja1. A continuación, la propiedad
Bold del objeto Font del rango se establece en True.
Sub FilaNegrita()
Worksheets("Hoja1").Rows(1).Font.Bold = True
End Sub
Referencia Significado
Rows(1) Fila uno
Rows Todas las filas de la hoja de cálculo
Columns(1) Columna uno
Columns("A") Columna uno
Columns Todas las columnas de la hoja de cálculo
Para trabajar con varias filas o columnas al mismo tiempo, cree una variable de objeto y
utilice el método Union, combinando varias llamadas a la propiedad Rows o Columns. El
siguiente ejemplo cambia a negrita el formato de las filas uno, tres y cinco de la hoja de
cálculo uno del libro activo.
Sub VariasFilas()
Worksheets("Hoja1").Activate
Dim miUnión As Range
Set miUnión = Union(Rows(1), Rows(3), Rows(5))
-20-
CURSO DE
AUTOMATIZACION DE
EXCEL
miUnión.Font.Bold = True
End Sub
Puede utilizar el estilo de referencia A1 o un rango con nombre entre paréntesis como
método abreviado para la propiedad Range. No es necesario escribir la palabra "Range" o
utilizar comillas, como se muestra en los siguientes ejemplos.
Sub BorrarRango()
Worksheets("Hoja1").[A1:B5].ClearContents
End Sub
Sub EstablecerValor()
[MiRango].Value = 30
End Sub
Es más sencillo identificar los rangos por nombre que por la notación A1. Para asignar un
nombre a un rango seleccionado, haga clic en el cuadro de nombre situado a la izquierda
de la barra de fórmulas, escriba un nombre y, a continuación, presione la tecla ENTRAR.
Sub FormatoRango()
Range("MiLibro.xls!MiRango").Font.Italic = True
End Sub
Sub FormatoVentas()
Range("[Informe.xls]Hoja1!Ventas").BorderAround weight:=xlthin
End Sub
Para seleccionar un rango con nombre utilice el método GoTo, que activa el libro y la hoja
de cálculo y, a continuación, selecciona el rango.
Sub BorrarRango()
Application.Goto Reference:="MiLibro.xls!MiRango"
Selection.ClearContents
End Sub
Sub BorrarRango()
Application.Goto Reference:="MiRango"
Selection.ClearContents
End Sub
-21-
CURSO DE
AUTOMATIZACION DE
EXCEL
El siguiente ejemplo ejecuta un bucle en cada celda del rango con nombre, utilizando el
bucle For Each...Next. Si el valor de alguna celda del rango excede el valor de limit, el
color de la celda cambia a amarillo.
Sub AplicarColor()
Const limit As Integer = 25
For Each c In Range("MiRango")
If c.Value > limit Then
c.Interior.ColorIndex = 27
End If
Next c
End Sub
Una manera de trabajar con una celda relacionada con otra es utilizar la propiedad Offset.
El siguiente ejemplo asigna un formato de doble subrayado al contenido de la celda
situada una fila más abajo y a tres columnas de la hoja de cálculo activa.
Sub Subrayar()
ActiveCell.Offset(1, 3).Font.Underline = xlDouble
End Sub
Nota Puede grabar macros que utilicen la propiedad Offset en lugar en referencias
absolutas. En el menú Herramientas, señale Grabar macro y, a continuación, haga clic en
Usar referencias relativas.
Para ejecutar un bucle en un rango de celdas, utilice en el rango una variable con la
propiedad Cells. El siguiente ejemplo rellena las primeras 20 celdas de la tercera columna
con valores entre 5 y 100, en incrementos de 5. La variable contador se utiliza como
índice de fila para la propiedad Cells.
Sub BucleAtravés()
Dim contador As Integer
For contador = 1 To 20
Worksheets("Hoja1").Cells(contador, 3).Value = contador * 5
Next contador
End Sub
Si establece una variable de objeto para un objeto Range, puede manipular fácilmente el
rango utilizando el nombre de la variable.
El siguiente procedimiento crea la variable de objeto miRango y, a continuación, asigna la
variable al rango A1:D5 de la Hoja1 del libro activo. Las instrucciones posteriores
modifican las propiedades del rango, sustituyendo el nombre de la variable por el objeto
del rango.
Sub Aleatorio()
Dim miRango As Range
Set miRango = Worksheets("Hoja1").Range("A1:D5")
miRango.Formula = "=ALEATORIO()"
miRango.Font.Bold = True
End Sub
-22-
CURSO DE
AUTOMATIZACION DE
EXCEL
Al aplicar la propiedad Cells a una hoja de cálculo sin especificar un número de índice, el
método devuelve un objeto Range que representa todas las celdas de la hoja de cálculo.
El siguiente procedimiento Sub borra el contenido de todas las celdas de la Hoja1 del libro
activo.
Sub BorrarHoja()
Worksheets("Hoja1").Cells.ClearContents
End Sub
Utilizando el método apropiado puede hacer referencia fácilmente a varios rangos. Utilice
los métodos Range y Union para hacer referencia a cualquier grupo de rangos; utilice la
propiedad Areas para hacer referencia al grupo de rangos seleccionados en una hoja de
cálculo.
Puede hacer referencia a varios rangos con la propiedad Range, pero debe poner comas
entre dos o más referencias. El siguiente ejemplo borra el contenido de los tres rangos de
la Hoja1.
Sub BorrarRangos()
Worksheets("Hoja1").Range("C5:D9,G9:H16,B14:D18").ClearContents
End Sub
Los rangos con nombre permiten que la propiedad Range funcione más fácilmente con
varios rangos. El siguiente ejemplo funciona cuando los tres rangos con nombre están en
la misma hoja.
Sub BorrarNombrada()
Range("MiRango, TuRango, SuRango").ClearContents
End Sub
Sub RangosVarios()
Dim r1, r2, misVariosRangos As Range
Set r1 = Sheets("Hoja1").Range("A1:B2")
Set r2 = Sheets("Hoja1").Range("C3:D4")
Set miVariosRangos = Union(r1, r2)
miVariosRangos.Font.Bold = True
End Sub
Puede utilizar la propiedad Areas para hacer referencia al rango o conjunto de rangos
seleccionados en una selección de varias áreas. El siguiente procedimiento cuenta las
áreas de la selección. Si existe más de un área, se muestra un mensaje de advertencia.
Sub EncontrarVarios()
If Selection.Areas.Count > 1 Then
MsgBox "Imposible realizar una selección múltiple."
End If
-23-
CURSO DE
AUTOMATIZACION DE
EXCEL
End Sub
Al utilizar Visual Basic, con frecuencia necesitará ejecutar el mismo bloque de instrucciones en cada una
de las celdas de un rango. Para ello, combine una instrucción de repetición y uno o más métodos para
identificar cada celda, una a la vez, y ejecutar la operación.
Una manera de ejecutar un bucle en un rango es utilizar el bucle For...Next con la propiedad Cells. Al
utilizar la propiedad Cells, puede sustituir el contador del bucle, u otras variables o expresiones, por el
número de índice de las celdas. En el siguiente ejemplo se sustituye la variable contador por el índice de
fila. El procedimiento ejecuta un bucle en el rango C1:C20, estableciendo en 0 (cero) cualquier número
cuyo valor absoluto sea menor que 0.01.
Sub RedondeoACero1()
For contador = 1 To 20
Set Celda_a = Worksheets("Hoja1").Cells(contador, 3)
If Abs(Celda_a.Value) < 0.01 Then Celda_a.Value = 0
Next contador
End Sub
Otra manera sencilla de ejecutar un bucle en un rango es utilizar el bucle For Each...Next en el conjunto
de celdas devuelto por el método Range. Visual Basic establece automáticamente una variable de
objeto para la siguiente celda cada vez que se ejecuta el bucle. El siguiente procedimiento realiza un
bucle en el rango A1:D20, estableciendo en 0 (cero) cualquier número cuyo valor absoluto sea menor
que 0.01.
Sub RedondeoACero2()
For Each c In Worksheets("Hoja1").Range("A1:D10").Cells
If Abs(c.Value) < 0.01 Then c.Value = 0
Next
End Sub
Si no conoce los límites del rango en que desea ejecutar el bucle, puede utilizar la propiedad
CurrentRegion para devolver el rango que rodea la celda activa. Por ejemplo, el siguiente procedimiento,
cuando se ejecuta desde una hoja de cálculo, ejecuta un bucle en el rango que rodea la celda activa,
estableciendo en 0 (cero) todos los números cuyo valor absoluto sea menor que 0.01.
Sub RedondeoACero3()
For Each c In ActiveCell.CurrentRegion.Cells
If Abs(c.Value) < 0.01 Then c.Value = 0
Next
End Sub
Sub BorrarHoja()
Worksheets("Hoja1").Cells.ClearContents
End Sub
-24-
CURSO DE
AUTOMATIZACION DE
EXCEL
Puede hacer referencia a una celda o rango de celdas del estilo de referencia A1 utilizando el método
Range. El siguiente procedimiento Sub cambia el formato de las celdas A1:D5 a negrita.
Sub FormatoRango()
Workbooks("Libro1").Sheets("Hoja1").Range("A1:D5") _
.Font.Bold = True
End Sub
Referencia Significado
Range("A1") Celda A1
Range("A1:B5")Celdas de la A1 a la B5
Range("C5:D9,G9:H16") Selección de varias áreas
Range("A:A") Columna A
Range("1:1") Fila uno
Range("A:C") Columnas de la A a la C
Range("1:5") Filas de la uno a la cinco
Range("1:1,3:3,8:8") Filas uno, tres y ocho
Range("A:A,C:C,F:F") Columnas A, C y F
Sub Subrayar()
ActiveCell.Offset(1, 3).Font.Underline = xlDouble
End Sub
Nota Puede grabar macros que utilicen la propiedad Offset en lugar en referencias absolutas. En el
menú Herramientas, señale Grabar macro y, a continuación, haga clic en Usar referencias relativas.
Para ejecutar un bucle en un rango de celdas, utilice en el rango una variable con la propiedad Cells. El
siguiente ejemplo rellena las primeras 20 celdas de la tercera columna con valores entre 5 y 100, en
incrementos de 5. La variable contador se utiliza como índice de fila para la propiedad Cells.
Sub BucleAtravés()
Dim contador As Integer
For contador = 1 To 20
Worksheets("Hoja1").Cells(contador, 3).Value = contador * 5
Next contador
End Sub
Sub Aleatorio()
Dim miRango As Range
Set miRango = Worksheets("Hoja1").Range("A1:D5")
miRango.Formula = "=ALEATORIO()"
miRango.Font.Bold = True
-25-
CURSO DE
AUTOMATIZACION DE
EXCEL
End Sub
Sub EscribirValor()
Worksheets("Hoja1").Cells(6, 1).Value = 10
End Sub
La propiedad Cells funciona bien para ejecutar bucles en un rango de celdas, ya que puede sustituir las
variables por los números de índice, como se muestra en el siguiente ejemplo.
Sub BucleAtravés()
Dim contador As Integer
For contador = 1 To 20
Worksheets("Hoja1").Cells(contador, 3).Value = contador
Next contador
End Sub
Nota Si desea cambiar las propiedades de un rango de celdas, o aplicar un método a todo un rango a
la vez, utilice la propiedad Range. Para obtener más información vea Hacer referencia a celdas y rangos
usando notación A1.
Sub BorrarRango()
Worksheets("Hoja1").[A1:B5].ClearContents
End Sub
Sub EstablecerValor()
[MiRango].Value = 30
End Sub
Sub Varias()
Worksheets(Array("Hoja1", "Hoja2", "Hoja4")).Select
End Sub
Puede hacer referencia a varios rangos con la propiedad Range, pero debe poner comas entre dos o
más referencias. El siguiente ejemplo borra el contenido de los tres rangos de la Hoja1.
-26-
CURSO DE
AUTOMATIZACION DE
EXCEL
Sub BorrarRangos()
Worksheets("Hoja1").Range("C5:D9,G9:H16,B14:D18").ClearContents
End Sub
Los rangos con nombre permiten que la propiedad Range funcione más fácilmente con varios rangos. El
siguiente ejemplo funciona cuando los tres rangos con nombre están en la misma hoja.+
Sub BorrarNombrada()
Range("MiRango, TuRango, SuRango").ClearContents
End Sub
Puede combinar varios rangos en un objeto Range utilizando el método Union. El siguiente ejemplo crea
un objeto Range denominado misVariosRangos, los define como A1:B2 y C3:D4 y, a continuación,
asigna el formato de negrita a los rangos combinados.
Sub RangosVarios()
Dim r1, r2, misVariosRangos As Range
Set r1 = Sheets("Hoja1").Range("A1:B2")
Set r2 = Sheets("Hoja1").Range("C3:D4")
Set miVariosRangos = Union(r1, r2)
miVariosRangos.Font.Bold = True
End Sub
Puede utilizar la propiedad Areas para hacer referencia al rango o conjunto de rangos seleccionados en
una selección de varias áreas. El siguiente procedimiento cuenta las áreas de la selección. Si existe
más de un área, se muestra un mensaje de advertencia.
Sub EncontrarVarios()
If Selection.Areas.Count > 1 Then
MsgBox "Imposible realizar una selección múltiple."
End If
End Sub
Sub FormatoRango()
Range("MiLibro.xls!MiRango").Font.Italic = True
End Sub
El siguiente ejemplo hace referencia al rango de hojas de cálculo específico denominado "Hoja1!Ventas"
en el libro "MiLibro.xls".
Sub FormatoVentas()
Range("[Informe.xls]Hoja1!Ventas").BorderAround weight:=xlthin
End Sub
-27-
CURSO DE
AUTOMATIZACION DE
EXCEL
Para seleccionar un rango con nombre utilice el método GoTo, que activa el libro y la hoja de cálculo y,
a continuación, selecciona el rango.
Sub BorrarRango()
Application.Goto Reference:="MiLibro.xls!MiRango"
Selection.ClearContents
End Sub
El siguiente ejemplo muestra cómo se escribiría el mismo procedimiento para el libro activo.
Sub BorrarRango()
Application.Goto Reference:="MiRango"
Selection.ClearContents
End Sub
El siguiente ejemplo ejecuta un bucle en cada celda del rango con nombre, utilizando el bucle For
Each...Next. Si el valor de alguna celda del rango excede el valor de limit, el color de la celda cambia a
amarillo.
Sub AplicarColor()
Const limit As Integer = 25
For Each c In Range("MiRango")
If c.Value > limit Then
c.Interior.ColorIndex = 27
End If
Next c
End Sub
Sub FilaNegrita()
Worksheets("Hoja1").Rows(1).Font.Bold = True
End Sub
La siguiente tabla muestra algunas referencias de fila y columna, utilizando las propiedades Rows y
Columns.
Referencia Significado
Rows(1) Fila uno
Rows Todas las filas de la hoja de cálculo
Columns(1) Columna uno
Columns("A") Columna uno
Columns Todas las columnas de la hoja de cálculo
Para trabajar con varias filas o columnas al mismo tiempo, cree una variable de objeto y utilice el
método Union, combinando varias llamadas a la propiedad Rows o Columns. El siguiente ejemplo
cambia a negrita el formato de las filas uno, tres y cinco de la hoja de cálculo uno del libro activo.
Sub VariasFilas()
Worksheets("Hoja1").Activate
Dim miUnión As Range
Set miUnión = Union(Rows(1), Rows(3), Rows(5))
-28-
CURSO DE
AUTOMATIZACION DE
EXCEL
miUnión.Font.Bold = True
End Sub
Sub EscribirFórmula()
Worksheets("Hoja1").Range("D6").Formula = "=SUMA(D2:D5)"
End Sub
Para obtener ejemplos acerca de cómo utilizar métodos para controlar las celdas sin seleccionarlas, vea
Cómo hacer referencia a celdas y rangos.
El método Select activa las hojas y los objetos de las hojas; la propiedad Selection devuelve un objeto
que representa la selección actual de la hoja activa del libro activo. Antes de poder utilizar la propiedad
Selection, debe activar un libro, activar o seleccionar un hoja y, a continuación, seleccionar un rango, u
otro objeto, utilizando el método Select.
La grabadora de macros con frecuencia creará una macro que utilice el método Select y la propiedad
Selection. El siguiente procedimiento Sub se creó utilizando la grabadora de macros, y muestra cómo
trabajan juntas Select y Selection.
Sub Macro1()
Sheets("Hoja1").Select
Range("A1").Select
ActiveCell.FormulaR1C1 = "Nombre"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Dirección"
Range("A1:B1").Select
Selection.Font.Bold = True
End Sub
El siguiente ejemplo realiza la misma tarea, sin activar o seleccionar la hoja de cálculo o las celdas.
Sub Etiquetas()
With Worksheets("Hoja1")
.Range("A1") = "Nombre"
.Range("B1") = "Dirección"
.Range("A1:B1").Font.Bold = True
End With
End Sub
Si utiliza el método Select para seleccionar celdas, recuerde que Select sólo funciona en la hoja de
cálculo activa. Si ejecuta el procedimiento Sub desde el módulo, el método Select fallará a menos que el
procedimiento active la hoja de cálculo antes de utilizar el método Select en un rango de celdas. Por
ejemplo, el siguiente procedimiento copia una fila de la Hoja1 a la Hoja2 del libro activo.
Sub CopiarFilas()
Worksheets("Hoja1").Rows(1).Copy
-29-
CURSO DE
AUTOMATIZACION DE
EXCEL
Worksheets("Hoja2").Select
Worksheets("Hoja2").Rows(1).Select
Worksheets("Hoja2").Paste
End Sub
Puede utilizar el método Activate para activar una celda en una selección. Sólo puede haber una celda
activa, aunque se haya seleccionado un rango de celdas. El siguiente procedimiento selecciona un
rango y, a continuación, activa una celda del rango sin cambiar la selección.
Sub Activar()
Worksheets("Hoja1").Activate
Range("A1:D4").Select
Range("B2").Activate
End Sub
Si trabaja con el mismo rango en más de una hoja, utilice la función Array para especificar dos o más
hojas a seleccionar. El ejemplo siguiente da formato al borde de un rango tridimensional de celdas.
Sub FormatoHojas()
Sheets(Array("Hoja2", "Hoja3", "Hoja5")).Select
Range("A1:H1").Select
Selection.Borders(xlBottom).LineStyle = xlDouble
End Sub
El ejemplo siguiente aplica el método FillAcrossSheets para transferir los formatos y datos del rango de
la Hoja2 a los rangos correspondientes de todas las hojas de cálculo del libro activo.
Sub RellenarTodo()
Worksheets("Hoja2").Range("A1:H1") _
.Borders(xlBottom).LineStyle = xlDouble
Worksheets.FillAcrossSheets (Worksheets("Hoja2") _
.Range("A1:H1"))
End Sub
La propiedad ActiveCell devuelve un objeto Range que representa la celda que está activa. Puede
aplicar cualquiera de las propiedades o los métodos de un objeto Range a la celda activa, como en el
ejemplo siguiente.
Sub EstablecerValor()
Worksheets("Hoja1").Activate
ActiveCell.Value = 35
End Sub
Nota Sólo se puede trabajar con la celda activa cuando la hoja de cálculo en la que se encuentra sea la
hoja activa.
-30-
CURSO DE
AUTOMATIZACION DE
EXCEL
Puede utilizar el método Activate para designar cuál es la celda activa. Por ejemplo, el siguiente
procedimiento convierte a B5 en la celda activa y, a continuación, le da formato de negrita.
Sub EstablecerActivo()
Worksheets("Hoja1").Activate
Worksheets("Hoja1").Range("B5").Activate
ActiveCell.Font.Bold = True
End Sub
Nota Para seleccionar un rango de celdas, utilice el método Select. Para convertir una sola celda en
activa, utilice el método Activate.
Puede utilizar la propiedad Offset para pasar a la celda activa. El siguiente procedimiento inserta texto
en la celda activa del rango seleccionado y, a continuación, mueve la celda activa una celda a la
derecha, sin cambiar la selección.
Sub MoverActivo()
Worksheets("Hoja1").Activate
Range("A1:D10").Select
ActiveCell.Value = "Totales mensuales"
ActiveCell.Offset(0, 1).Activate
End Sub
La propiedad CurrentRegion devuelve un rango de celdas limitadas por filas y columnas en blanco. En el
siguiente ejemplo, la selección se amplía para incluir las celdas contiguas a la celda activa que contiene
datos. A continuación, se asigna el estilo Moneda a este rango.
Sub Región()
Worksheets("Hoja1").Activate
ActiveCell.CurrentRegion.Select
Selection.Style = "Moneda"
End Sub
La propiedad Item es la propiedad predeterminada de la mayoría de los conjuntos, por lo que puede
escribir la misma instrucción de una manera más precisa omitiendo la palabra clave Item.
Para obtener más información acerca de un conjunto específico, consulte el tema de la Ayuda
correspondiente a dicho conjunto o bien la propiedad Item del conjunto.
-31-
CURSO DE
AUTOMATIZACION DE
EXCEL
Aunque normalmente puede especificar un valor entero con la propiedad Item, puede ser más
conveniente que se devuelva un objeto por su nombre. Para poder usar un nombre con la propiedad
Item, debe asignar un nombre al objeto. Normalmente, esto se realiza estableciendo la propiedad Name
del objeto. El siguiente ejemplo crea una hoja de cálculo con nombre en el libro activo y después hace
referencia a la hoja por su nombre.
Algunos conjuntos tienen valores de índice predefinidos, que pueden emplearse para devolver objetos
únicos. Cada valor de índice predefinido está representado por una constante. Por ejemplo, especifique
una constante XlBordersIndex con la propiedad Item del conjunto Borders para que se devuelva un solo
borde.
El ejemplo siguiente establece el borde inferior de las celdas A1:G1 de la Hoja1 como una línea doble.
-32-
CURSO DE
AUTOMATIZACION DE
EXCEL
OBJETOS DE MICROSOFT OFFICE:
OBJETO APLICACIÓN:
Application
Objetos Relacionados
· Valores y opciones de toda la aplicación (por ejemplo, muchas de las opciones del cuadro de
diálogo Opciones, en el menú Herramientas).
· Métodos que devuelven objetos de nivel superior, como ActiveCell, ActiveSheet, etc.
Use la propiedad Application para devolver el objeto Application. El ejemplo siguiente aplica la propiedad
Windows al objeto Application.
Application.Windows("libro1.xls").Activate
El ejemplo siguiente crea un objeto hoja de cálculo de Microsoft Excel en otra aplicación y, a
continuación, abre un libro en Microsoft Excel.
-33-
CURSO DE
AUTOMATIZACION DE
EXCEL
Set xl = CreateObject("Excel.Hoja")
xl.Application.Workbooks.Open "nuevolib.xls"
Comentarios
Muchas propiedades y métodos que devuelven los objetos de interfaz de usuario más frecuentes, como
la celda activa (propiedad ActiveCell) pueden emplearse sin el calificador de objeto Application. Por
ejemplo, en lugar de escribir Application.ActiveCell.Font.Bold = True, puede escribir ActiveCell.Font.Bold
= True.
WorkBooks (Workbook)
Objetos Relacionados
Un conjunto de todos los objetos Workbook abiertos actualmente en la aplicación Microsoft Excel.
Use la propiedad Workbooks para devolver el conjunto Workbooks. El ejemplo siguiente cierra todos los
libros abiertos.
Workbooks.Close
Use el método Add para crear un nuevo libro vacío y agregarlo al conjunto. El ejemplo siguiente agrega
un libro nuevo vacío a Microsoft Excel.
Workbooks.Add
Use el método Open para abrir un archivo. Así creará un libro nuevo para el archivo abierto. El ejemplo
siguiente abre el archivo Matriz.xls como un libro de sólo lectura.
Para obtener más información acerca de cómo usar un solo objeto Workbook, vea el objeto Workbook.
WorkSheets (WorkSheet)
Objetos Relacionados
Un conjunto de todos los objetos Worksheet del libro especificado o activo. Cada objeto Worksheet
representa una hoja de cálculo.
Use la propiedad Worksheets para devolver el conjunto Worksheets. El ejemplo siguiente mueve todas
las hojas de cálculo al final del libro.
-34-
CURSO DE
AUTOMATIZACION DE
EXCEL
Worksheets.Move after:=Sheets(Sheets.Count)
Use el método Add para crear una nueva hoja de cálculo y agregarla al conjunto. El ejemplo siguiente
agrega dos nuevas hojas de cálculo antes de la hoja uno del libro activo.
Para devolver un solo objeto Worksheet, use Worksheets(índice), donde índice es el nombre o número
de índice de la hoja de cálculo. El ejemplo siguiente oculta la hoja de cálculo uno del libro activo.
Worksheets(1).Visible = False
El objeto Worksheet también es un elemento del conjunto Sheets. El conjunto Sheets contiene todas las
hojas del libro (hojas de gráficos y hojas de cálculo).
WorkBooks (Workbook)
WorkSheets (WorkSheet)
Charts (Chart)
Objetos Relacionados
Un conjunto de todas las hojas de gráficos del libro especificado o activo. Cada hoja de gráficos está
representada por un objeto Chart. No se incluyen los gráficos incrustados en hojas de cálculo o de
diálogo. Para obtener más información acerca de gráficos incrustados, vea los objetos Chart o
ChartObject.
Use la propiedad Charts para devolver el conjunto Charts. El ejemplo siguiente imprime todas las hojas
de gráficos del libro activo.
Charts.PrintOut
Utilice el método Add para crear una nueva hoja de gráficos y agregarla al libro. El ejemplo siguiente
agrega una nueva hoja de gráficos al libro activo y sitúa la hoja nueva inmediatamente después de la
hoja de cálculo llamada "Hoja1".
Charts.Add after:=Worksheets("Hoja1")
Puede combinar el método Add con el método ChartWizard para agregar un nuevo gráfico que contenga
datos de una hoja de cálculo. El ejemplo siguiente agrega un gráfico de líneas nuevo basado en las
celdas A1:A20 de la hoja de cálculo llamada "Hoja1".
With Charts.Add
.ChartWizard source:=Worksheets("Hoja1").Range("a1:a20"), _
gallery:=xlLine, title:="Datos de febrero"
End With
Para devolver un solo objeto Chart, use Charts(índice), donde índice es el nombre o número de índice
de la hoja de gráficos. El ejemplo siguiente cambia a rojo el color de la serie uno de la hoja de gráficos
uno.
-35-
CURSO DE
AUTOMATIZACION DE
EXCEL
Charts(1).SeriesCollection(1).Interior.Color = RGB(255, 0, 0)
El conjunto Sheets contiene todas las hojas del libro (hojas de gráficos y hojas de cálculo). Para
devolver un sola hoja, use Sheets(índice), donde índice es el nombre o número de la hoja.
PROPIEDAD BUILTINDOCUMENTPROPERTIES
Devuelve un conjunto DocumentProperties que representa todas las propiedades de documento
incorporadas en el libro especificado. Es de sólo lectura.
Comentarios
Puede hacer referencia a las propiedades de documento por el valor de índice o por nombre. En la
siguiente lista se muestran los nombres de todas las propiedades de documento incorporadas
disponibles:
Las aplicaciones contenedor deben definir valores para todas las propiedades de documento
incorporadas. Si Microsoft Excel no define un valor para alguna de las propiedades de documento
incorporadas, la lectura de la propiedad Value para la propiedad de dicho documento causará un error.
Dado que Item es el método predeterminado para el conjunto DocumentProperties, los enunciados
siguientes son idénticos:
BuiltinDocumentProperties.Item(1)
BuiltinDocumentProperties(1)
PROPIEDAD VBPROYECT
Devuelve un objeto VBProject que representa el proyecto Visual Basic del libro especificado. Es de sólo
lectura.
OBJETO CUSTOMVIEWS
WorkBooks (Workbook)
CustomViews (CustomView)
-36-
CURSO DE
AUTOMATIZACION DE
EXCEL
Un conjunto de vistas personalizadas de libro. Cada vista está representada por un objeto CustomView.
Utilice la propiedad CustomViews para obtener el conjunto CustomViews. Utilice el método Add para
crear una nueva vista personalizada y agregarla al conjunto CustomViews. El siguiente ejemplo crea
una vista personalizada llamada “Resumen”.
OBJETO PivotCaches
WorkBooks (Workbook)
PivotCaches (PivotCache)
Representa el conjunto de memorias caché de tabla dinámica en un libro. Cada memoria caché está
representada por un objeto PivotCache .
Utilice el método PivotCaches para obtener el conjunto PivotCaches. El siguiente ejemplo establece la
propiedad RefreshOnFileOpen para todas las memorias caché del libro activo.
Styles (Style)
Border
Font
Interior
Un conjunto de todos los objetos Style del libro especificado o activo. Cada objeto Style representa la
descripción de un estilo de un rango. El objeto Style contiene todos los atributos de estilo (fuente,
formato numérico, alineación, etc.) en forma de propiedades. Existen varios estilos incorporados, como
Normal, Moneda y Porcentaje, que aparecen en el cuadro Nombre de estilo del cuadro de diálogo Estilo
(menú Formato).
Use la propiedad Styles para devolver el conjunto Styles. El ejemplo siguiente crea una lista de nombres
de estilo de la hoja de cálculo uno del libro activo.
For i = 1 To ActiveWorkbook.Styles.Count
Worksheets(1).Cells(i, 1) = ActiveWorkbook.Styles(i).Name
Next
-37-
CURSO DE
AUTOMATIZACION DE
EXCEL
Use el método Add para crear un estilo nuevo y agregarlo al conjunto. El ejemplo siguiente crea un
nuevo estilo basado en estilo Normal, modifica el borde y la fuente y, a continuación, aplica el nuevo
estilo a las celdas A25:A30.
Para devolver un solo objeto Style del conjunto Styles del libro, use Styles(índice), donde índice es el
nombre o número de índice del estilo. El ejemplo siguiente cambia el estilo Normal del libro activo por el
valor de su propiedad Bold.
ActiveWorkbook.Styles("Normal").Font.Bold = True
Border
Un conjunto de cuatro objetos Border que representan los cuatro bordes de un objeto Range o Style.
Use la propiedad Borders para devolver el conjunto Borders, que contiene los cuatro bordes. El ejemplo
siguiente agrega un borde doble a la celda A1 de la hoja de cálculo uno.
Worksheets(1).Range("a1").Borders.LineStyle = xlBorderStyleDouble
Para devolver un solo objeto Border, use Borders(índice), donde índice identifica al borde. El siguiente
ejemplo establece en rojo el color del borde inferior de las celdas A1:G1.
Worksheets("Hoja1").Range("a1:g1"). _
Borders(xlEdgeBottom).Color = RGB(255, 0, 0)
Índice puede ser una de las siguientes constantes XlBorderType: xlInsideHorizontal, xlInsideVertical,
xlDiagonalDown, xlDiagonalUp, xlEdgeBottom, xlEdgeLeft, xlEdgeRight o xlEdgeTop.
Comentarios
Sólo es posible establecer las propiedades de un borde individual con los objetos Range y Style. Otros
objetos con borde, como casillas de verificación y áreas de gráficos, tienen un borde que se trata como
una sola entidad, independientemente de los lados que tenga. Para estos objetos, deberá devolver y
establecer las propiedades del borde completo de una sola vez. Para obtener más información, vea el
objeto Border.
OBJETO Font
Objetos Relacionados
Font
-38-
CURSO DE
AUTOMATIZACION DE
EXCEL
Use la propiedad Font para devolver el objeto Font. El ejemplo siguiente da formato de negrita a las
celdas A1:C5.
Worksheets("Hoja1").Range("a1:c5").Font.Bold = True
Si no desea dar el mismo formato a todo el texto contenido en una celda o un gráfico, use la propiedad
Characters para devolver un subconjunto del texto.
OBJETO Interior
Objetos Relacionados
Interior
Use la propiedad Interior para devolver el objeto Interior. El siguiente ejemplo establece en rojo el color
del interior de la celda A1.
Worksheets("Hoja1").Range("a1").Interior.ColorIndex = 3
WorkBooks (WorkBook)
Windows (Window)
Panes (Pane)
Un conjunto de todos los objetos Window de Microsoft Excel. El conjunto Windows del objeto Application
contiene todas las ventanas de la aplicación, mientras que el conjunto Windows del objeto Workbook
sólo contiene las ventanas del libro especificado.
Use la propiedad Windows para devolver el conjunto Windows. El ejemplo siguiente organiza en
cascada todas las ventanas que se muestran actualmente en Microsoft Excel.
Windows.Arrange arrangeStyle:=xlCascade
-39-
CURSO DE
AUTOMATIZACION DE
EXCEL
Use el método NewWindow para crear una ventana nueva y agregarla al conjunto. El ejemplo siguiente
crea una nueva ventana para el libro activo.
ActiveWorkbook.NewWindow
Para devolver un solo objeto Windows, use Windows(índice), donde índice es el nombre o número de
índice de la ventana. El ejemplo siguiente maximiza la ventana activa.
Windows(1).WindowState = xlMaximized
Panes (Pane)
Un conjunto de todos los objetos Pane mostrados en la ventana especificada. Los objetos Pane sólo
existen para las hojas de cálculo y las hojas de macros de Excel 4.0.
Use la propiedad Panes para devolver el conjunto Panes. El ejemplo siguiente inmoviliza las secciones
de la ventana activa si ésta contiene más de una sección.
Para devolver un solo objeto Pane, use Panes(índice), donde índice es el número de índice de la
sección. El ejemplo siguiente se desplaza en la sección superior izquierda de la ventana donde se
muestra Hoja1.
Worksheets("Hoja1").Activate
Windows(1).Panes(1).LargeScroll down:=1
WorkBooks (WorkBook)
Names (Name)
WorkSheets (Worksheet)
Names (Name)
Range
Name
-40-
CURSO DE
AUTOMATIZACION DE
EXCEL
Un conjunto de todos los objetos Name del libro o la aplicación. Cada objeto Name representa un
nombre definido para un rango de celdas. Los nombres pueden ser incorporados, como Base_de_datos,
Área_de_impresión y Auto_abrir, o personalizados.
Use la propiedad Names para devolver el conjunto Names. El ejemplo siguiente crea una lista de todos
los nombres del libro activo, así como las direcciones a las que hacen referencia.
Use el método Add para crear un nombre y agregarlo al conjunto. El ejemplo siguiente crea un nombre
nuevo que hace referencia a las celdas A1:C20 de la hoja de cálculo llamada "Hoja1."
El argumento RefersTo debe especificarse en notación de estilo A1, incluidos signos de dólar ($) donde
corresponda. Por ejemplo, si la celda A10 está seleccionada en la Hoja1 y se define un nombre usando
el argumento RefersTo "=hoja1!A1:B1", el nuevo nombre en realidad hará referencia a las celdas
A10:B10 (puesto que se ha especificado una referencia relativa). Para especificar una referencia
absoluta, use "=hoja1!$A$1:$B$1".
Para devolver un solo objeto Name, use Names(índice), donde índice es el nombre definido o número
de índice del nombre. El ejemplo siguiente elimina el nombre "miRangoOrden" del libro activo
ActiveWorkbook.Names("miRangoOrden").Delete
OBJETO RoutingSlip
WorkBooks (Workbook)
Routing Slip
Representa la lista de distribución de un libro. La lista de distribución se emplea para enviar un libro a
través del sistema de correo electrónico.
Use la propiedad RoutingSlip para devolver el objeto RoutingSlip. El ejemplo siguiente establece el estilo
de entrega de la lista de distribución adjunta al libro activo. Para obtener un ejemplo más detallado, vea
la propiedad RoutingSlip.
ActiveWorkbook.HasRoutingSlip = True
ActiveWorkbook.RoutingSlip.Delivery = xlOneAfterAnother
Comentarios
El objeto RoutingSlip no existe y no es posible usarlo a menos que la propiedad HasRoutingSlip del libro
sea True.
-41-
CURSO DE
AUTOMATIZACION DE
EXCEL
OBJETO Mailer
Application
WorkBooks (Workbook)
Routing Slip
Representa el formulario de PowerTalk para un libro. Este objeto sólo está disponible en Macintosh, con
la ampliación del sistema PowerTalk instalada.
Use la propiedad Mailer para devolver el objeto Mailer. El ejemplo siguiente establece la propiedad
Subject del formulario adjunto al libro activo.
ActiveWorkbook.HasMailer = True
ActiveWorkbook.Mailer.Subject = "Este es el libro."
Application
AddIns (AddIn)
Un conjunto de objetos AddIn que representa todas las macros automáticas disponibles en Microsoft
Excel, con independencia de si están instaladas. Esta lista corresponde a lista que se muestra en el
cuadro de diálogo Macros automáticas (menú Herramientas).
Use el método AddIns para devolver el conjunto AddIns. El ejemplo siguiente crea una lista con los
nombres y estados de instalado de todas las macros automáticas disponibles.
Sub MostrarMacrosAuto()
Worksheets("Hoja1").Activate
rw = 1
For Each mcraut In Application.AddIns
Worksheets("Hoja1").Cells(rw, 1) = mcraut.Name
Worksheets("Hoja1").Cells(rw, 2) = mcraut.Installed
rw = rw + 1
Next
End Sub
Use el método Add para agregar una macro automática a la lista de macros automáticas disponibles. El
método Add agrega una macro automática a la lista, pero no instala la macro. Defina la propiedad
Installed de la macro automática como True para instalarla. Para instalar una macro que no aparece en
la lista de macros automáticas disponibles, primero debe usar el método Add y después establecer la
propiedad Installed. Puede hacerlo en un solo paso, como se muestra en el ejemplo siguiente (tenga en
cuenta que, con el método Add se usa el nombre de la macro automática, no su título).
AddIns.Add("genérica.xll").Installed = True
Para devolver un solo objeto AddIn, use AddIns(índice), donde índice es el título de la macro automática
o su número de índice. El ejemplo siguiente instala la macro automática Herramientas para análisis.
-42-
CURSO DE
AUTOMATIZACION DE
EXCEL
AddIns("Herramientas para análisis").Installed = True
No confunda el título de la macro automática, que aparece en el cuadro de diálogo Macros automáticas,
con su nombre, que es el nombre de archivo de la macro. Debe escribir el título de la macro automática
correctamente, tal como se muestra en el cuadro de diálogo Macros automáticas, aunque no es
necesario que coincidan las letras mayúsculas y minúsculas.
OBJETO AutoCorrect
Application
AutoCorret
Contiene los atributos de Autocorrección de Microsoft Excel (uso de mayúsculas en nombres de días,
corrección de dos mayúsculas iniciales, lista de corrección automática, etc.).
Utilice la propiedad AutoCorrect para obtener el objeto AutoCorrect. El siguiente ejemplo tiene como
efecto que Excel corrija aquellas palabras que comiencen con dos mayúsculas consecutivas.
With Application.AutoCorrect
.TwoInitialCapitals = True
.ReplaceText = True
End With
PROPIEDAD Assistant
Comentarios
Debug (OBJETO)
Dialogs (Dialog)
Un conjunto de todos los objetos Dialog de la aplicación Microsoft Excel. Cada objeto Dialog representa
un cuadro de diálogo incorporado. No se pueden crear cuadros de diálogo incorporados nuevos ni
agregarlos al conjunto. Lo único que puede hacerse con un objeto Dialog es emplearlo con el método
Show para mostrar el cuadro de diálogo correspondiente.
-43-
CURSO DE
AUTOMATIZACION DE
EXCEL
Uso del conjunto Dialogs
Use la propiedad Dialogs para devolver el conjunto Dialogs. El ejemplo siguiente muestra el número de
cuadros de diálogo incorporados en Microsoft Excel disponibles.
MsgBox Application.Dialogs.Count
Para devolver un solo objeto Dialog, use Dialogs(índice), donde índice es la constante incorporada que
identifica al cuadro de diálogo. El ejemplo siguiente ejecuta el cuadro de diálogo incorporado Abrir
archivo.
dlgAnswer = Application.Dialogs(xlDialogOpen).Show
La biblioteca de objetos de Microsoft Excel Visual Basic incluye constantes incorporadas para
numerosos cuadros de diálogo incorporados. Cada constante se forma con el prefijo "xlDialog" seguido
del nombre del cuadro de diálogo. Por ejemplo, la constante del cuadro de diálogo Aplicar nombres es
xlDialogApplyNames y la constante del cuadro de diálogo Buscar archivo es xlDialogFindFile. Estas
siguientes constantes son elementos del tipo enumerado XlBuiltinDialog. Para obtener más información
acerca de las constantes disponibles, vea Listas de argumentos de los cuadros de diálogo incorporados.
PROPIEDAD CommandBars
Devuelve un objeto CommandBars que representa las barras de comandos de Microsoft Excel. Es de
sólo lectura.
Comentarios
Utilizado con el objeto Application, esta propiedad devuelve el grupo de barras de comandos
incorporadas y personalizadas disponibles en la aplicación.
When a workbook is embedded in another application and activated by the user by double-clicking the
workbook, using this property with a Workbook object returns the set of Microsoft Excel command bars
available within the other application. At all other times, using this property with a Workbook object
returns Nothing.
There is no programmatic way to return the set of command bars attached to a workbook.
WorkBooks (WorkBook)
Names (Name)
WorkSheets (Worksheet)
Names (Name)
Range
Name
Un conjunto de todos los objetos Name del libro o la aplicación. Cada objeto Name representa un
nombre definido para un rango de celdas. Los nombres pueden ser incorporados, como Base_de_datos,
Área_de_impresión y Auto_abrir, o personalizados.
-44-
CURSO DE
AUTOMATIZACION DE
EXCEL
Use la propiedad Names para devolver el conjunto Names. El ejemplo siguiente crea una lista de todos
los nombres del libro activo, así como las direcciones a las que hacen referencia.
Use el método Add para crear un nombre y agregarlo al conjunto. El ejemplo siguiente crea un nombre
nuevo que hace referencia a las celdas A1:C20 de la hoja de cálculo llamada "Hoja1."
El argumento RefersTo debe especificarse en notación de estilo A1, incluidos signos de dólar ($) donde
corresponda. Por ejemplo, si la celda A10 está seleccionada en la Hoja1 y se define un nombre usando
el argumento RefersTo "=hoja1!A1:B1", el nuevo nombre en realidad hará referencia a las celdas
A10:B10 (puesto que se ha especificado una referencia relativa). Para especificar una referencia
absoluta, use "=hoja1!$A$1:$B$1".
Para devolver un solo objeto Name, use Names(índice), donde índice es el nombre definido o número
de índice del nombre. El ejemplo siguiente elimina el nombre "miRangoOrden" del libro activo
ActiveWorkbook.Names("miRangoOrden").Delete
Application
WorkBooks (WorkBook)
Windows (Window)
Panes (Pane)
Un conjunto de todos los objetos Window de Microsoft Excel. El conjunto Windows del objeto Application
contiene todas las ventanas de la aplicación, mientras que el conjunto Windows del objeto Workbook
sólo contiene las ventanas del libro especificado.
Use la propiedad Windows para devolver el conjunto Windows. El ejemplo siguiente organiza en
cascada todas las ventanas que se muestran actualmente en Microsoft Excel.
Windows.Arrange arrangeStyle:=xlCascade
Use el método NewWindow para crear una ventana nueva y agregarla al conjunto. El ejemplo siguiente
crea una nueva ventana para el libro activo.
ActiveWorkbook.NewWindow
Para devolver un solo objeto Windows, use Windows(índice), donde índice es el nombre o número de
índice de la ventana. El ejemplo siguiente maximiza la ventana activa.
-45-
CURSO DE
AUTOMATIZACION DE
EXCEL
Windows(1).WindowState = xlMaximized
Windows (Window)
Panes (Pane)
Un conjunto de todos los objetos Pane mostrados en la ventana especificada. Los objetos Pane sólo
existen para las hojas de cálculo y las hojas de macros de Excel 4.0.
Use la propiedad Panes para devolver el conjunto Panes. El ejemplo siguiente inmoviliza las secciones
de la ventana activa si ésta contiene más de una sección.
Para devolver un solo objeto Pane, use Panes(índice), donde índice es el número de índice de la
sección. El ejemplo siguiente se desplaza en la sección superior izquierda de la ventana donde se
muestra Hoja1.
Worksheets("Hoja1").Activate
Windows(1).Panes(1).LargeScroll down:=1
OBJETO WorksheetFunction
Application
WorkSheetFunction
Utilizado como contenedor de las funciones de hoja de cálculo de Microsoft Excel que pueden llamarse
desde Visual Basic.
Comentarios
En anteriores versiones de Microsoft Excel, las funciones de hoja de cálculo estaban contenidas en el
objeto Application.
OBJETO RecentFiles
-46-
CURSO DE
AUTOMATIZACION DE
EXCEL
Application
RecentFiles (RecentFile)
Representa la lista de archivos recientemente utilizados. Cada archivo está representado por un objeto
RecentFile.
Utilice la propiedad RecentFiles para obtener el conjunto RecentFiles. El siguiente ejemplo establece el
número máximo de archivos en la lista de archivos recientemente utilizados.
Application.RecentFiles.Maximum = 6
PROPIEDAD FileSearch
Devuelve un objeto FileSearch, que se puede utilizar en búsquedas de archivo. Esta propiedad sólo está
disponible en Microsoft Windows.
PROPIEDAD FileFind
Devuelve un objeto FileFind, que se puede utilizar en búsquedas de archivo. Esta propiedad sólo está
disponible en Macintosh.
PROPIEDAD VBE
Devuelve un objeto VBE que representa el Editor de Visual Basic. Es de sólo lectura.
OBJETO ODBCErrors
Application
ODBCErrors (ODBCError)
Representa un error devuelto por la consulta de ODBC más reciente. Si la consulta de ODBC se ejecuta
sin errores, el conjunto ODBCErrors estará vacío. Los errores del conjunto se indexan en el orden en
que los genera la fuente de datos de ODBC. No pueden agregarse miembros al conjunto.
Utilice la propiedad ODBCErrors para devolver el conjunto ODBCErrors. El ejemplo siguiente actualiza
la tabla de consulta uno y muestra los errores de ODBC ocurridos.
With Worksheets(1).QueryTables(1)
.Refresh
Set errs = Application.ODBCErrors
If errs.Count > 0 Then
Set r = .Destination.Cells(1)
r.Value = "Han ocurrido los siguientes errores:"
c=0
-47-
CURSO DE
AUTOMATIZACION DE
EXCEL
For Each er In errs
c=c+1
r.offset(c, 0).value = er.ErrorString
r.offset(c, 1).value = er.SqlState
Next
Else
MsgBox "Consulta completa: se han devuelto todos los registros."
End If
End With
Sub Descriptiva()
'
' Descriptiva Macro
' Macro grabada el 11/08/01 por Miguel Laffont
'
'
Application.Run "ATPVBAEN.XLA!Descr", ActiveSheet.Range("$E$5:$E$17"), _
ActiveSheet.Range("$C$21"), "C", False, True
End Sub
Observación: Esta macro fue generada Con la opción Grabar Nueva Macro de la Barra de
Herramientas - Macros
-48-
CURSO DE
AUTOMATIZACION DE
EXCEL
EJEMPLOS
DE
APLICACION
-49-
CURSO DE
AUTOMATIZACION DE
EXCEL
TAREAS REPETITIVAS UTILIZANDO BUCLES.
A menudo es necesario repetir un tipo de tarea específica para un grupo de elementos, que
pueden ser celdas, celdas en un rango, hojas de cálculo de un libro o libros en una
aplicación.
A pesar de que una macro no puede grabar bucles, se puede grabar la tarea principal y
luego, mediante pequeñas modificaciones en el código, se pueden crear distintos tipos de
bucles según las necesidades del proyecto.
(Para grabar la macro, en el menú Herramientas haga clic en Macro y luego en Grabar
nueva macro)
Mientras graba, haga clic en Celdas en el menú Formato, luego haga clic en la ficha Tramas
y seleccione un color. En este ejemplo se usará amarillo (.ColorIndex=6). A continuación
pare la grabación mediante el botón Detener grabación de la barra de herramientas Grabar
macro.
La celda seleccionada cambiará el color y se grabará la macro siguiente:
Sub Macro_Grabada()
'
' Macro grabada el 6-30-97
'
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
End Sub
Para usar el bucle For Each…Next se debe conocer el rango de celdas al que deseamos
aplicar la acción grabada.
Como condición de este ejemplo, sólo será afectada la celda en la columna B si la celda en
A es mayor que 20. Se agregará el enunciado If al enunciado With utilizado. El color
cambiará sólo si If es verdadero.
Por último, debido a que se desea desplazar la celda correspondiente una columna hacia la
derecha de la columna A (columna B), se reemplazará la propiedad Selection en el código
usando el método Offset en la celda en la que se aplicará el bucle (celda_en_bucle).
El código resultante será:
-50-
CURSO DE
AUTOMATIZACION DE
EXCEL
Sub Ejemplo_For_Each_Next()
'
' Macro grabada el 6-30-97
'
For Each celda_en_bucle In Range("A1:A5")
If celda_en_bucle.Value > 20 Then
With celda_en_bucle.Offset(0, 1).Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
End If
Next
End Sub
Bucle For…Next
Si conoce el número de veces que desea realizar un bucle en el código, puede usar el bucle
For..Next. En el ejemplo siguiente, si se desea comprobar 10 celdas hacia abajo a partir de
la celda seleccionada, el código será:
Sub Ejemplo_For_Next()
For Contador = 0 To 9
If Selection.Offset(Contador, 0).Value > 20 Then
With Selection.Offset(Contador, 1).Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
End If
Next
End Sub
En este ejemplo, el objeto Selection se utiliza para que el código no especifique ningún
rango y realice un bucle diez celdas hacia abajo de la celda activa (de 0 a 9). La variable
Contador aumenta progresivamente a medida que avanza el bucle y se puede usar
internamente en la estructura del mismo. Aquí se utiliza como argumento Offset para
indicar el número de filas que se desplaza Selection desde la celda activa. Si al iniciar la
macro la celda activa es A1, en la primera vuelta del bucle, la variable Contador será igual
a 0 y se desplazará 0 filas a partir de A1, como se muestra en el enunciado
Selection.Offset(Contador, 0).Value.
Do…Loop
Para establecer cuándo detener un bucle basado en una condición determinada, puede ser
apropiado utilizar Do…Loop. Esta estructura de bucle permite comprobar las propiedades o
condiciones de la variable antes de ejecutar el bucle. En el ejemplo siguiente, el bucle
continúa hasta que el número de fila al que se hace referencia en
Selection.Offset(Contador, 0).Row es mayor que 100. Esto puede ser útil si no desea
ejecutar el bucle mas allá de la fila 100.
Sub Ejemplo_Do_Loop()
Contador = 0
Do Until Selection.Offset(Contador, 0).Row > 100
-51-
CURSO DE
AUTOMATIZACION DE
EXCEL
If Selection.Offset(Contador, 0).Value > 20 Then
With Selection.Offset(Contador, 1).Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
End If
Contador = Contador+ 1
Loop
Nota: Existen otros tipos de bucle Do…Loop disponibles, que ofrecen más flexibilidad en
determinadas circunstancias.
Si desea obtener más información y detalles acerca de otras estructuras de bucle, consulte
en la Ayuda del entorno de Visual Basic la palabra bucles.
La macro adjunta muestra cómo aplicar rótulos en un gráfico XY (Dispersión) y asume que
los datos y rótulos asociados están ordenados del mismo modo que en las celdas
sombreadas anteriores.
Sub VincularRótulosAPuntos()
'Comprueba que sólo se ejecuta la subrutina
'una vez restablecido el gráfico
If reiniciarcódigo = False Then
MsgBox "Restablezca el gráfico antes de aplicar los rótulos", vbCritical
Exit Sub
End If
' Variables de dimensión.
Dim Contador As Integer
Dim HojaOrigen As Variant, xVals As Variant, xCelda As Variant
Dim xRótulo As Variant
' Estas líneas extraen el nombre de la hoja de cálculo de origen desde xVals.
HojaOrigen = Left(xVals, InStr(1, xVals, "!") - 1)
HojaOrigen = Right(HojaOrigen, Len(HojaOrigen) - _
-52-
CURSO DE
AUTOMATIZACION DE
EXCEL
InStr(1, HojaOrigen, "("))
If Left(HojaOrigen, 1) = "," Then
HojaOrigen = Right(HojaOrigen, Len(HojaOrigen) - 1)
End If
' Reemplaza el nombre de la hoja de cálculo actual con "xlSheet" para que
' las búsquedas funcionen correctamente si el nombre de la hoja de cálculo
' contiene comas.
xVals = Application.Substitute(xVals, HojaOrigen, "xlSheet")
' Escribe el nombre original de la hoja de cálculo de origen inicial nuevamente en xVals,
' reemplazando "xlSheet".
xVals = Application.Substitute(xVals, "xlSheet", HojaOrigen)
-53-
CURSO DE
AUTOMATIZACION DE
EXCEL
' Comprueba que no hay nada seleccionado en el gráfico.
Application.ExecuteExcel4Macro "SELECT("""")"
resetcode = False
End Sub
Sub RestablecerGráfico()
'
'Esta subrutina restablece el gráfico para poder aplicar rótulos.
'
Application.ScreenUpdating = False
ActiveSheet.ChartObjects.Select
Selection.Delete
Charts.Add
With ActiveChart
.ChartType = xlXYScatter
.SetSourceData Source:=Sheets("Rótulos de gráficos").Range("B2:C6"),
PlotBy:=xlColumns
.Location Where:=xlLocationAsObject, Name:="Rótulos de gráficos"
End With
Application.ScreenUpdating = True
reiniciarcódigo = True
End Sub
ACCESO A DATOS
Los objetos de acceso a datos (DAO), permiten la manipulación directa de una base de
datos. Para usar este tipo de objetos, deberá crear una referencia a la biblioteca de objetos
Microsoft DAO 3.5 (cuadro de diálogo Referencias en el menú Herramientas) en el Editor de
Visual Basic. Además, es necesario tener instalados los controladores de ODBC o ISAM
apropiados. Para obtener más información acerca de los controladores de ODBC, consulte
en la Ayuda ""Instalar un controlador ODBC para tener acceso a una fuente de datos
externa"". Para instalar DAO o ISAM, consulte el tema de la Ayuda ""Instalar o quitar
componentes individuales de Microsoft Office o Microsoft Excel"". Las rutas utilizadas en los
ejemplos apuntan hacia la ubicación predeterminada de la instalación. Si instaló Microsoft
Office en una ubicación diferente, modifique las rutas en el Editor de Visual Basic antes de
ejecutar los ejemplos."
EJEMPLO DE RDO
Este ejemplo recupera datos desde un archivo dBase usando RDO y los sitúa en una tabla
de Query en una hoja de cálculo nueva. Utilice este método al conectarse a bases de datos
SQL. RDO no utiliza DAO ya que este último disminuye la memoria disponible.
Sub EjemploRDO()
Dim ws As Workspace
Dim rs As Recordset
Dim qt As QueryTable
Dim c As Connection
Dim CadConec As String
Dim HojaNueva As Object
'Si no instaló Microsoft Office en la ubicación predeterminada,
-54-
CURSO DE
AUTOMATIZACION DE
EXCEL
'cambie la ruta para indicar la carpeta adecuada antes de ejecutar el código
CadConec = ""odbc;Driver={Microsoft dBase Driver (*.dbf)};DBQ=c:\archivos de
programa\microsoft office\office;""
'Crea un área de trabajo que no utiliza DAO
Set ws = CreateWorkspace(""w1"", ""admin"", """", dbUseODBC)
'Abre la conexión con el directorio que contiene los archivos DBF
Set c = ws.OpenConnection("""", 1, 0, ConnectStr)
'Obtiene todos los registros de la tabla y sólo permite desplazarse
'hacia adelante por los registros (método más rápido)"
Set rs = c.OpenRecordset(""select * from pedidos"", dbOpenForwardOnly)
'Inserta una nueva hoja de cálculo en el libro activo
Set HojaNueva = Worksheets.Add
'Crea una nueva tabla de Query basada en el conjunto de registros en la nueva hoja
Set qt = HojaNueva.QueryTables.Add(rs, Range(""a1""))
'Realiza una actualización sincronizada en la tabla de Query
qt.Refresh False
'Cierra el conjunto de registros
rs.Close
'Cierra la conexión
c.Close
End Sub"
Sub ResettingDAORecordset()
Dim bd As Database
Dim rs As Recordset
Dim qt As QueryTable
Dim NewSheet As Object
Dim Neptuno As String
'Ruta predeterminada a la base de datos de ejemplo Neptuno.mdb
Neptuno = ""C:\Archivos de programa\microsoft office\office\ejemplos\Neptuno.mdb""
'Abre la base de datos Neptuno.mdb
Set bd = DBEngine.Workspaces(0).OpenDatabase(neptuno)
'Abre un conjunto de registros con todos los registros de la tabla clientes
Set rs = bd.OpenRecordset(""clientes"")
'Inserta una hoja de cálculo nueva en el libro activo
Set HojaNueva = Worksheets.Add
'Inserta una tabla de Query con información acerca del conjunto de registros en la hoja
nueva
Set qt = NewSheet.QueryTables.Add(rs, Range(""a1""))
-55-
CURSO DE
AUTOMATIZACION DE
EXCEL
'Cierra el conjunto de registros
rs.Close
'Cierra la base de datos
bd.Close
End Sub"
Sub RetrieveAccessData()
Dim Nsql As String, Ncriterios As String, Nvínculo As String
Dim Neptuno As String
Dim h As Integer
Dim bd As Database, qry As Object
Dim reg As Recordset, HojaNueva As Object
'Instalación predeterminada de la base de datos Neptuno.mdb
Neptuno = ""C:\Archivos de programa\microsoft office\office\ejemplos\Neptuno.mdb""
'Si encuentra un error va a la etiqueta ControlErrores
On Error GoTo controlErrores
'Abre la base de datos
Set bd = DBEngine.Workspaces(0).OpenDatabase(neptuno)
'Enunciado SQL para la consulta (copia desde la ventana SQL de MS Query)
Nsql = ""SELECT DISTINCTROW Categories.CategoryName, Products.ProductName,
Products.QuantityPerUnit, Products.UnitPrice """
Nvínculo = ""FROM Categorías INNER JOIN Productos ON Categorías.IdCategoría =
Productos.IdCategoría ""
Ncriteria = ""WHERE ((([Productos].Suspendido)=No) AND
(([Products].UnidadesEnExistencia)>20));""
'Crea una consulta denominada QueryTemp
Set qry = bd.CreateQueryDef(""QueryTemp"")
'Envía un enunciado SQL a QueryTemp
qry.sql = Nsql & Nvínculo & Ncriterios
'Abre el conjunto de registros resultante creado por QueryTemp
Set reg = qry.OpenRecordset()
'Agrega una nueva hoja de cálculo en el libro que contiene este código
Set HojaNueva = ThisWorkbook.Sheets.Add(after:=Worksheets(""Acceso a datos""),
Type:=xlWorksheet)
'Sitúa los nombres de campo en la fila 1 de la nueva hoja de cálculo
For h = 0 To reg.Fields.Count - 1
HojaNueva.[a1].Offset(0, h).Value = rec.Fields(h).Name
Next h
'Copia el conjunto de registros en Excel
HojaNueva.[a2].CopyFromRecordset rec
'Elimina la consulta temporal
db.QueryDefs.Delete ""QueryTemp""
'Cierra la base de datos
db.Close
'Si no encuentra errores, detiene la ejecución del código
Exit Sub
'Controlador de errores para eliminar la consulta si ya existe
controlErrores:
If DBEngine.Errors(0).Number = 3012 Then
db.QueryDefs.Delete ""QueryTemp""
'Comienza a ejecutar el código en la línea que causó el error
-56-
CURSO DE
AUTOMATIZACION DE
EXCEL
Resume
Else
MsgBox Error(Err)
End If
End Sub"
Sub RetrieveISAMdata()
Dim Db As database, rec As Recordset
dPath As String
Dim h As Integer, NewSheet As Object
'Ruta de instalación predeterminada de los archivos dbf
dPath = ""C:\Archivos de programa\microsoft office\office""
'Abre la base de datos
Set Db = DBEngine.Workspaces(0).OpenDatabase(dPath, 0, 0, ""dBase III"")"
'Abre un conjunto de registros con todos los registros de pedidos.dbf
Set reg = Db.OpenRecordset(""SELECT * FROM pedidos"")
'Agrega una nueva hoja de cálculo al libro que contiene este código
Set HojaNueva = ThisWorkbook.worksheets.Add(after:=Worksheets(""Acceso a
datos""))
'Realiza un bucle en los campos y devuelve los nombres de los campos a la hoja de
cálculo
For h = 0 To reg.Fields.Count - 1
HojaNueva.[a1].Offset(0, h).Value = rec.Fields(h).Name
Next h
'Copia el conjunto de registros en Excel
HojaNueva.[a2].CopyFromRecordset reg
'Cierra la base de datos
Bd.Close
End Sub"
Sub TablasLista()
Dim bd As Database, CuentaTabla As Long, i As Long
Dim dRuta As String
'Ubicación predeterminada de Neptuno.mdb
dRuta = ""C:\Archivos de programa\microsoft office\office\ejemplos\Neptuno.mdb""
'Abre Neptuno.mdb
Set bd = DBEngine.Workspaces(0).OpenDatabase(neptuno)
'Establece una variable para enumerar las tablas
CuentaTabla = bd.TableDefs.Count
'Realiza un bucle a través de las tablas
For i = 0 To CuentaTabla - 1
'Presenta el nombre de la tabla
MsgBox db.TableDefs(i).Name
Next
'Cierra la base de datos
-57-
CURSO DE
AUTOMATIZACION DE
EXCEL
db.Close
End Sub
Sub Campos_Lista()
Dim bd As Database, reg As Recordset
Dim cuentacampo As Long, i As Long, dRuta As String
'Ubicación predeterminada de los archivos dbf de ejemplo
dRuta = ""C:\Archivos de programa\microsoft office\office""
'Abre la base de datos
Set bd = OpenDatabase(dRuta, 0, 0, ""dBase III"")
'Abre todos los registros de clientes.dbf
Set reg = db.OpenRecordset(""SELECT * FROM clientes"")
'Cuenta el número de campos
cuentacampo = rec.Fields.Count
'Realiza un bucle por cada campo existente
For i = 0 To cuentacampo - 1
'Presenta los nombres de los campos
MsgBox rec.Fields(i).Name
Next
'Cierra la base de datos
bd.Close
End Sub
Sub ODBC_Conexión()
Dim bd As Database, i As Long
'Presenta el cuadro de diálogo de DSN, que permite seleccionar la DSN
'para, a continuación, pedir información adicional si es necesario
Set bd = DBEngine.Workspaces(0).OpenDatabase("""", , , ""ODBC;"")
'Cuenta el número de tablas
CuentaTabla = db.TableDefs.Count
'Realiza un bucle para presentar todos los nombres en la tabla
For i = 0 To CuentaTabla - 1
MsgBox db.TableDefs(i).Name
Next
'Cierra la base de datos
bd.Close
End Sub
Sub Controlar_DAO_Error()
-58-
CURSO DE
AUTOMATIZACION DE
EXCEL
Dim d As database, r As Recordset
'Si encuentra un error va la etiqueta controladorErrores
On Error GoTo controladorErrores
'Impide presentar mensajes de error integrados
Application.DisplayAlerts = False
'Intenta abrir una base de datos que no existe
Set d = DBEngine.Workspaces(0).OpenDatabase(""c:\xl95\db4.mdb"")
Exit Sub 'Sale de la subrutina si no hay errores
controladorErrores:
MsgBox DBEngine.Errors(0).Description 'Texto del mensaje de error
MsgBox DBEngine.Errors(0).Number 'Número del error
MsgBox DBEngine.Errors(0).Source 'Ubicación del error
MsgBox DBEngine.Errors(0).HelpContext
End Sub
Sub Crear_Tabla()
Dim t As Object, f As Object, d As Database
Dim dRuta As String
'Si encuentra un error va a la etiqueta controladorErrores
On Error GoTo controladorErrores
'Ruta predeterminada de la base de datos de muestra Neptuno.mdb
dRuta = ""C:\Archivos de programa\microsoft office\office\ejemplos\Neptuno.mdb""
'Abre la base de datos Neptuno
Set d = DBEngine.Workspaces(0).OpenDatabase(dRuta)
'Crea una nueva tabla TableDef
Set t = d.CreateTableDef(""TablaNueva"")
'Agrega campos a TablaNueva.
Set f = t.CreateField(""Campo1"", dbDate)
t.Fields.Append f 'Agrega campos al conjunto de campos
Set f = t.CreateField(""Campo2"", dbText)
t.Fields.Append f
Set f = t.CreateField(""Campo3"", dbLong)
t.Fields.Append f
'Guarda la definición TableDef adjuntándola al conjunto de definiciones de TableDef.
d.TableDefs.Append t
'Cierra la base de datos
d.Close
Exit Sub
controladorErrores:
MsgBox DBEngine.Errors(0)
End Sub"
-59-
CURSO DE
AUTOMATIZACION DE
EXCEL
Con frecuencia los programadores necesitan que un evento desencadene una macro una
macro para ejecutar una tarea. Microsoft Excel 97 ofrece la posibilidad de realizar esta
acción. Los eventos están siempre asociados con objetos, como puede ser el caso de una
hoja de cálculo o un libro. En este ejemplo sólo se mencionará algunos de los eventos
disponibles y se usará un MsgBox como relleno para demostrar dónde puede ir el código.
Para obtener más información acerca de eventos, haga clic en el Ayudante desde el Editor
de Visual Basic y use el nombre del objeto y la palabra "eventos" como palabras clave (por
ejemplo, eventos de hoja de cálculo).
BeforeDoubleClick
Este evento se desencadenará cada vez que el usuario haga doble clic en una celda de la
hoja de cálculo. El parámetro Target se incorpora a la macro para que el programador sepa
sobre que celda se hizo doble clic. El argumento Cancel tiene un valor predeterminado de
False pero se puede cambiar a True en el código. Al establecer Cancel como True se
cancelará la acción predeterminada para el evento. En este caso, la acción predeterminada
al hacer doble clic en una celda es cambiar al modo de edición para esa celda. Debido a que
Cancel está establecido como True, esto no ocurrirá. Si desea obtener la acción
predeterminada, quite la línea Cancel=True.
Change
Otro evento de gran utilidad en una hoja de cálculo, es Change. Se desencadena cada vez
que el usuario escribe un valor nuevo en una celda.
Nota: Este evento no ocurrirá si la hoja acaba de ser recalculada. Existe otro evento
denominado Calculate que funciona con hojas de calculo recalculadas.
BeforeClose
Un evento útil relacionado con libros es BeforeClose. Se puede utilizar este tipo de eventos
para realizar tareas de limpieza antes de guardar o cerrar un archivo.
-60-
CURSO DE
AUTOMATIZACION DE
EXCEL
Usar eventos con el objeto Application
Antes de usar eventos con el objeto Application puede crear un nuevo módulo de clase y
declarar un objeto del tipo Application con eventos. Por ejemplo, suponga que se crea un
nuevo módulo de clase denominado EventClassModule con el siguiente código:
Después de declarar los eventos del nuevo objeto, aparecerá la lista desplegable de Object,
con el objeto incluido en el módulo de clase. A continuación puede escribir los
procedimientos para el nuevo objeto. Al seleccionar el nuevo objeto en el cuadro Object, los
eventos válidos para ese objeto se presentarán en el cuadro de lista desplegable Procedure.
Sub IniciarAp()
Set X.App = Application
End Sub
AUTOMATIZACION DE OFFICE
La automatización es una opción de COM (Component Object Model), una tecnología que
usan las aplicaciones para exponer los objetos a las herramientas de desarrollo, lenguajes
de macro y otras aplicaciones que admiten automatización. Por ejemplo, una aplicación de
hoja de cálculo puede presentar una hoja de cálculo, un gráfico, una celda o un rango de
celdas, cada uno con un tipo diferente de objeto. Un procesador de texto puede presentar
objetos tales como una aplicación, un documento, un párrafo, una frase, un marcador o
una selección. En los ejemplos siguientes se muestran tareas de automatización entre
Microsoft Excel y otras aplicaciones de Microsoft."
Para obtener más información acerca de la automatización, consulte Automatización de
tareas repetitivas en la Ayuda de VBA.
MICROSOFT ACCESS
Este ejemplo devuelve la ubicación de las bases de datos de muestra de Microsoft Access.
Sub MS_Access()
Dim AccDir As String
Dim acc As Object
'Automatización OLE de Access
Set acc = CreateObject(""access.application"")
'Devuelve la ruta de msaccess.exe
AccDir = acc.SysCmd(Action:=acSysCmdAccessDir)
'Presenta la ruta
MsgBox ""La ubicación de MSAccess.exe es "" & AccDir
'Libera espacio de disponibilidad variable
Set acc = Nothing
End Sub
-61-
CURSO DE
AUTOMATIZACION DE
EXCEL
MICROSOFT WORD
Este ejemplo copia el gráfico desde la hoja Rótulos de gráficos a un documento nuevo de
Microsoft Word.
Sub MS_Word()
Dim wd As Object
'Crea una sesión de Microsoft Word
Set wd = CreateObject(""word.application"")
'Copia el gráfico en la hoja Rótulos de gráficos
Worksheets(""Rótulos de gráficos"").ChartObjects(1).Chart.ChartArea.Copy
'Hace visible el documento
wd.Visible = True
'Activa MS Word
AppActivate wd.Name
With wd
'Crea un documento nuevo en Microsoft Word
.Documents.Add
'Inserta un párrafo
.Selection.TypeParagraph
'Pega el gráfico
.Selection.PasteSpecial link:=True, DisplayAsIcon:=False, Placement:=wdInLine
End With
Set wd = Nothing
End Sub"
MICROSOFT POWERPOINT
Este ejemplo copia el gráfico desde Rótulos de gráficos a una nueva presentación de
Microsoft PowerPoint.
Sub MS_PowerPoint()
Dim ppt As Object, pres As Object
'Crea una sesión de Microsoft PowerPoint
Set ppt = CreateObject(""powerpoint.application"")
'Copia el gráfico en la hoja Rótulos de gráficos
Worksheets(""Rótulos de gráficos"").ChartObjects(1).Copy
'Abre un documento nuevo en Microsoft PowerPoint
Set pres = ppt.Presentations.Add
'Agrega una diapositiva
pres.Slides.Add 1, ppLayoutBlank
'Hace visible PowerPoint
ppt.Visible = True
'Activa PowerPoint
AppActivate ppt.Name
'Pega el gráfico
ppt.ActiveWindow.View.Paste
Set ppt = Nothing
End Sub"
MICROSOFT OUTLOOK
"Este ejemplo crea y agrega información en una tarea nueva de Outlook. Ejecute Outlook y
haga clic en Tareas en la barra de Outlook para ver la nueva tarea.
NOTA: La tarea puede demorar unos minutos en aparecer."
Sub MS_Outlook()
Dim ol As Object, miElem As Object
-62-
CURSO DE
AUTOMATIZACION DE
EXCEL
'Crea una sesión de Microsoft Outlook
Set ol = CreateObject(""outlook.application"")
'Crea una tarea
Set miElem = ol.CreateItem(olTaskItem)
'Agrega información a la nueva tarea
With miElem
.Subject = ""Nueva tarea de VBA""
.Body = ""Esta tarea se creó mediante Automatización de Microsoft Excel""
.NoAging = True
.Close (olSave)
End With
'Quita el objeto de la memoria
Set ol = Nothing
End Sub"
CUADERNO DE MICROSOFT
Este ejemplo crea un archivo nuevo del Cuaderno de Microsoft, agrega secciones, manipula
la sección de Microsoft Excel y luego guarda el archivo.
Sub MS_Binder()
Dim MiCuadernoNuevo As Object, Sección As Object
Dim MyVar As String, MyFile As String
'Crea una sesión del Cuaderno de Microsoft
Set MiCuaderno = CreateObject(""office.binder"")
'Hace visible la sesión del Cuaderno
MiCuaderno.Visible = True
'Agrega una nueva sección de Word
MiCuaderno.Sections.Add Type:=""word.document""
'Agrega un archivo de Excel existente, antes de la primera sección
MiArchivo = Application.Path & ""\ejemplos\solver\muestra.xls""
Set SecciónNUeva = MiCuaderno.Sections.Add(FileName:=MiArchivo, Before:=1)
With SecciónNueva
'Cambia el nombre de la sección
.Name = ""Ejemplos de Solver""
'Obtiene el valor de la celda A2 en la tercera hoja del libro
MiVar = .Object.Worksheets(3).Range(""A2"").Value
End With
'Guarda el cuaderno como micuaderno.obd o lo sobrescribe si ya existe
MiCuaderno.SaveAs Application.Path & ""\micuaderno.obd"", bindOverwriteExisting
'Oculta el cuaderno
MiCuaderno.Visible = False
'Desasocia el objeto y como consecuencia libera recursos
Set MiCuaderno = Nothing
'Coloca el valor de A2 en la tercera hoja de la sección de Excel
MsgBox ""Los datos siguientes pertenecen a la celda A2 de la sección Ejemplos de Solver
"" &
Chr(10) & Chr(10) & MyVar
End Sub"
-63-