Professional Documents
Culture Documents
Microsoft proporciona ejemplos de procedimientos de Visual Basic for Applications (Visual Basic para Aplicaciones) slo con propsito ilustrativo, sin ningn tipo de garanta, explcita o implcita, , incluidas
entre otras las garantas implcitas de comercializacin 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 podran ayudar a explicar el funcionamiento de una macro en particular, no modificarn
los ejemplos para agregar nuevas funciones, ni tampoco crearn macros como respuesta a necesidades especficas. Si usted tiene una experiencia limitada en programacin, pngase en contacto con
algn Microsoft Solution Provider.
soft Excel
Acceso a datos
Automatizacin en Office
Automation
Control de eventos
Page 3
Funciones de hoja de clculo
Para usar esta opcin, seleccione una celda dentro del rango de datos
que desea utilizar: En el men Herramientas, seleccione Asistente y, a
continuacin, Bsquedas. Siga las instrucciones del asistente.
Para usar esta opcin, seleccione una celda dentro de la lista que desea
Pagey,4a
resumir. En el men Herramientas seleccione Asistente
continuacin, Suma condicional. Siga las instrucciones del asistente.
Para usar esta opcin, seleccione una celda dentro de la lista que desea
resumir. En el men Herramientas seleccione Asistente y, a
continuacin, Suma condicional. Siga las instrucciones del asistente.
Page 5
Trabajar con matrices
RESUMEN
El mtodo mas utilizado para transferir el contenido de una matriz a una hoja de clculo es
mediante un bucle, por ejemplo For...Next. Un bucle como For...Next permite contar el nmero 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
orientacin de la matriz como orientacin vertical. De este modo, se puede transferir la matriz a
una hoja de clculo sin utilizar un bucle.
Ir
Ir al
al cdigo
cdigo de ejemplo
Matriz1
Matriz1
Ir
Ir al
al cdigo
cdigo de ejemplo
Matriz2
Matriz2
Tareas repetitivas
A menudo es necesario repetir un tipo de tarea especfica para un grupo de elementos, que
pueden ser celdas, celdas en un rango, hojas de clculo de un libro o libros en una aplicacin.
A pesar de que una macro no puede grabar bucles, se puede grabar la tarea principal y luego,
mediante pequeas modificaciones en el cdigo, se pueden crear distintos tipos de bucles segn
las necesidades del proyecto.
Sub Macro_Grabada()
'
' Macro grabada el 6-30-97
' Ir
Ir al
al cdigo
cdigo de
de ejemplo
ejemplo
With Selection.Interior Macro_Grabada
Macro_Grabada
.ColorIndex = 6
.Pattern = xlSolid
End With
End Sub
A continuacin se puede modificar ligeramente el cdigo y agregar alguna estructura de bucle en el cdigo grabado.
Para usar el bucle For EachNext se debe conocer el rango de celdas al que deseamos aplicar la accin grabada.
Como condicin de este ejemplo, slo 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 slo 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 cdigo usando
el mtodo Offset en la celda en la que se aplicar el bucle (celda_en_bucle).
El cdigo 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 cdigo 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 ForNext
Si conoce el nmero de veces que desea realizar un bucle en el cdigo, 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 cdigo 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 cdigo
cdigo 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 cdigo no especifique ningn 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 nmero 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.
DoLoop
Para establecer cundo detener un bucle basado en una condicin determinada, puede ser
apropiado utilizar DoLoop. Esta estructura de bucle permite comprobar las propiedades o
condiciones de la variable antes de ejecutar el bucle. En el ejemplo siguiente, el bucle contina
hasta que el nmero 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 cdigo
cdigo de
de
.ColorIndex = 6 ejemplo
ejemplo DoLoop
DoLoop
.Pattern = xlSolid
End With
End If
Contador = Contador+ 1
Loop
Nota: Existen otros tipos de bucle DoLoop disponibles, que ofrecen ms flexibilidad en
determinadas circunstancias.
a accin grabada.
Adjuntar rtulos a un grfico XY (Dispersin)
Rtulos Valores X Valores Y
Punto de datos 1 2 5 Ubicar
Ubicar rtulos
rtulos en
en el
el Restablecer
Restablecer grfico
Punto de datos 2 9 7 grfico
grfico
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 mtodo para agregar
rtulos automticamente a un grfico XY (Dispersin). Sin 6 Valores Y
embargo, puede usar una macro para realizar esta tarea. 4
Ver
Ver cdigo
cdigo
n)
Restablecer
Restablecer grfico
grfico
es Y
Valores Y
7 8 9 10
cdigo
cdigo
Acceso a datos
RESUMEN
Los objetos de acceso a datos (DAO), permiten la manipulacin 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 dilogo Referencias en el
men Herramientas) en el Editor de Visual Basic. Adems, es necesario tener instalados los controladores de ODBC o
ISAM apropiados. Para obtener ms informacin 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 ubicacin predeterminada de la instalacin. Si instal Microsoft Office en una ubicacin 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 sita en una tabla de Query en una hoja de clculo
nueva. Utilice este mtodo 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 ubicacin predeterminada,
'cambie la ruta para indicar la carpeta adecuada antes de ejecutar el cdigo
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 conexin con el directorio que contiene los archivos DBF
Set c = ws.OpenConnection("", 1, 0, ConnectStr)
'Obtiene todos los registros de la tabla y slo permite desplazarse
'hacia adelante por los registros (mtodo ms rpido)
Sub RetrieveISAMdata()
Dim Db As database, rec As Recordset
dPath As String
Dim h As Integer, NewSheet As Object
'Ruta de instalacin 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")
Sub TablasLista()
Dim bd As Database, CuentaTabla As Long, i As Long
Dim dRuta As String
'Ubicacin 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 travs 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
'Ubicacin 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 nmero 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_Conexin()
Dim bd As Database, i As Long
'Presenta el cuadro de dilogo de DSN, que permite seleccionar la DSN
'para, a continuacin, pedir informacin adicional si es necesario
Set bd = DBEngine.Workspaces(0).OpenDatabase("", , , "ODBC;")
'Cuenta el nmero 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 cmo localizar errores DAO. La presentacin de una descripcin del error es generalmente
de utilidad para el usuario. Conocer el nmero de errores permite al programador localizar y controlar errores especficos.
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 'Nmero del error
MsgBox DBEngine.Errors(0).Source 'Ubicacin del error
MsgBox DBEngine.Errors(0).HelpContext
End Sub
Ir
Goto
Ir al
al cdigo
Goto Retrieve
cdigo 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
Goto
Ir al
al cdigo
Goto Retrieve
cdigo 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
Ir a Goto
Recuperar
Goto Retrieve
datos
Retrieve
datos
Access
de
de acceso
Access Data
DataCdigo
acceso Sample
Cdigo
Sample
de
de Code
ejemplo
Code
ejemplo
Ir
Ir a Goto
Recuperar
Goto Retrieve
datos
Retrieve
datos
Access
de
de acceso
Access Data
DataCdigo
acceso Sample
Cdigo
Sample
de
de Code
ejemplo
Code
ejemplo
Ir
Ir aa Recuperar
Recuperar
datos
datos dede ISAM
ISAM
Cdigo
Cdigo dede ejemplo
ejemplo
Ir
Ir a Listar tablas
Cdigo
Cdigo de ejemplo
Ir
Ir a Listar
Listar campos
campos
Cdigo
Cdigo dede ejemplo
ejemplo
Ir
Ir aa conexin
conexin ODBC
ODBC
Cdigo
Cdigo dede ejemplo
ejemplo
Ir
Ir aa Capturar
Capturar errores
errores
de
de DAO
DAO Cdigo
Cdigo de
de
ejemplo
ejemplo
Ir
Ir aa Crear
Crear una
una tabla
tabla
Cdigo
Cdigo dede ejemplo
ejemplo
Ir
Ir aa Crear
Crear una
una tabla
tabla
Cdigo
Cdigo dede ejemplo
ejemplo
Automatizacin de Office
RESUMEN
La automatizacin es una opcin de COM (Component Object Model), una tecnologa que usan las aplicaciones
para exponer los objetos a las herramientas de desarrollo, lenguajes de macro y otras aplicaciones que admiten
automatizacin. Por ejemplo, una aplicacin de hoja de clculo puede presentar una hoja de clculo, un grfico, 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 aplicacin, un documento, un prrafo, una frase, un marcador o una seleccin. En los
ejemplos siguientes se muestran tareas de automatizacin entre Microsoft Excel y otras aplicaciones de Microsoft.
Para obtener ms informacin acerca de la automatizacin, consulte Automatizacin de tareas repetitivas en la
Ayuda de VBA.
MICROSOFT ACCESS
Este ejemplo devuelve la ubicacin de las bases de datos de muestra de Microsoft Access.
Ir
Ir al
al cdigo
cdigo de
de
ejemplo
ejemplo MS_Access
Sub MS_Access()
Dim AccDir As String
Dim acc As Object
'Automatizacin OLE de Access
Set acc = CreateObject("access.application")
'Devuelve la ruta de msaccess.exe
AccDir = acc.SysCmd(Action:=acSysCmdAccessDir)
'Presenta la ruta
MsgBox "La ubicacin de MSAccess.exe es " & AccDir
'Libera espacio de disponibilidad variable
Set acc = Nothing
End Sub
MICROSOFT WORD
Este ejemplo copia el grfico desde la hoja Rtulos de grficos a un documento nuevo de Microsoft Word.
Ir
Ir al
al cdigo
cdigo de
de
ejemplo
ejemplo MS_Word
MS_Word
Sub MS_Word()
Dim wd As Object
'Crea una sesin de Microsoft Word
Set wd = CreateObject("word.application")
'Copia el grfico en la hoja Rtulos de grficos
Worksheets("Rtulos de grficos").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 prrafo
.Selection.TypeParagraph
'Pega el grfico
.Selection.PasteSpecial link:=True, DisplayAsIcon:=False, Placement:=wdInLine
End With
Set wd = Nothing
End Sub
MICROSOFT POWERPOINT
Este ejemplo copia el grfico desde Rtulos de grficos a una nueva presentacin de Microsoft PowerPoint.
Ir
Ir al
al cdigo
cdigo de
de ejemplo
ejemplo
MS_PowerPoint
MS_PowerPoint
Sub MS_PowerPoint()
Dim ppt As Object, pres As Object
'Crea una sesin de Microsoft PowerPoint
Set ppt = CreateObject("powerpoint.application")
'Copia el grfico en la hoja Rtulos de grficos
Worksheets("Rtulos de grficos").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 grfico
ppt.ActiveWindow.View.Paste
Set ppt = Nothing
End Sub
MICROSOFT OUTLOOK
Este ejemplo crea y agrega informacin 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 cdigo
cdigo de
de ejemplo
ejemplo
MS_Outlook
MS_Outlook
Sub MS_Outlook()
Dim ol As Object, miElem As Object
'Crea una sesin de Microsoft Outlook
Set ol = CreateObject("outlook.application")
'Crea una tarea
Set miElem = ol.CreateItem(olTaskItem)
'Agrega informacin a la nueva tarea
With miElem
.Subject = "Nueva tarea de VBA"
.Body = "Esta tarea se cre mediante Automatizacin 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 seccin de Microsoft
Excel y luego guarda el archivo.
Ir
Ir a MS_Binder
MS_Binder Cdigo
Cdigo
Sub MS_Binder() de
de ejemplo
ejemplo
Dim MiCuadernoNuevo As Object, Seccin As Object
Dim MyVar As String, MyFile As String
'Crea una sesin del Cuaderno de Microsoft
Set MiCuaderno = CreateObject("office.binder")
'Hace visible la sesin del Cuaderno
MiCuaderno.Visible = True
'Agrega una nueva seccin de Word
MiCuaderno.Sections.Add Type:="word.document"
'Agrega un archivo de Excel existente, antes de la primera seccin
MiArchivo = Application.Path & "\ejemplos\solver\muestra.xls"
Set SeccinNUeva = MiCuaderno.Sections.Add(FileName:=MiArchivo, Before:=1)
With SeccinNueva
'Cambia el nombre de la seccin
.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 seccin de Excel
MsgBox "Los datos siguientes pertenecen a la celda A2 de la seccin Ejemplos de
Solver " &
Chr(10) & Chr(10) & MyVar
End Sub
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 accin. Los
eventos estn siempre asociados con objetos, como puede ser el caso de una hoja de clculo o un
libro. En este ejemplo slo se mencionar algunos de los eventos disponibles y se usar un
MsgBox como relleno para demostrar dnde puede ir el cdigo. Para obtener ms informacin
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 clculo).
BeforeDoubleClick
Este evento se desencadenar cada vez que el usuario haga doble clic en una celda de la hoja de
clculo. El parmetro 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 cdigo. Al establecer Cancel como True se cancelar la accin
predeterminada para el evento. En este caso, la accin predeterminada al hacer doble clic en una
celda es cambiar al modo de edicin para esa celda. Debido a que Cancel est establecido como
True, esto no ocurrir. Si desea obtener la accin predeterminada, quite la lnea Cancel=True.
Change
Otro evento de gran utilidad en una hoja de clculo, 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
Despus de declarar los eventos del nuevo objeto, aparecer la lista desplegable de Object, con el
objeto incluido en el mdulo de clase. A continuacin puede escribir los procedimientos para el
nuevo objeto. Al seleccionar el nuevo objeto en el cuadro Object, los eventos vlidos para ese
objeto se presentarn en el cuadro de lista desplegable Procedure.
Antes de ejecutar los procedimientos debe conectar el objeto declarado en el mdulo de clase con
el objeto Application. Puede utilizar el siguiente cdigo con cualquier mdulo.
Sub IniciarAp()
Set X.App = Application
End Sub