Вы находитесь на странице: 1из 7

CARTAS DE WORD...

EN ACCESS1

INTRODUCCIN
Bueno... la verdad es que el ttulo tiene truco... je, je... Las
cartas seguirn siendo en Word. Lo gracioso del tema es
que podremos tener las cartas archivadas en Access, lo
que nos permitir tener un instrumento que nos facilitar
realizar consultas rpidas y eficaces de qu cartas
escribimos a quien, en qu fechas, qu escribimos...
Vamos, las cuatro cosillas que podemos hacer en Access .

PREPARANDO NUESTRAS TABLAS


Vamos a necesitar, como requisitos mnimos, tres tablas: la primera, con los datos de los
destinatarios (por ejemplo, imaginar que son socios de un club, pero podran ser clientes de
una empresa, alumnos, pacientes, etc.). La segunda ser una tabla con los posibles firmantes
de la carta. La tercera ser una tabla con los elementos tpicos de una carta (aunque una vez
entendis la mecnica del proceso podris aadir todos los elementos que necesitis).
Vamos a por la primera tabla, que llamaremos TSocios, y que tendr la siguiente estructura:

Slo comentaros que:

Para el cdigo postal he utilizado una mscara que ya nos proporciona Access del
cdigo postal.
Para los campos [Pobl] y [Prov] podramos habernos creado unas tablas auxiliares, y
que dichos campos recogieran la informacin de ellas. Es ms, podramos habernos
creado una tabla auxiliar con cdigos postales y poblaciones. Pero como el objetivo del
ejemplo no es conseguir una estructura ptima de una BD pues lo dejamos as, dado
que permite entender perfectamente el ejemplo.

Vamos a por la segunda tabla, TFirmas, que contendr los siguientes elementos:

La BD de ejemplo os la podis bajar aqu.

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

Finalmente vamos a por la tercera tabla, TCartas, que tendr la siguiente estructura:

Para construir esta tabla debemos tener en cuenta que:

Para el campo IdSoc, en tipo de datos, he utilizado el tipo Asistente para bsquedas.
He seleccionado la tabla TSocios, aadiendo los campos [Id], [Nom] y [Apell], he
ordenado por apellido y he ocultado la clave principal.

Para el campo [Fdo] he utilizado el mismo mtodo, eligiendo la tabla TFirmas,


seleccionando los campos [Id] y [Firmante], ordenando por [Firmante] y ocultando la
clave principal.

Idea: podramos aadir otro campo, llamado, por ejemplo, [Tema], que podra salir o no en
la carta en Word, y que nos servira para filtrar por temtica, para sacar todas las cartas que
hemos escrito referidas a dicho tema. Y, de la misma manera, podramos utilizar otros campos
pensando en posteriores filtros. Ahora mismo, bote pronto, se me ocurren [VIP], [Prioridad],
[Revisar], etc.

PREPARANDO NUESTROS FORMULARIOS


Evidentemente deberamos preparar un formulario basado en la tabla TSocios, para poder
introducir los datos de los socios, y otro basado en la tabla TFirmas, para poder dar de alta los
firmantes. Pero eso es un trabajo que os dejo para vosotros
Lo que s explicar es el formulario para crear la carta. As pues, creamos un formulario, que
llamaremos FCarta, basado en la tabla TCartas. En dicho formulario vamos a introducir, en su
cabecera, un botn de comando, que llamaremos cmdCarta2Word 2, al que le asignaremos un
cdigo que explicar un poco ms adelante.
Por ejemplo, a m el formulario me ha quedado as:

Para poner nombre a un control debemos sacar las propiedades de dicho control e irnos a Pestaa Otras Nombre, y ah escribir el
nombre que queramos.

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

El botn que veis arriba a la derecha lo he llamado cmdCerrar. A dicho botn le sacamos sus
propiedades y nos vamos a Pestaa Eventos Al hacer click, y le generamos el siguiente
cdigo3:

Private Sub cmdCerrar_Click()


DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End Sub

Como veis, la primera lnea de cdigo cierra el formulario actual, y


la segunda abre un formulario llamado FMenu.
Por lo tanto, nos creamos un formulario en blanco y lo guardamos como FMenu. En dicho
formulario insertamos un botn de comando, lo llamamos cmdAbreFCarta y en el evento al
hacer click le generamos el siguiente cdigo:

Private Sub cmdAbreFCarta_Click()


DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FCarta", , , , acFormAdd
End Sub

La segunda lnea de cdigo no slo nos abre FCarta, sino que adems nos lo deja preparado
para aadir un nuevo registro.

PREPARANDO NUESTRAS CARPETAS


Vamos a preparar nuestras carpetas. Si bien vosotros, una vez entendida la mecnica, podis
cambiar esta estructura, en principio os voy a explicar cmo hacerlo partiendo de la carpeta
donde tengamos ubicada nuestra BD. As pues, en el mismo directorio donde est la BD,
vamos a crearnos dos carpetas, que llamaremos WordPlantilla y WordCartas.
Dentro de la carpeta WordPlantilla vamos a crearnos un nuevo documento de Word, el cual
guardaremos como plantilla de documento y llamaremos PlantillaCarta.dot (si utilizamos la
versin 2007 o superior nuestra extensin ser dotx).

PREPARANDO NUESTRA PLANTILLA DE WORD


Para que me podis seguir con mayor facilidad voy a mostraros cmo sera la plantilla, pero
que deberemos modificar a posteriori.
Abrimos nuestro archivo PlantillaCarta.dot (o dotx) -ojo, debemos abrirlo como plantilla,
porque si lo abrimos con doble click lo que se nos crear ser un Documento1- y
confeccionamos la estructura de la carta, por ejemplo de la siguiente manera:

Para generar cdigo nos ponemos en la parte en blanco junto al evento que queramos, y veremos cmo nos aparece un pequeo
botn de puntos suspensivos. Si hacemos click sobre l nos aparecer una ventana. Le decimos que queremos generar cdigo.
Se nos abrir el editor de VB, con dos lneas por defecto (Private Sub... y End Sub). Esas dos lneas no deben tocarse. El cdigo lo
escribimos entre dichas lneas

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

Como veis tenemos unas palabras clave. Vamos a seleccionarlas, eliminarlas y, en su lugar,
insertar marcadores. Para insertar un marcador tenemos que irnos, en Word, a Men
Insertar Marcador.
Os explico en detalle la primera operacin, y despus el resto ms rpidamente:
Seleccionamos el espacio correspondiente a NomSocio (letras que ya habremos borrado) y
nos vamos a la insercin de marcador. Nos aparecer una ventana que nos pedir el nombre
del marcador. Ah le escribimos WNomSocio y click en botn Agregar.

Ahora seleccionamos el espacio correspondiente a DirSocio y le insertamos el marcador


WDirSocio
Seleccionamos el espacio correspondiente a CPPobl y le insertamos el marcador WCPPobl
Seleccionamos el espacio correspondiente a
ProvSocio y le insertamos el marcador
WProvSocio
Seleccionamos el espacio correspondiente a
fechaCarta y le insertamos el marcador
WfechaCarta
4

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

Seleccionamos el espacio correspondiente a


TextoCarta y le insertamos el marcador
WtextoCarta
Seleccionamos el espacio correspondiente a FdoCarta y le
insertamos el marcador WfdoCarta
Seleccioanmos el espacio correspondiente a CargoCarta y
le insertamos el marcador WcargoCarta
Al final deberamos tener los siguientes marcadores:

Y ya tenemos nuestro Word preparado. Ya podemos cerrarlo.

PROGRAMANDO NUESTRO CDIGO


Situamos FCarta en vista diseo y vamos a generar, en el evento Al hacer click de
cmdCarta2W un cdigo. Este cdigo lo que har ser:
1.- Nos abrir la plantilla de Word.
2.- Rellenar los marcadores con la informacin que tengamos en el formulario (buscando la
informacin accesoria que necesitemos)
3.- Nos guardar la carta en nuestra carpeta WordCartas
Ahora que ya tenemos el proceso general en mente creo que podris seguir perfectamente el
cdigo, dado que lo voy a comentar ampliamente.
Dicho cdigo sera:

Private Sub cmdCarta2Word_Click()


'--Requiere registrar la librera "Microsoft Word x.y Object Library", siendo "x.y"
'--la versin de Office que tengamos en nuestro ordenador
'Declaramos las variables
Dim miWord As New Word.Application
Dim miPlantilla As String
Dim miCarta As String
Dim rutaCartas As String
Dim rutaBD As String
Dim vId As Long
'Guardamos el registro de trabajo
DoCmd.RunCommand acCmdSaveRecord
'Cogemos la ruta de la base de datos
rutaBD = Application.CurrentProject.Path

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

'Creamos la ruta de la plantilla


miPlantilla = rutaBD & "\WordPlantilla\PlantillaCarta.dot"
'Creamos la ruta donde guardar la carta
rutaCartas = rutaBD & "\WordCartas\"
'Creamos una instancia de Word
Set miWord = CreateObject("Word.Application")
miWord.Documents.Add miPlantilla
miWord.Visible = True
'Recuperamos el nombre y apellido del socio
Dim vNom As String
Dim vApell As String
vId = Me.IdSoc.Value
vNom = Nz(DLookup("[Nom]", "TSocios", "[Id]=" & vId), "")
vApell = Nz(DLookup("[Apell]", "TSocios", "[Id]=" & vId), "")
'Recuperamos la direccin del socio

Dim vDir As String


vDir = Nz(DLookup("[Direcc]", "TSocios", "[Id]=" & vId), "")
'Recuperamos el cdigo postal
Dim vCP As String
vCP = Nz(DLookup("[CP]", "TSocios", "[Id]=" & vId), "")
'Recuperamos la poblacin
Dim vPobl As String
vPobl = Nz(DLookup("[Pobl]", "TSocios", "[Id]=" & vId), "")
'Recuperamos la provincia
Dim vProv As String
vProv = Nz(DLookup("[Prov]", "TSocios", "[Id]=" & vId), "")
'Recuperamos el firmante y su cargo
Dim vFirm As String, vCargo As String
vId = Me.Fdo.Value
vFirm = Nz(DLookup("[Firmante]", "TFirmas", "[Id]=" & vId), "")
vCargo = Nz(DLookup("[Cargo]", "TFirmas", "[Id]=" & vId), "")
'Construimos la fecha en expresin para la carta
Dim vFecha As String
vFecha = Format(Me.Fech.Value, "dd") & " de " & Format(Me.Fech.Value, "mmmm") _
& " de " & Format(Me.Fech.Value, "yyyy")
'Rellenamos los marcadores del Word con la informacin
With miWord.ActiveDocument.Bookmarks
.Item("WNomSocio").Range.Text = vNom & " " & vApell
.Item("WDirSocio").Range.Text = vDir
.Item("WCPPobl").Range.Text = vCP & ". " & vPobl
.Item("WProvSocio").Range.Text = vProv
.Item("WfechaCarta").Range.Text = vFecha
.Item("WTextoCarta").Range.Text = Nz(Me.Msj.Value, "")
.Item("WFdoCarta").Range.Text = vFirm
.Item("WCargoCarta").Range.Text = vCargo
End With
'Creamos el archivo final
miCarta = rutaCartas & Format(Me.Fech.Value, "yymmdd") & "-" & vApell & ".doc"
miWord.ActiveDocument.SaveAs FileName:=miCarta, FileFormat:=wdFormatDocumentDefault
miWord.Quit
'Eliminamos la instancia de word
Set miWord = Nothing
'Lanzamos un mensaje de aviso
MsgBox "La carta se ha generado correctamente", vbInformation, "OK"
End Sub

Como vemos es necesario registrar la referencia a Microsoft Word. Para ello, en el editor de
VB, nos vamos a Men Herramientas Referencias, y buscamos dicha librera. Marcamos su
check y aceptamos.
La apertura de la plantilla la marca la lnea
miPlantilla = rutaBD & "\WordPlantilla\PlantillaCarta.dot"
Si nosotros hemos creado una plantilla con versin 2007 o superior evidentemente deberamos
llamar a un .dotx, cambiando la lnea por:
6

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

miPlantilla = rutaBD & "\WordPlantilla\PlantillaCarta.dotx"


Veris que he utilizado la extensin .doc para guardar el
documento, para hacer el ejemplo compatible con Access
2003. Esto est reflejado en la lnea
miCarta = rutaCartas & Format(Me.Fech.Value, "yymmdd")
& "-" & vApell & ".doc"
Lgicamente nosotros podemos modificar esa lnea
indicando que el formato de archivo a guardar es .docx,
cambindolo simplemente en dicha lnea.
miCarta = rutaCartas & Format(Me.Fech.Value, "yymmdd") & "-" & vApell & ".docx"
En esta misma lnea podis ver que obligo al archivo a guardarse con la fecha al revs. De
esta manera las cartas se me guardaran ordenadas cronolgicamente.
Otra cosa que hay que tener en cuenta es que si volvemos crear la carta se nos sobrescribir
el archivo sin avisarnos de que ese archivo ya existe. Para arreglar eso deberamos escribir
ms lneas de cdigo, pero no son el objeto de este ejemplo y lo dejaremos para aquellas
mentes curiosas que quieran profundizar en el asunto

PARA FINALIZAR EL EJEMPLO


Si somos un poco manitas podramos complementar este ejemplo con el ejemplo de
ShellExecute (aqu). As, aprovecharamos nuestro msgbox del final para solicitar al usuario si
desea abrir la carta o no, o para abrirla directamente.
Espero que hayis podido entender la mecnica de utilizar Access y Word a travs de
marcadores, y que lo consideris til y aplicable.
Un saludo y,
suerte!

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

Вам также может понравиться