Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Exportando Bases de Datos Desde Access A
Exportando Bases de Datos Desde Access A
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
Page 3
Funciones de hoja de cálculo
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.
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.
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.
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.
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.
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
A continuación se puede modificar ligeramente el código y agregar alguna estructura de bucle en el código grabado.
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
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)
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"))
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")
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
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
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
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
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.
Sub Workbook_BeforeClose(Cancel As Boolean)
a = MsgBox("¿Desea cerrar el libro?", vbYesNo)
If a = vbNo Then Cancel = True
End Sub
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.
Sub IniciarAp()
Set X.App = Application
End Sub
Ir a inicio
el As Boolean)