Professional Documents
Culture Documents
CAPTULO 141
ndice de contenido
AUTOMATIZACIN..........................................................................................................................2
INTRODUCCIN...........................................................................................................................2
NECESITO UN DICCIONARIO....................................................................................................2
PREPARANDO NUESTROS ELEMENTOS DE PRUEBAS.......................................................3
ACCESS......................................................................................................................................3
EXCEL........................................................................................................................................4
PROTOCOLO DDE........................................................................................................................4
FASE DE INICIO: DDEInitiate..................................................................................................4
RECOGER DATOS: DDERequest.............................................................................................6
ENVIAR DATOS: DDEPoke.....................................................................................................8
ENVO DE COMANDOS: DDEExecute...................................................................................9
FINALIZAR CONEXIN: DDETerminate / DDETerminateAll...............................................9
AUTOMATIZACIN: INDICACIONES INICIALES................................................................10
Registrar la referencia...............................................................................................................10
Abrir la aplicacin servidor.......................................................................................................10
Abrir un archivo existente.........................................................................................................10
Mtodos, propiedades y dems malas hierbas..........................................................................11
ACCESS WORD........................................................................................................................11
ACCESS EXCEL.......................................................................................................................14
ACCESS OUTLOOK.................................................................................................................17
ACCESS POWERPOINT...........................................................................................................18
FUNCIONES CREATEOBJECT() Y GETOBJECT()..................................................................19
PARA FINALIZAR.......................................................................................................................20
1
Vistame en http://siliconproject.com.ar/neckkito/
AUTOMATIZACIN
INTRODUCCIN
Y la pregunta del milln es... qu significa
automatizacin?
Un cliente (o controlador)
Un servidor OLE
El cliente sera pues la aplicacin que estamos utilizando, y que en un momento dado requiere
de los servicios de un servidor, por lo que el cliente se encarga de realizar las operaciones
sobre el servidor OLE de manera automtica.
NECESITO UN DICCIONARIO
Por ahora creo que la cosa ya se ha clarificado bastante, y ya entendemos qu es esto de
automatizacin.
Muy bien... Yo soy Neckkito Access, y, como cliente, voy a manejar Wordito Word... Y me
encuentro la primera sorpresa: Wordito habla en chino! As, lgicamente, no hay quien se
entienda...
Para solventar este tema necesito un diccionario... que en nuestro caso no es otra cosa que
una referencia o biblioteca propia de Word.
Y para adquirir esa referencia no tengo otro remedio que irme, en el men el VBE, a men
Herramientas Referencias, y buscar el diccionario que corresponda al idioma que la
aplicacin servidor entiende (en este ejemplo sera Microsoft Word x.y Object Library, donde
x.y es la versin que tengamos instalada en nuestro PC).
Resumiendo: si manejo una aplicacin servidor debo antes registrar la referencia adecuada
para que pueda establecerse una comunicacin entendible entre ambas aplicaciones.
2
Vistame en http://siliconproject.com.ar/neckkito/
PREPARANDO NUESTROS ELEMENTOS DE
PRUEBAS
ACCESS
Antes de seguir en materia vamos a prepararnos una
pequea BD de pruebas para ir desarrollando los ejemplos
de este captulo. Para ello, en una nueva aplicacin de
Access, creamos una tabla, la tabla TDatos, que tendr esta
simple estructura:
Finalmente vamos a crearnos una consulta, que llamaremos CDatosAct, que tendr la siguiente
estructura:
CapitalAct: [Capital]*[Factor]
Sacamos las propiedades de ese campo calculado y le definimos su formato como Moneda.
3
Vistame en http://siliconproject.com.ar/neckkito/
EXCEL
En el mismo directorio donde tenemos la BD vamos a
crearnos un Excel, que llamaremos InfoOrigen.xlsx (o xls).
En principio con esto nos basta para empezar con el primer epgrafe.
La idea de lo que vamos a desarrollar es la siguiente: nos pasan (o utilizamos) un Excel que
contiene unos valores que se van actualizando, y necesitamos de esos valores actualizados
para obtener informacin fidedigna de nuestra base de datos.
PROTOCOLO DDE
Hay una forma muy directa de establecer comunicacin entre las aplicaciones de Microsoft
Office. Esa forma es el protocolo Dynamic Data Interchange, o protocolo DDE. Los elementos
de este protocolo son:
Un cliente (o Destino)
Un Servidor (u Origen)
Un proceso de inicio, donde se abre un canal de comunicacin entre cliente y servidor
Un proceso de comunicacin, donde se establece un intercambio de datos entre
cliente y servidor
Un proceso de cierre, donde se cierra el canal de comunicacin.
Importante: con este protocolo ambas aplicaciones deben estar abiertas al mismo
tiempo. Si se cierra una de ellas el canal de comunicacin se cierra automticamente.
Teniendo en cuenta lo anterior vamos a ver cmo podemos aprovecharnos de este protocolo
DDE.
4
Vistame en http://siliconproject.com.ar/neckkito/
Ambos argumentos son requeridos. Y
Siguiendo con nuestra explicacin, DDEInitiate lo que hace es devolver un valor, de tipo Long,
que representa el canal que se ha establecido entre ambas aplicaciones.
Vamos a comprobarlo.
En ese botn que comentbamos al principio de este epgrafe vamos a programar el siguiente
cdigo (recordad que Access y Excel deben estar abiertas simultneamente para que
funcione):
<aplicacin> = excel
<tema> = DATOS Que se corresponde con el nombre de la hoja de Excel donde
hemos introducido los datos.
Si hacemos click sobre ese botn obtendremos un nmero, que se corresponder con el
nmero de canal.
En mi caso:
Cerramos Excel
Volvemos a hacer click sobre el botn
5
Vistame en http://siliconproject.com.ar/neckkito/
Y nos encontramos con el error 282, que dice as:
Por ello, y como tras el captulo 13 ya sabemos gestionar errores, podramos poner remedio a
esta situacin tan embarazosa (no lo haremos aqu, porque no es el objetivo del captulo,
claro).
Debemos tener en cuenta que este proceso consume recursos del sistema. Es conveniente
cerrar siempre el canal a travs de DDETerminate. Y, como habris podido comprobar en el
cdigo, DDETerminate es tan simple como poner el mtodo y, como argumento, el nmero de
canal que queremos cerrar. Fcil.
Por ejemplo, supongamos que queremos mostrar informacin sobre el valor del Euribor en un
MsgBox. Para ello, en un botn, podramos programar el siguiente cdigo:
Un par de cosillas:
6
Vistame en http://siliconproject.com.ar/neckkito/
ese sistema sea R1C1, o L1C1... Tendris que saber qu sistema utiliza vuestro Excel para
identificar las casillas (eso lo podis buscar dentro de las opciones de Excel, buscando el estilo
de referencia).
Si ahora nos situamos en la celda B2, sobre el cuadro de nombres, y reemplazo B2 por
Euribor, lo cual nos dar una cosa as:
podremos reprogramar nuestro cdigo haciendo referencia a ese nombre de celda. Es decir,
que nuestra lnea:
2.- Aadimos un factor de 1 a nuestra tabla TAct, simplemente para tener un registro
3.- Programamos un botn con el siguiente cdigo, que sacar el valor de la celda B3,
7
Vistame en http://siliconproject.com.ar/neckkito/
actualizar la tabla TAct y nos mostrar la consulta con las inversiones actualizadas 3:
Private Sub cmdInvActualizadas_Click()
'Declaramos las variables
Dim canalDDE As Long
Dim vFact As Double
Dim rst As DAO.Recordset
'Abrimos el canal
canalDDE = DDEInitiate("excel", "DATOS")
'Establecemos la comunicacin y sacamos el valor de B3
vFact = DDERequest(canalDDE, "F3C2")
'Abrimos el recordset
Set rst = CurrentDb.OpenRecordset("TAct", dbOpenTable)
With rst
'Nos movemos al primer registro
.MoveFirst
'Actualizamos el valor
.Edit
.Fields(0).Value = vFact
.Update
End With
'Mostramos la consulta con los valores actualizados
DoCmd.OpenQuery "CDatosAct", , acReadOnly
'Cerramos el canal
DDETerminate (canalDDE)
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub
Para poder probar este mtodo tendremos que hacer algunas pequeas modificaciones en
nuestras aplicaciones.
3.- Ahora ya s podemos programar un botn para pasar la informacin que introduzcamos en
txtCapt a la celda B5. El cdigo sera el siguiente:
3 Si no la tenemos registrada debemos registrar la librera Microsoft DAO 3.6 Object Library
8
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdDDEPoke_Click()
'Declaramos las variables
Dim canalDDE As Long
Dim vCapt As String
'Capturamos el valor de txtCapt
vCapt = Me.txtCapt.Value
'Abrimos el canal
canalDDE = DDEInitiate("excel", "DATOS")
'Pasamos el valor a la celda B5
DDEPoke canalDDE, "F5C2", vCapt
'Cerramos el canal
DDETerminate (canalDDE)
End Sub
Sin ms comentarios.
Su estructura es la siguiente:
9
Vistame en http://siliconproject.com.ar/neckkito/
DDETerminate <canal>
DDETerminateAll
Registrar la referencia
Como ya comentbamos unas pginas ms arriba, es necesario proporcionar a Access ese
diccionario para que pueda manejar el lenguaje de la aplicacin servidor.
Al registrar la referencia no slo hacemos posible la comunicacin entre aplicaciones, sino que,
cuando vayamos escribiendo cdigo, la ayuda contextual del VBE nos proporcionar las pistas
necesarias para ver qu elementos caben dentro de la expresin.
Abrimos una instancia de Word Equivaldra a abrir un Word nuevo, pero sin ningn
documento en l
Abrimos un nuevo documento y lo enmarcamos dentro de esa instancia Equivaldra al
propio documento (ese espacio en blanco donde podemos escribir)
S que esto puede parecer un poco confuso al principio, pero con el ejemplo del epgrafe
ACCESS WORD creo que lo entenderemos perfectamente.
10
Vistame en http://siliconproject.com.ar/neckkito/
Igual que lo que os comentaba, parece un poco confuso pero a travs del ejemplo espero que
lo entendamos perfectamente.
Por suerte para todos, en Internet hay mltiples ejemplos para realizar diversas acciones, por
lo que a una bsqueda, en el caso de que necesitis algo en concreto, os remito. La finalidad
de lo que explicar es que seis capaces de entender, encontrado el ejemplo, qu estis
haciendo, o si lo podis adaptar a las particularidades de vuestra BD.
ACCESS WORD
Vamos a realizar el ejemplo en dos fases:
La segunda fase, abriremos ese Word y pondremos toda la informacin que tengamos ah en
negrita.
Vamos a ver cmo podemos hacer eso. Como siempre, os pondr el cdigo ampliamente
comentado.
Recordad que en el editor de VBE debemos registrar la referencia Microsoft Word x.y Object
Library
11
Vistame en http://siliconproject.com.ar/neckkito/
Set rst = CurrentDb.OpenRecordset("TDatos", dbOpenSnapshot)
'Nos situamos en el primer registro
rst.MoveFirst
'Iniciamos el recorrido de registros
Do Until rst.EOF
'Escribimos los datos del registro
With Wrd.Selection
.TypeText (rst.Fields(0).Value)
.TypeParagraph
.TypeText (rst.Fields(1).Value)
.TypeParagraph
.TypeText (rst.Fields(2).Value)
.TypeParagraph
End With
'Nos movemos al siguiente registro
rst.MoveNext
Loop
'Guardamos el documento
Wrd.ActiveDocument.SaveAs FileName:=miArchivo, FileFormat:=wdFormatDocument
'Cerramos el documento y Word
DocWrd.Close
Wrd.Quit
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
Set Wrd = Nothing
End Sub
Un par de comentarios:
.- Tengamos en cuenta que una cosa es el Word como aplicacin y otra cosa es una hoja de
Word (el documento). Son dos elementos diferentes, y en el cdigo deben tratarse, pues,
como objetos diferentes (os comentaba esto en el epgrafe anterior).
Es por ello por lo que lo que es la aplicacin la definimos como el objeto Wrd, y la hoja de
Word la definimos como el objeto DocWord
.- Debe haber una equivalencia entre la extensin del documento y el formato con el que
guardamos el documento. Es decir, que si, en ejemplo, indicamos que se va a guardar un
archivo .doc (miArchivo = Application.CurrentProject.Path & "\MiWord.doc") en la lnea
(Wrd.ActiveDocument.SaveAs FileName:=miArchivo, FileFormat:=wdFormatDocument)
debemos decirle que el formato es wdFormatDocument
12
Vistame en http://siliconproject.com.ar/neckkito/
wdFormatHTML 8 Formato HTML estndar.
wdFormatRTF 6 Formato RTF.
Wrd.ActiveDocument.SaveAs FileName:=miArchivo
13
Vistame en http://siliconproject.com.ar/neckkito/
Fase 2
Ahora ya tenemos nuestro archivo de Word creado. Vamos a abrirlo para poder poner todo el
texto en negrita.
Fijaos en que:
.- En este caso no es necesario crear un nuevo documento, puesto que al abrirse el archivo
MiWord.doc ya tenemos el documento creado.
.- Para acceder a l slo hay que decirle que la instancia de Word lo abra, a travs de la lnea
Wrd.Documents.Open miArchivo
Bueno, como habis podido apreciar hay que saber algunas cosillas de cmo se escribe el
cdigo cuando hablamos de Word (y veremos lo mismo con el resto de aplicaciones). Eso s
que es un trabajo autnomo, y habr que recurrir a la ayuda del VBE de Access (puesto que al
registrar la biblioteca algunos de estos elementos que hemos visto se incorporan a la ayuda) o
a la ayuda del propio Word (la bsqueda por Internet ya la doy por supuesta).
ACCESS EXCEL
Cuando trabajamos con Excel debemos tener en cuenta los siguientes elementos:
La instancia de Excel
El libro activo
14
Vistame en http://siliconproject.com.ar/neckkito/
La hoja activa
Vamos a:
Recordad que debemos registrar la referencia Microsoft Excel x.y Object Library
15
Vistame en http://siliconproject.com.ar/neckkito/
.Cells(numFila, numColumna).Value = rst.Fields(2).Value
End With
'Reinicializamos la columna
numColumna = 1
'Pasamos a la siguiente fila
numFila = numFila + 1
'Nos movemos al siguiente registo
rst.MoveNext
Loop
'-----CDIGO PARA RELLENAR LA
HOJA2-------------------------------------------
'Cambiamos la hoja activa a la hoja2
Exc.Worksheets("Hoja2").Select
'Reinicializamos la hoja activa (que ahora es la Hoja2)
Set HojExc = Exc.ActiveSheet
'Creamos la SQL para menores de 2500
miSql = "SELECT * FROM TDatos WHERE Capital<2500"
'A partir de aqu, hasta la rutina de cierre de proceso, es un copy-paste
'del cdigo anterior
'Abrimos el recordset
Set rst = CurrentDb.OpenRecordset(miSql, dbOpenSnapshot)
'Inicializamos el nmero de fila y de columna
numFila = 1
numColumna = 1
'Creamos la cabecera con los campos
For Each fld In rst.Fields
HojExc.Cells(1, numColumna).Value = fld.Name
numColumna = numColumna + 1
Next fld
'Preparamos la fila
numFila = 2
'Reinicializamos la columna
numColumna = 1
'Nos movemos al primer registro
rst.MoveFirst
'Iniciamos el proceso
Do Until rst.EOF
'En la fila 2 escribimos los valores obtenidos en la SQL
With HojExc
.Cells(numFila, numColumna).Value = rst.Fields(0).Value
numColumna = numColumna + 1
.Cells(numFila, numColumna).Value = rst.Fields(1).Value
numColumna = numColumna + 1
.Cells(numFila, numColumna).Value = rst.Fields(2).Value
End With
'Reinicializamos la columna
numColumna = 1
'Pasamos a la siguiente fila
numFila = numFila + 1
'Nos movemos al siguiente registo
rst.MoveNext
Loop
'-----CERRAMOS EL PROCESO GUARDANDO EL EXCEL
Exc.ActiveWorkbook.SaveAs FileName:=miExcel, FileFormat:=xlExcel8
Exc.Quit
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
Set Exc = Nothing
End Sub
.- Fijaos que, para moverme por las celdas, utilizo CELLS(numFila, numColumna). Eso me
permite manipular las variables numFila y numColumna a mi antojo, para llevar los valores a
las celdas que me interesan.
16
Vistame en http://siliconproject.com.ar/neckkito/
.- De nuevo podis ver que manipulamos primero la instancia de Excel (variable Exc), el libro
activo (variable LibrExc) y la hoja activa (variable HojExc).
ACCESS OUTLOOK
No me entretendr demasiado con Outlook aqu, porque, bsicamente, la mecnica es la
misma: tengo que definir una instancia de Outlook y referenciar los objetos de Outlook (un
mensaje, un contacto, etc.).
4 En ocasiones el cdigo no me funciona correctamente si no tengo el Outlook previamente abierto. Si a vosotros os pasa lo mismo
probadlo abriendo Outlook antes de ejecutar el cdigo.
17
Vistame en http://siliconproject.com.ar/neckkito/
'por .Send
End With
'Eliminamos la instancia
Set Olk = Nothing
Set OlkMsg = Nothing
Set OlkDestinatario = Nothing
End Sub
ACCESS POWERPOINT
Aunque, personalmente, nunca he utilizado la automatizacin con PowerPoint, haremos un
pequeo ejemplo muy simple aqu, a fin de que quede para la posteridad.
Vamos a crearnos un PowerPoint con una diapositiva que nos dar la informacin del factor de
actualizacin.
18
Vistame en http://siliconproject.com.ar/neckkito/
End With
'Guardamos nuestra presentacin en el directorio de la base de datos
PWP.ActivePresentation.SaveAs miPresent,
ppSaveAsDefault
'Cerramos la presentacin
PWP.Quit
Set PWPDiapo = Nothing
Set PWP = Nothing
End Sub
Como veis el cdigo est ampliamente comentado. Como curiosidad os dir que, inicialmente,
no tena ni idea de cmo programar el ejemplo (ya os comentaba al principio de este apartado
que no utilizo la automatizacin con PowerPoint), por lo que me he pasado un buen rato
buceando por la ayuda. Pero, como podis comprobar, al final la cosa, ms bien o ms mal,
acaba saliendo. ;)
La idea principal para utilizar esas dos funciones radica en dos pasos:
Estas dos funciones, sin embargo, pueden servirnos para acceder a los objetos del sistema
(Windows), o a otras determinadas aplicaciones, y no slo para la automatizacin con las
aplicaciones de la suite Office.
Por ejemplo, en la ayuda de Access (en el VBE) se muestran ejemplos de cmo acceder a
archivos *.CAD, o a archivos *.DRW
19
Vistame en http://siliconproject.com.ar/neckkito/
No entraremos en este captulo a explicar las caractersticas de este ltimo objeto que hemos
mencionado. Me limito a mencionarlo por si a alguien le pica el gusanillo y quiere dedicarse a
estudiarlo por su cuenta.
PARA FINALIZAR
Y, en principio, eso es todo por lo que respecta al
tema de la automatizacin. S que hay ms
aplicaciones incluidas en la suite Office, pero en el
fondo, si hemos comprendido la mecnica de cmo
manejar los elementos de automatizacin, slo nos
queda la difcil tarea de investigar cmo son las
llamadas al cdigo propio de la aplicacin servidor.
Suerte!
20
Vistame en http://siliconproject.com.ar/neckkito/