You are on page 1of 20

CURSO DE VB

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 La BD donde estn los ejemplos de este captulo os la podis bajar aqu.

1
Vistame en http://siliconproject.com.ar/neckkito/
AUTOMATIZACIN

INTRODUCCIN
Y la pregunta del milln es... qu significa
automatizacin?

Y si yo os pregunto: os suena la palabrita OLE?

Supongo que todos me diris... Claro, OLE... Object


Linking and Embedding... Quin es que no sabe eso?

Pues claro claro... no s si queda... je, je...

La automatizacin (o automatizacin OLE) no es ms que una tecnologa que permite manejar


datos de una aplicacin directamente desde otra aplicacin.

As pues, podemos distinguir dos elementos en un proceso de 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.

Dicho en pocas palabras, si estamos en Access y gestionamos (lgicamente desde Access) un


Word nuestro Access sera el cliente, y Word sera el servidor OLE.

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:

A continuacin creamos la tabla TAct, que slo contendr un campo:

El tipo de datos de [Factor] ser Doble, con 2 decimales.

Finalmente vamos a crearnos una consulta, que llamaremos CDatosAct, que tendr la siguiente
estructura:

Por si no se ve bien el campo calculado la expresin es:

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

1.- Renombramos la HOJA1 a DATOS


2.- Respetando las celdas que veris en las ilustraciones,
montamos el Excel as (en la ilustracin de la izquierda, los
valores; en la de la derecha, las frmulas):

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.

FASE DE INICIO: DDEInitiate


Vamos a abrir nuestro Excel, y despus abriremos nuestra base de datos. Nos vamos a crear
un formulario en blanco y aadiremos un botn de comando. Lo programaremos despus.
Ahora vamos a ver la sistemtica de cmo abrimos un canal de comunicacin.

La estructura para ello es la siguiente:

DDEInitiate (<aplicacion>, <tema>)

4
Vistame en http://siliconproject.com.ar/neckkito/
Ambos argumentos son requeridos. Y

<aplicacion> ser el nombre del Servidor


<tema> ser el identificador de donde cogemos los datos.

Nuestro amigo Access define <tema> como asunto de una


conversacin de intercambio de datos dinmicos (DDE)
entre dos aplicaciones. Para la mayora de las aplicaciones
que utilizan archivos, el tema es un nombre de archivo 2.

En fin... como veis, a veces la ayuda de Access parece


escrita para nigromantes.

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

Private Sub cmdDDEInitiate_Click()


Dim numCanal As Long
numCanal = DDEInitiate("excel", "DATOS")
MsgBox "El nmero de canal que se ha abierto entre Access y Excel es: " _
& numCanal, vbInformation, "CANAL"
DDETerminate (numCanal)
End Sub

Como vemos, nuestros argumentos han sido:

<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:

Para evitarnos sorpresas vamos a hacer una cosa:

Cerramos Excel
Volvemos a hacer click sobre el botn

2 Extrado de la ayuda de Access

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.

RECOGER DATOS: DDERequest


Vamos a ver cmo podemos recoger datos de la aplicacin servidor. Para ello utilizaremos el
mtodo DDERequest.

La estructura de DDERequest es la siguiente:

DDERequest (<canal>, <elemento>)

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:

Private Sub cmdDDEMsgBox_Click()


'Declaramos las variables
Dim CanalDDE As Long
Dim vEurib As Variant
'Abrimos el canal
CanalDDE = DDEInitiate("excel", "DATOS")
'Establecemos la comunicacin y sacamos el elemento (valor) de la
'casilla B2 de nuestro Excel
vEurib = DDERequest(CanalDDE, "F2C2")
MsgBox El valor del Euribor es: & vEurib, vbInformation, EURIBOR
'Cerramos el canal
DDETerminate (CanalDDE)
End Sub

Un par de cosillas:

.- Podemos encontrarnos problemas con el argumento <elemento> de DDERequest debido a


las diferentes versiones de Excel, ms los diferentes idiomas. Como veis, debemos utilizar el
sistema F1C1 para definir las celdas. Y eso significa que quiz, en nuestras versiones de Excel,

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

.- Otra solucin pasara por nombrar las casillas objetivo de


Excel. Es decir, si yo me sito en la celda A2 veremos, en el
cuadro de nombres, que me indica que esa celda se llama
A2.

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:

vEurib = DDERequest(CanalDDE, "F2C2")

nos quedara as:

vEurib = DDERequest(CanalDDE, "Euribor")

Y nos evitamos el tener que utilizar el sistema de referencias de nuestro Excel.

Vamos a complicar el ejemplo. Lo que queremos es obtener el valor actualizado de la inversin


de nuestros inversionistas. Para ello:

1.- Aadimos algunos registros a nuestra tabla TDatos.

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

Sin problemas, verdad?

ENVIAR DATOS: DDEPoke


Para remitir datos desde el destinatario al origen utilizamos DDEPoke. Su estructura es la
siguiente:

DDEPoke <canal>, <elemento>, <dato>

Para poder probar este mtodo tendremos que hacer algunas pequeas modificaciones en
nuestras aplicaciones.

1.- En Excel, en la celda A5, escribimos: Capturado Access:

2.- En Access, en nuestro formulario de pruebas, aadimos un cuadro de texto, al que


pondremos de nombre txtCapt.

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

Fijaos que en DDEPoke no hemos utilizado parntesis porque utilizamos directamente el


mtodo.

Sin ms comentarios.

ENVO DE COMANDOS: DDEExecute


Podra interesarnos realizar algn tipo de accin con el origen. Por ello, podramos enviarle un
comando (que reconozca lgicamente la aplicacin origen) y automatizar esa tarea.

Para ello utilizaremos el mtodo DDEExecute.

Su estructura es la siguiente:

DDEExecute <canal>, <comando>

Por ejemplo, podra interesarnos crear un nuevo libro de Excel. Supongamos

El cdigo que nos permitira hacer eso sera:

Private Sub cmdDDEExecute_Click()


'Declaramos las variables
Dim canalDDE As Long
'Abrimos el canal
canalDDE = DDEInitiate("excel", "DATOS")
'Creamos un nuevo Excel
DDEExecute canalDDE, "[New(1)]"
'Cerramos el canal
DDETerminate canalDDE
End Sub

FINALIZAR CONEXIN: DDETerminate / DDETerminateAll


Como ya hemos visto, para optimizar recursos del sistema es recomendable cerrar los canales
que hayamos abierto.

Para ello tenemos:

9
Vistame en http://siliconproject.com.ar/neckkito/
DDETerminate <canal>

para cerrar canales individualizadamente, o bien

DDETerminateAll

para cerrar de manera global todos los canales abiertos.

AUTOMATIZACIN: INDICACIONES INICIALES


Vamos a ver, antes de entrar de lleno en algunas de las
aplicaciones de Office, algunos elementos comunes que
debemos tener siempre en cuenta.

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.

Abrir la aplicacin servidor


En general, podemos decir que debemos abrir una instancia de la aplicacin, para despus
crear uno o varios nuevos elementos propios de la aplicacin abierta.

Es decir, por poner un ejemplo con Word:

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)

Tras lo anterior podremos manipular la instancia de Word, sin referirnos al documento, o


podremos manipular el propio documento.

S que esto puede parecer un poco confuso al principio, pero con el ejemplo del epgrafe
ACCESS WORD creo que lo entenderemos perfectamente.

Abrir un archivo existente


Para abrir un archivo existente la sistemtica sera muy parecida a lo que acabamos de
comentar, pero, lgicamente, no debemos aadir un elemento nuevo porque ya existe (si no
no lo podramos abrir, no?).

Es decir, siguiendo con el ejemplo de Word:

Creamos una instancia de Word


Abrimos el documento guardado, asignndolo a la instancia.

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.

Mtodos, propiedades y dems malas


hierbas
Cada una de las aplicaciones de Office tiene sus propias
caractersticas, y, evidentemente, son muchsimas.

La idea de los epgrafes que siguen a continuacin no es


hacer un anlisis exhaustivo de cada una de las
aplicaciones, sino que la pretensin es simplemente poner
un ejemplo ms o menos representativo de cmo sera la
mecnica para una automatizacin entre Access y las
aplicaciones ms usuales de la suite Office.

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 primera fase, crearemos un nuevo Word y lo guardaremos en la carpeta donde tengamos la


base de datos. En l escribiremos los datos que tenemos en la tabla TDatos.

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

En un botn de comando escribimos el siguiente cdigo:

Private Sub cmdCreaWord_Click()


'Declaramos las variables
Dim Wrd As New Word.Application
Dim DocWrd As New Word.Document
Dim rst As DAO.Recordset
Dim miArchivo As String
'Determinamos la ruta y el nombre de archivo que se va a guardar
miArchivo = Application.CurrentProject.Path & "\MiWord.doc"
'Hacemos visible el Word
Wrd.Visible = True
'Aadimos un documento en blanco
Set DocWrd = Wrd.Documents.Add
'Activamos el documento
Wrd.ActiveDocument.Select
'Creamos el recordset

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

Extrado de la ayuda de Access os indico aqu los formatos posibles:

Nombre Valor Descripcin


wdFormatDocument 0 Formato de Microsoft Office Word.
wdFormatDOSText 4 Formato de texto de Microsoft DOS.
Formato de texto de Microsoft DOS con saltos
wdFormatDOSTextLineBreaks 5
de lnea.
wdFormatEncodedText 7 Formato de texto codificado.
wdFormatFilteredHTML 10 Formato HTML filtrado.

12
Vistame en http://siliconproject.com.ar/neckkito/
wdFormatHTML 8 Formato HTML estndar.
wdFormatRTF 6 Formato RTF.

wdFormatTemplate 1 Formato de plantilla de Word.


wdFormatText 2 Formato de texto de Microsoft Windows.
Formato de texto de Windows con saltos de
wdFormatTextLineBreaks 3
lnea.
wdFormatUnicodeText 7 Formato de texto Unicode.
wdFormatWebArchive 9 Formato de archivo Web.
Formato XML (lenguaje de marcado
wdFormatXML 11
extensible).
wdFormatDocument97 0 Formato de documento de Microsoft Word 97.
Formato predeterminado de archivo de
wdFormatDocumentDefault 16 documento de Word. En el caso de Microsoft
Office Word 2007, es el formato DOCX.
wdFormatPDF 17 Formato PDF.
wdFormatTemplate97 1 Formato de plantilla de Word 97.
wdFormatXMLDocument 12 Formato de documento XML.
Formato de documento XML con las macros
wdFormatXMLDocumentMacroEnabled 13
habilitadas.
wdFormatXMLTemplate 14 Formato de plantilla XML.
Formato de plantilla XML con las macros
wdFormatXMLTemplateMacroEnabled 15
habilitadas.
wdFormatXPS 18 Formato XPS.

.- Relacionado con lo anterior, estamos utilizando la versin 2007 (o posterior) no se hara


necesario indicar el formato de documento, puesto que el formato se nos pondra ya por
defecto. Es decir, que si escribimos:

miArchivo = Application.CurrentProject.Path & "\MiWord.docx"

podemos escribir slo

Wrd.ActiveDocument.SaveAs FileName:=miArchivo

sin indicarle formato (para vuestra informacin os dir que el formato es


wdFormatXMLDocument).

.- Si no especificamos el formato correcto o bien obtendremos error al ejecutar el cdigo o bien


obtendremos error al abrir el archivo Word que hemos creado.

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.

El cdigo que deberamos emplear sera el siguiente:

Private Sub cmdAbreWord_Click()


'Declaramos las variables
Dim miArchivo As String
Dim Wrd As New Word.Application
'Creamos la ruta del archivo con su nombre y
extensin
miArchivo = Application.CurrentProject.Path & "\MiWord.doc"
'Abrimos el documento
Wrd.Documents.Open miArchivo
'Hacemos visible el Word
Wrd.Visible = True
'Seleccionamos el documento de Word
Wrd.ActiveDocument.Select
With Wrd.Selection
'Seleccionamos todo el contenido del documento
.WholeStory
'Pasamos el contenido a negrita
.Font.Bold = True
End With
'Cerramos el documento guardando los cambios
Wrd.ActiveDocument.Close wdSaveChanges
'Cerramos el Word
Wrd.Quit
Set Wrd = Nothing
End Sub

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

Debemos, pues, controlar estos tres elementos desde nuestro cdigo.

Vamos a:

1.- Crear un nuevo Excel, que llamaremos Inversores.xls


2.- En la hoja1 escribiremos los datos de los inversores cuya
aportacin de capital sea superior o igual a 2.500 euros
3.- En la hoja2 escribiremos los datos de los inversores cuya
aportacin de capital sea inferior a 2.500 euros

Recordad que debemos registrar la referencia Microsoft Excel x.y Object Library

El cdigo que nos permitira hacer lo anterior sera:

Private Sub cmdCreaExcel_Click()


'Declaramos las variables
Dim miSql As String
Dim miExcel As String
Dim rst As DAO.Recordset
Dim fld As DAO.Field
Dim Exc As Excel.Application 'Aplicacin
Dim LibExc As Excel.Workbook 'Libro
Dim HojExc As Excel.Worksheet 'Hoja
Dim numFila As Integer, numColumna As Integer
'Definimos las variables
'Creamos la ruta y nombre de archivo
miExcel = Application.CurrentProject.Path & "\Inversores.xls"
'Creamos una nueva instancia de Excel
Set Exc = New Excel.Application
'Aadimos el libro en nuestra instancia
Set LibExc = Exc.Workbooks.Add
'Fijamos la hoja activa
Set HojExc = Exc.ActiveSheet
'Hacemos visible nuestro Excel
Exc.Visible = True
'-----CDIGO PARA RELLENAR LA HOJA1-------------------------------------------
'Definimos la SQL para que nos filtre los registros superiores
'a 2.500 euros
miSql = "SELECT * FROM TDatos WHERE Capital>=2500"
'Creamos el recordset sobre la SQL
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

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

Para destacar algunos elementos del cdigo comentar que:

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

.- Igual que en el caso del Word, debemos especificar el


formato de salida, que debe corresponderse con la
extensin de archivo que hemos indicado. Para obtener un
listado entero de los formatos posibles podis situaros en la
ayuda de Excel y buscar por <xlFileFormat>. De las
opciones que os aparezcan seleccionad la enumeracin.

Y poca cosa ms sobre Excel. Insistir en lo que os he estado


comentando a lo largo de este captulo: si queremos que nos salga
algo en concreto en Excel deberemos buscar el vocabulario
adecuado para indicrselo a Access.

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

Vamos a programar un ejemplo relativamente sencillo con Outlook. No olvidis registrar la


librera correspondiente a Microsoft Outlook.

El cdigo para enviar un mail sera el siguiente4:

Private Sub cmdCreaOutlook_Click()


'Declaramos las variables
Dim mailDestinatario As String
Dim mailAsunto As String
Dim mailMensaje As String
Dim Olk As Outlook.Application
Dim OlkMsg As Outlook.MailItem
Dim OlkDestinatario As Outlook.Recipient
'Solicitamos la direccin de correo electrnico
mailDestinatario = InputBox("Mail del destinatario?", "E-MAIL")
'Solicitamos el asunto
mailAsunto = InputBox("Asunto?", "ASUNTO")
'Solicitamos el texto del mensaje
mailMensaje = InputBox("Mensaje?", "MENSAJE")
'Creamos una instancia de Outlook
Set Olk = CreateObject("Outlook.Application")
'Creamos un nuevo mensaje de Outlook
Set OlkMsg = Olk.CreateItem(olMailItem)
'Creamos la informacin del mail
With OlkMsg
Set OlkDestinatario = .Recipients.Add(mailDestinatario)
OlkDestinatario.Type = olTo
.Subject = mailAsunto
.Body = mailMensaje
'Display muestra el correo antes de enviarse
.Display
'Si queremos que se enve directamente debemos sustituir .Display

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

Si queris profundizar en el cdigo referente a la


automatizacin con Outlook os invito a que echis un
vistazo a estos dos ejemplos que estn en la web y que
hacen referencia a esta aplicacin. Estoy seguro de que si lo
analizis deberais entender perfectamente lo que se est
haciendo.

Los ejemplos los podis encontrar en:

1.- Y dos de mail


2.- Exportar citas a Outlook

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.

No olvidis registrar la referencia Microsoft PowerPoint x.y Object Library

Vamos a crearnos un PowerPoint con una diapositiva que nos dar la informacin del factor de
actualizacin.

El cdigo que nos permitira hacer lo anterior sera:

Private Sub cmdCreaPowerPoint_Click()


'Declaramos las variables
Dim miPresent As String
Dim PWP As PowerPoint.Application
Dim PWPDiapo As PowerPoint.Slide
'Definimos la ruta y el nombre de la presentacin
miPresent = Application.CurrentProject.Path & "\Factor.pps"
'Creamos la instancia del PWP
Set PWP = New PowerPoint.Application
'La convertimos en visible
PWP.Visible = True
'Aadimos una diapositiva. Debemos identificar el ndice de
'la diapositiva y el tipo (argumentos entre parntesis)
Set PWPDiapo = PWP.Presentations.Add.Slides.Add(1, ppLayoutTitle)
'Como hemos elegido una diapositiva con ttulo y subttulo (ppLayoutTitle)
'rellenamos ttulo y subttulo
With PWPDiapo
'Este es el ttulo
.Shapes.Title.TextFrame.TextRange = "FACTOR ACTUALIZACION"
'Este es el subttulo. Buscamos el valor del factor en la tabla TAct a
'travs de un DLookup
.Shapes.Placeholders(2).TextFrame.TextRange = DLookup("[Factor]", "TAct")

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. ;)

FUNCIONES CREATEOBJECT() Y GETOBJECT()


En los ejemplos anteriores no hemos utilizado las funciones CreateObject() y GetObject().
Podramos haberlas utilizado sin problemas.

La idea principal para utilizar esas dos funciones radica en dos pasos:

Creamos una variable que sea un objeto


Si:
Queremos crear una nueva aplicacin utilizamos CreateObject
Queremos acceder a una aplicacin existente utilizamos GetObject

Por ejemplo, si quisiramos crear un nuevo Excel escribiramos el siguiente cdigo:

Private Sub cmdCreateObject_Click()


'Declaramos las variables
Dim miExcel As Object 'o tambin miExcel As Excel.Application
Dim miLibro As Object 'o tambin miLibro As Excel.Workbook
'Creamos el archivo a travs de CreateObject()
Set miExcel = CreateObject("Excel.Application")
'Aadimos un libro a la aplicacin
Set miLibro = miExcel.Workbooks.Add
'Lo hacemos visible
miExcel.Visible = True
End Sub

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

Si queremos acceder a los objetos del sistema utilizaremos el objeto FileSystemObject

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/

You might also like