Origen A
25
Origen B
0
Frmula original
#DIV/0!
Nueva frmula
Page 1
Origen A
25
Origen B
0
Formato original
#DIV/0!
Nuevo formato
#DIV/0!
Page 3
Ir
Ir al
al cdigo
cdigo de ejemplo
Matriz1
Matriz1
Ir
Ir al
al cdigo
cdigo de ejemplo
Matriz2
Matriz2
Ir
Ir al
al cdigo
cdigo de ejemplo
Matriz1
Ir
Ir al
al cdigo
cdigo de ejemplo
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.
Los ejemplos siguientes se centran en un escenario donde el programador tiene un rango de
celdas con nmeros 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 continuacin pare la
grabacin mediante el botn Detener grabacin 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
Ir
Ir al
al cdigo
cdigo de
de ejemplo
ejemplo
Macro_Grabada
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
Ir
Ir al
al cdigo
cdigo de
de ejemplo
ejemplo
For
For Each...Next
Each...Next
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
.Pattern = xlSolid
End With
End If
Next
End Sub
Ir
Ir al
al cdigo
cdigo de
de
ejemplo
ejemplo For..Next
For..Next
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
.ColorIndex = 6
.Pattern = xlSolid
End With
End If
Contador = Contador+ 1
Loop
Ir
Ir al
al cdigo
cdigo de
de
ejemplo
ejemplo DoLoop
DoLoop
Nota: Existen otros tipos de bucle DoLoop disponibles, que ofrecen ms flexibilidad en
determinadas circunstancias.
Si desea obtener ms informacin y detalles acerca de otras estructuras de bucle, consulte en la
Ayuda del entorno de Visual Basic la palabra bucles.
l cdigo grabado.
a accin grabada.
Valores Y
2
9
5
4
1
5
7
3
8
4
Ubicar
Ubicar rtulos
rtulos en
en el
el
grfico
grfico
Restablecer
Restablecer grfico
grfico
Valores Y
10
8
6
Valores Y
4
2
0
1
9 10
n)
Restablecer
Restablecer grfico
grfico
es Y
Valores Y
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
Dim
Dim
Dim
Dim
Dim
Dim
EjemploRDO()
ws As Workspace
rs As Recordset
qt As QueryTable
c As Connection
CadConec As String
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)
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 clculo y, a continuacin, restablecer el conjunto de registros en una tabla diferente de la base de datos.
Sub
Dim
Dim
Dim
Dim
Dim
ResettingDAORecordset()
bd As Database
rs As Recordset
qt As QueryTable
NewSheet As Object
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 clculo nueva en el libro activo
Set HojaNueva = Worksheets.Add
'Inserta una tabla de Query con informacin acerca del conjunto de registros en la hoja
nueva
Set qt = NewSheet.QueryTables.Add(rs, Range("a1"))
Sub
Dim
Dim
Dim
Dim
Dim
RetrieveAccessData()
Nsql As String, Ncriterios As String, Nvnculo As String
Neptuno As String
h As Integer
bd As Database, qry As Object
reg As Recordset, HojaNueva As Object
'Instalacin 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 "
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 cdigo deber tener Microsoft Access 97 instalado.
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
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
'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
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 vlido (nombre de fuente de datos). Para obtener ms informacin acerca de DSN, haga clic en el icono
32bit ODBC en el Panel de control de Windows.
Sub ODBC_Conexin()
Dim bd As Database, i As Long
'Presenta el cuadro de dilogo de DSN, que permite
'para, a continuacin, pedir informacin adicional
Set bd = DBEngine.Workspaces(0).OpenDatabase("", ,
'Cuenta el nmero de tablas
CuentaTabla = db.TableDefs.Count
'Realiza un bucle para presentar todos los nombres
For i = 0 To CuentaTabla - 1
MsgBox db.TableDefs(i).Name
Next
'Cierra la base de datos
bd.Close
End Sub
seleccionar la DSN
si es necesario
, "ODBC;")
en la tabla
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
CREAR UNA TABLA
Este ejemplo muestra cmo 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")
Goto
Ir
Retrievede
Access
RDO
Goto
Ir aa Ejemplo
Ejemplo
Cdigo
Data
de
Code
Cdigo
Data Sample
Sample
de ejemplo
ejemplo
Code
Ir
Goto
al
Retrieve
de
Ir
Goto
al cdigo
cdigo
de
ejemplo
Access
Restablecer
Sample
ejemplo
Access Data
Data
Restablecer
Sample
un
Code
un conjunto
conjunto
Code de
de
registros
registros DAO
DAO
Ir
Goto
aa Recuperar
Retrieve
Ir
Goto
Recuperar
Retrieve
datos
Access
de acceso
Data
Access
Data
Cdigo
Sample
de
Code
Cdigo
Sample
de ejemplo
ejemplo
Goto
Retrieve
Ir
aa Recuperar
Ir
Goto
Recuperar
Retrieve
Access
Data
datos
de acceso
Access
Data
Sample
Code
Cdigo
de
Cdigo
Sample
de ejemplo
ejemplo
Ir
Ir aa Recuperar
Recuperar
datos
datos de
de ISAM
ISAM
Cdigo
Cdigo de
de
ejemplo
ejemplo
Ir
Ir a Listar tablas
tablas
Cdigo
Cdigo de ejemplo
Ir
Ir a Listar
Listar campos
campos
Cdigo
Cdigo de
de ejemplo
ejemplo
Ir
Ir a conexin ODBC
Cdigo
Cdigo de
de 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 de
de ejemplo
ejemplo
Ir
Ir aa Crear
Crear una
una tabla
tabla
Cdigo
Cdigo de
de 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
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 cdigo de 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
BeforeDoubleClick
Un tipo de evento muy utilizado es BeforeDoubleClick en una hoja de clculo. 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
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.
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.
el As Boolean)