Está en la página 1de 35

Ejemplos de Microsoft Excel ®

Microsoft Excel '97 cuenta con una nueva interfaz para


la creación de macros denominada IDE (Sistema de
Desarrollo Integrado para Visual Basic). Si trabajó
anteriormente con macros en Excel, verá que los Funciones de hoja de cálculo Acceso a datos
módulos de macro aparecen ahora en el IDE, en vez
de en las hojas del libro.
Trabajar con matrices Automatización de Office
En este archivo de ejemplos hay hojas que explican los
procedimientos que puede seguir para automatizar una
serie de tareas comunes en Microsoft Excel. Puede Tareas repetitivas Control de eventos
pasar de una hoja al IDE para ver el código y copiar los
procedimientos en módulos que puede modificar según
sus necesidades. Agregar rótulos a gráficos
Para comenzar, haga clic en alguno de los temas que
aparecen a la derecha.

Microsoft proporciona ejemplos de procedimientos de Visual Basic for Applications (Visual Basic para Aplicaciones) sólo con propósito ilustrativo, sin ningún tipo de garantía, explícita o implícita, , incluidas
entre otras las garantías implícitas de comercialización o de uso para un fin en particular. Los procedimientos de Visual Basic en este libro de ejercicios se entregan tal cual aparecen ("as is"); Microsoft no
garantiza que se puedan utilizar en todo tipo de situaciones. A pesar de que los ingenieros de Microsoft AnswerPoint podrían ayudar a explicar el funcionamiento de una macro en particular, no modificarán
los ejemplos para agregar nuevas funciones, ni tampoco crearán macros como respuesta a necesidades específicas. Si usted tiene una experiencia limitada en programación, póngase en contacto con
algún Microsoft Solution Provider.
soft Excel ®

Acceso a datos

Automatización de Office

Control de eventos

opósito ilustrativo, sin ningún tipo de garantía, explícita o implícita, , incluidas


en este libro de ejercicios se entregan tal cual aparecen ("as is"); Microsoft no
yudar a explicar el funcionamiento de una macro en particular, no modificarán
d tiene una experiencia limitada en programación, póngase en contacto con
Funciones de hoja de cálculo

Ejemplos de funciones de hoja de cálculo


Esta hoja de cálculo contiene ejemplos de fórmulas que puede usar para completar algunas tareas usuales en hojas de cálculo.
Las celdas con fórmulas se muestran en azul. Si desea ver un ejemplo de fórmula, sitúe el cursor del mouse (ratón) sobre la celda
para presentar el comentario o presione ALT+º para cambiar entre presentar valores o fórmulas en la hoja de cálculo.
Para obtener más información acerca de una función, seleccione la celda con la función y luego haga clic en el botón
Modificar fórmula (=) en la barra de herramientas Estándar.

Suprimir la presentación de valores de error


Con frecuencia, las fórmulas de la hoja de cálculo devuelven valores de
error (#¡DIV/0!, #N/A, #¡VALUE!,#¡REF!, y #¡NUM!) si están basadas en
valores no esperados. En la fórmula de división del ejemplo que viene a
continuación, si la celda de origen es 0, devolverá #DIV/0! como error.

Origen A Origen B Fórmula original Nueva fórmula


25 0 #DIV/0!

Una forma de expresarlo es:


=SI(ESERROR(<fórmula>),"",<fórmula>)
donde <fórmula> es la fórmula en la cual se desea suprimir el valor que
produce el error. Si <fórmula> devuelve un error, el enunciado devolverá
"" (vacío); de lo contrario devolverá el resultado de <fórmula>.

Page 3
Funciones de hoja de cálculo

Otro método para suprimir la presentación de valores de error es usar la


opción Formato condicional, nueva en Excel 97. Esta opción permite
que la celda muestre distintos formatos según el contenido de la misma.
En el caso de valores de error, el procedimiento sería:
1. Seleccione la celda para dar formato. En este caso es $F$19.
2. Haga clic en Formato condicional en el menú Formato.
3. En el primer cuadro desplegable, seleccione "Fórmula".
4. En el cuadro de edición, escriba: =SIERROR($F$19).
5. Haga clic en el botón formato y seleccione un formato,
en este caso se eligió azul para el fondo y la fuente.
6. Haga clic en Aceptar.
Como resultado, los valores de error, la fuente y el fondo presentarán el
mismo color por lo que no se mostrará nada.

Origen A Origen B Formato original Nuevo formato


25 0 #DIV/0! #DIV/0!

Numerar, coincidir y buscar valores


Una de las tareas más comunes para realizar en listas es encontrar el
valor del punto de intersección entre una columna y una fila en un rango
rectangular de celdas en una hoja de cálculo. El Asistente para
búsquedas le ayudará a escribir fórmulas para completar esta tarea.

Para usar esta opción, seleccione una celda dentro del rango de datos
que desea utilizar: En el menú Herramientas, seleccione Asistente y, a
continuación, Búsquedas. Siga las instrucciones del asistente.

Si desea obtener información adicional, use el Ayudante de Office.

Fórmulas de suma condicional


Otra tarea frecuente en Excel es calcular la suma de los valores que
cumplen las condiciones especificadas. El Asistente para suma
condicional le ayudará a escribir fórmulas para completar esta tarea.

Para usar esta opción, seleccione una celda dentro de la lista que
desea resumir. En el menú Herramientas seleccionePage 4
Asistente y, a
continuación, Suma condicional. Siga las instrucciones del asistente.

Si desea obtener información adicional, use el Ayudante de Office.


Funciones de hoja de cálculo
Otra tarea frecuente en Excel es calcular la suma de los valores que
cumplen las condiciones especificadas. El Asistente para suma
condicional le ayudará a escribir fórmulas para completar esta tarea.

Para usar esta opción, seleccione una celda dentro de la lista que
desea resumir. En el menú Herramientas seleccione Asistente y, a
continuación, Suma condicional. Siga las instrucciones del asistente.

Si desea obtener información adicional, use el Ayudante de Office.

Ir a inicio

Page 5
Trabajar con matrices
RESUMEN
El método mas utilizado para transferir el contenido de una matriz a una hoja de cálculo es
mediante un bucle, por ejemplo For...Next. Un bucle como For...Next permite contar el número de
bucles realizados en la matriz y transferir elementos de la misma a su destino de uno en uno. Se
puede conseguir el mismo resultado sin el bucle, usando la propiedad FormulaArray del objeto
Range de Visual Basic para aplicaciones.

En Visual Basic para aplicaciones, la orientación de una matriz unidimensional es horizontal.


Como consecuencia, si el rango de celdas en la hoja de cálculo que va a recibir el contenido de la
matriz tiene la misma orientación, es decir, una sola fila y varias columnas, es posible transferir su
contenido mediante el enunciado FormulaArray. Por ejemplo:

Sub Matriz1() 'Para una matriz unidimensional


horizontal
Dim x(1 To 10) As Double 'Declara una matriz de tamaño 10
For j = 1 To 10 'Calcula valores al azar
x(j) = j * j
Next j
'Transfiere el contenido de una matriz a un área horizontal Ir
Ir al
al código
código de ejemplo
Range(Cells(2, 1), Cells(2, 10)).FormulaArray = x Matriz1
Matriz1
End Sub
El ejemplo anterior funciona correctamente cuando en la hoja de cálculo de destino se hace
referencia a una sola fila. Sin embargo, este ejemplo no será válido cuando sea necesario
transferir el contenido de una matriz a un rango de celdas con orientación vertical, es decir, una
columna y varias filas.

En el caso de varias filas de datos orientadas en forma de matriz bidimensional, es necesario


cambiar la orientación de la matriz. Para hacerlo, declare la matriz como matriz bidimensional de
varias filas y una sola columna. Por ejemplo:

Sub Matriz2() 'Para una matriz bidimensional vertical Ir


Ir al
al código
código de ejemplo
'Declara una matriz de 10 filas y 1 columna Matriz2
Matriz2
Dim x(1 To 10, 1 To 1) As Double
'Calcula valores aleatorios
For j = 1 To 10
x(j, 1) = j * j
Next j
'Transfiere el contenido de la matriz a un área vertical
Range(Cells(1, 2), Cells(10, 2)).FormulaArray = x
End Sub

La matriz bidimensional presentada en el ejemplo anterior permite que Visual Basic establezca la
orientación de la matriz como orientación vertical. De este modo, se puede transferir la matriz a
una hoja de cálculo sin utilizar un bucle.

Ir a inicio
Ir
Ir al
al código
código de ejemplo
Matriz1
Matriz1

Ir
Ir al
al código
código de ejemplo
Matriz2
Matriz2
Tareas repetitivas
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.

Los ejemplos siguientes se centran en un escenario donde el programador tiene un rango de


celdas con números en la columna A, y dependiendo del valor de la celda, desea cambiar el color
de la celda correspondiente en la columna B.

Primero grabaremos el proceso de cambiar el color de fondo de la celda:


(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
' Ir
Ir al
al código
código de
de ejemplo
ejemplo
With Selection.Interior Macro_Grabada
Macro_Grabada
.ColorIndex = 6
.Pattern = xlSolid
End With
End Sub

Nota: Si al grabar seleccionó una celda, puede aparecer en la macro el texto


Range("A3").Select. Si deja esta línea sin modificar, cada vez que ejecute la macro se
seleccionará la celda especificada en el objeto Range. No quite esta línea de la macro si desea
seleccionar la celda.

A continuación se puede modificar ligeramente el código y agregar alguna estructura de bucle en el código grabado.

Bucle For Each…Next

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á:
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 Ir
Ir al código de ejemplo
With celda_en_bucle.Offset(0, 1).Interior For
For Each...Next
Each...Next
.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 Ir
Ir al
al código
código de
de
.Pattern = xlSolid ejemplo
ejemplo For..Next
For..Next
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
If Selection.Offset(Contador, 0).Value > 20 Then
With Selection.Offset(Contador, 1).Interior Ir
Ir al
al código
código de
de
.ColorIndex = 6 ejemplo
ejemplo Do…Loop
Do…Loop
.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.

Ir a inicio
l código grabado.

a acción grabada.
Adjuntar rótulos a un gráfico XY (Dispersión)
Rótulos Valores X Valores Y
Punto de datos 1 2 5 Ubicar
Ubicar rótulos
rótulos en
en el
el Restablecer
Restablecer gráfico
Punto de datos 2 9 7 gráfico
gráfico
Punto de datos 3 5 3
Punto de datos 4 4 8
Punto de datos 5 1 4
Valores Y
10
8
En Microsoft Excel no existe un método para agregar
rótulos automáticamente a un gráfico XY (Dispersión). Sin 6 Valores Y
embargo, puede usar una macro para realizar esta tarea. 4
La macro adjunta muestra cómo aplicar rótulos en un 2
gráfico XY (Dispersión) y asume que los datos y rótulos
0
asociados están ordenados del mismo modo que en las
celdas sombreadas anteriores. 1 2 3 4 5 6 7 8 9 10

Para aplicar los rótulos de puntos de datos presione el


botón "Ubicar rótulos en el gráfico".

Para quitar los rótulos y poder iniciar una nueva


demostración, presione el botón "Restablecer gráfico".

Para ver el código de la macro adjunta a la hoja, presione


el botón "Ver código".

Ver
Ver código
código

Ir a inicio
n)
Restablecer
Restablecer gráfico
gráfico

es Y

Valores Y

8 9 10

código
código
Acceso a datos
RESUMEN
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,
'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

RESTABLECER UN CONJUNTO DE REGISTROS DAO


Este ejemplo utiliza la base de datos de muestra Neptuno.mdb de Microsoft Access para crear la tabla de Query en una
nueva hoja de cálculo y, a continuación, restablecer el conjunto de registros en una tabla diferente de la base de datos.

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"))

'Realiza una actualización sincronizada en la tabla de Query


qt.Refresh False
'Cierra el conjunto de registros
rs.Close
'Abre un conjunto de registros con todos los registros de la tabla pedidos
Set rs = bd.OpenRecordset("pedidos")
'Cambia el conjunto de registros de la tabla de Query existente
Set qt.Recordset = rs
'Realiza una actualización sincronizada de la tabla de Query para presentar los datos
qt.Refresh False
'Cierra el conjunto de registros
rs.Close
'Cierra la base de datos
bd.Close
End Sub

RECUPERAR DATOS DESDE MICROSOFT ACCESS


Este ejemplo utiliza DAO para crear una consulta basada en dos tablas en el archivo de muestra Neptuno.mdb. Si la
consulta ya existe, la rutina de control de errores la eliminará.
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
Resume
Else
MsgBox Error(Err)
End If
End Sub

RECUPERAR DATOS CON CONTROLADORES ISAM


Este ejemplo muestra cómo recuperar datos desde un archivo dBase y sitúa el resultado en una nueva hoja de cálculo.
Debe tener previamente instalados los controladores ISAM apropiados.

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

REALIZAR UNA LISTA DE TABLAS EN LA BASE DE DATOS


Este ejemplo realiza una lista de los nombres de la tabla en la base de datos de muestra Neptuno.mdb de Microsoft Access.

NOTA: Para ejecutar este código deberá tener Microsoft Access 97 instalado.

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
db.Close
End Sub

REALIZAR UNA LISTA DE CAMPOS EN UNA BASE DE DATOS


Este ejemplo realiza una lista los nombres de campos de la tabla Clientes. Si no tiene instalado clientes.dbf, consulte el
tema de la Ayuda "Instalar o quitar componentes individuales de Microsoft Office o Microsoft Excel"

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

CONECTAR CON UNA BASE DE DATOS SQL


Este ejemplo devuelve los nombres de una tabla de una base de datos SQL. Deberá tener acceso a una base de datos
SQL y un DSN válido (nombre de fuente de datos). Para obtener más información acerca de DSN, haga clic en el icono
32bit ODBC en el Panel de control de Windows.

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

LOCALIZAR ERRORES DAO

El ejemplo siguiente demuestra cómo localizar errores DAO. La presentación de una descripción del error es generalmente
de utilidad para el usuario. Conocer el número de errores permite al programador localizar y controlar errores específicos.

Sub Controlar_DAO_Error()
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

CREAR UNA TABLA


Este ejemplo muestra cómo crear una nueva tabla dentro de una base de datos existente. En el ejemplo siguiente se utiliza
la base de datos de muestra Neptuno instalada con Microsoft Access 97.
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

Ir a inicio
Goto
Ir
Ir aa Ejemplo
Goto Retrieve
Retrievede
Ejemplo Access
RDO
Código
Data
Data Sample
Código de
de ejemplo
Sample Code
ejemplo
Code
Ir
Goto
Ir al
al código
Goto Retrieve
código de
Retrieve
de
ejemplo
Access
Access Data
ejemplo Restablecer
Data Sample
Restablecer
Sample
un
un conjunto
Code
Code de
conjunto de
registros
registros DAO
DAO

Ir a Goto
Ir Goto Retrieve
Recuperar datos
Retrieve
datos
Access
de Data
de acceso
Access Sample
DataCódigo
acceso Código
de Code
de ejemplo
Code
ejemplo
Ir
Ir a Goto
Recuperar
Goto Retrieve
datos
Retrieve
datos
Access
de
de acceso
Access Data
DataCódigo
acceso Sample
Código
de
de Code
ejemplo
Code
ejemplo
Ir
Ir aa Recuperar
Recuperar
datos
datos dede ISAM
ISAM
Código
Código dede ejemplo
ejemplo
Ir
Ir a Listar tablas
Código
Código de ejemplo

Ir
Ir a Listar
Listar campos
campos
Código
Código dede ejemplo
ejemplo
Ir
Ir aa conexión
conexión ODBC
ODBC
Código
Código dede ejemplo
ejemplo

Ir
Ir aa Capturar
Capturar errores
errores
de
de DAO Código de
ejemplo
ejemplo

Ir
Ir aa Crear
Crear una
una tabla
tabla
Código
Código dede ejemplo
ejemplo
Ir
Ir aa Crear
Crear una
una tabla
tabla
Código
Código dede ejemplo
ejemplo
Automatización de Office
RESUMEN
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.
Ir
Ir al
al código
código de
de
ejemplo
ejemplo MS_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
MICROSOFT WORD
Este ejemplo copia el gráfico desde la hoja Rótulos de gráficos a un documento nuevo de Microsoft Word.
Ir
Ir al
al código
código de
de
ejemplo
ejemplo MS_Word
MS_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.

Ir
Ir al
al código
código de
de ejemplo
ejemplo
MS_PowerPoint
MS_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.
Ir
Ir al
al código
código de
de ejemplo
ejemplo
MS_Outlook
MS_Outlook
Sub MS_Outlook()
Dim ol As Object, miElem As Object
'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.

Ir
Ir a MS_Binder
MS_Binder Código
Código
Sub MS_Binder() de
de ejemplo
ejemplo
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

Ir a inicio
Programar con eventos

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

Un tipo de evento muy utilizado es BeforeDoubleClick en una hoja de cálculo. Un ejemplo


sencillo puede ser:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)


MsgBox "Hizo doble clic en la celda " & Target.Address
Cancel = True
End Sub

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.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)


MsgBox "Esta hoja cambió en la celda " & Target.Address
End Sub

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.
Sub Workbook_BeforeClose(Cancel As Boolean)
a = MsgBox("¿Desea cerrar el libro?", vbYesNo)
If a = vbNo Then Cancel = True
End Sub

En este ejemplo, se pide al usuario que cierre el archivo independientemente de si lo guardó


previamente o no.

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:

Public WithEvents App As Application

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.

Antes de ejecutar los procedimientos debe conectar el objeto declarado en el módulo de clase con
el objeto Application. Puede utilizar el siguiente código con cualquier módulo.

Dim X As New EventClassModule

Sub IniciarAp()
Set X.App = Application
End Sub

Después de ejecutar el procedimiento IniciarAp, el objeto App en el módulo de clase apuntará al


objeto Aplicación de Microsoft Excel y los procedimientos del evento se ejecutarán cuando el
evento ocurra.

Nota: Si desea obtener más información acerca de eventos, consulte la Ayuda.

Ir a inicio
el As Boolean)

También podría gustarte