Artículo : E10350
USANDO AUTOMATIZACIÓN OLE CON WORD
Automatización OLE es un protocolo creado para sustituir DDE. Como con DDE, una aplicación puede usar Automatización OLE para compartir datos o controlar otra aplicación.
En Automatización OLE, Word proporciona a otra aplicación llamada "aplicación contenedora" un objeto, una unidad de información similar a un tópico en DDE.
Word soporta un objeto único llamado "WordBasic" para Automatización OLE. El objeto "WordBasic" se usa para enviar a Word instrucciones de WordBasic. La técnica es similar a enviar comandos a Word a través de DDE, pero con Automatización OLE. Las instrucciones de WordBasic pueden devolver números o cadenas directamente a la aplicación contenedora. Esto hace posible usar instrucciones de WordBasic como una extensión de la macro de la aplicación contenedora o como una extensión del lenguaje de programación.
Word puede suministrar un objeto a otra aplicación para Automatización OLE, pero no puede usar Automatización OLE para acceder a objetos en otras aplicaciones. En otras palabras, aplicaciones que soportan Automatización OLE, tales como Microsoft Excel o una aplicación de Visual Basic, pueden usar Automatización OLE para acceder a Word, pero Word no puede usar Automatización OLE para acceder a ellas. En términos DDE, Word actúa como un servidor para otra aplicación, pero no puede actuar como cliente.
Microsoft Visual FoxPro versión 3.0 incluye un ejemplo de cliente de Automatización OLE. Para más información sobre cómo ejecutar y ver el código asociado con el ejemplo de Automatización OLE, ver "Ejemplo de Automatización OLE" en la ayuda de Microsoft Visual FoxPro.
Nota: En este documento el término "Visual Basic" se refiere a cualquier Visual Basic versión 3.0 o posterior (Windows) o Visual Basic en Microsoft Access 7.0 (Windows) y Microsoft Excel versión 5.0 ó posterior (Windows o Macintosh), a menos de que se
indique otra cosa.
En este artículo se contemplará el código de Visual Basic en idioma inglés. Dado que Word 6.0-7.0 en castellano obliga a escribir el código de WordBasic en el idioma del producto, usaremos el código de WordBasic en español para facilitar la tarea a los usuarios de Word en castellano. Con Word en castellano, no es posible escribir los comandos de WordBasic en inglés cuando se llama a Word a través de Automatización OLE.
ACCEDIENDO A WORD
El primer paso para hacer que Word esté disponible en la aplicación contenedora es definir una variable de objeto que hará referencia al objeto "WordBasic" en Word. En Visual Basic se declara una variable de tipo objeto. Por ejemplo:
Dim WordObj as Object
El objeto "WordBasic" está disponible para la aplicación contenedora , creándolo para la aplicación y asignándole la variable de objeto. En Visual Basic se usa la función CreateObject para crear el objeto y la palabra clave Set para asignarlo a la variable de objeto. He aquí la sintaxis:
Set ObjectVar = CreateObject("Application.ObjectType")
Por ejemplo, en Visual Basic se podría usar la siguiente instrucción:
Set WordObj = CreateObject("Word.Basic").
Esta instrucción hace que el objeto "WordBasic" esté disponible en Word para la aplicación contenedora que use Automatización OLE. Si Word versión 6.0 no está siendo ejecutado cuando la otra aplicación necesita acceder a ella, Automatización OLE inicia una sesión visible de Word.
No es necesario incluir una instrucción por separado para iniciar Word, tal como se hace con DDE. Si Word no puede ser encontrado, se producirá un error. Ejecutar Word en una sesión visible es útil para depurar el procedimiento de Visual Basic, pero si se quiere ocultar la sesión de Word, usar la declaración ApOcultar:
Set WordObj = CreateObject("Word.Basic")
WordObj.ApOcultar
Si Word versión 7.0 no se está ejecutando cuando otra aplicación necesita acceder a ella, Automatización OLE inicia una sesión oculta de Word. Si se quiere que la sesión de Word sea visible para depurar el código más fácilmente, hay que usar la declaración de WordBasic ApMostrar.
Aplicaciones que soportan completamente Automatización OLE permiten a sus documentos estar disponibles como objetos. Puesto que Word sólo soporta el objeto "WordBasic", no es posible usar Automatización OLE para acceder directamente al documento de Word como un objeto (a menos que el documento esté incrustado en la aplicación contenedora, ver más adelante la sección "Accediendo a Objetos de Word incrustados"). Por ejemplo, no es posible usar la función GetObject en Visual Basic para acceder a un documento de Word. En vez de esto, se pueden usar instrucciones de WordBasic para acceder y actuar sobre documentos de Word según se describe más adelante.
Si Automatización OLE inicia una sesión de Word. Automatización OLE cerrará Word cuando la variable de objeto que hace referencia al objeto "WordBasic" expire (cuando el procedimiento termine o la aplicación contenedora se cierre). En Visual Basic se puede usar la declaración Set con la palabra clave Nothing para limpiar la variable de objeto.
El objeto "WordBasic" no soporta ningún método para cerrarse a si mismo. Si Word se estaba ejecutando cuando Automatización OLE se inició, Word no podrá cerrarse a través de Automatización OLE, solo podrá cerrarse si se inició usando Automatización OLE.
Usando Comandos y Funciones de WordBasic Una vez que el objeto "WordBasic" está disponible en la aplicación contenedora, se pueden usar la mayor parte de sentencias o funciones de WordBasic para actuar sobre Word y los documentos de Word. Las instrucciones de WordBasic se usan de la misma manera en Automatización OLE y en macros de Word.
Las sentencias y funciones de WordBasic no disponibles en Automatización OLE son las
siguientes: Estructuras de control, tales como While ····Wend y If·····Then·····Else, declaraciones tipo Dim, instrucciones asociadas a cuadros de diálogo personalizados, la instrucción ArchivoSalir e instrucciones o funciones que necesitan variables de matriz como argumentos.
Funciones de WordBasic que devuelven cadenas terminan al final con un signo dólar ($). Cuando se usan estas funciones en Automatización OLE, se puede o bien prescindir del sigo dólar o bien ponerlo entre corchetes. El ejemplo siguiente muestra la función ObtenerMarcador$() tal como debe de aparecer en una macro de WordBasic:
marcador$ = ObtenerMarcador$("marcador1")
En VisualBasic, la misma instrucción puede ser especificada de dos maneras diferentes (en este ejemplo, "marca" es una variable de cadena que recoge el contenido del marcador "marcador1"):
marca = WordObj.[ObtenerMarcador$]("marcador1")
marca = WordObj.ObtenerMarcador("marcador1")
Nota: Algunas funciones de WordBasic que devuelven cadenas, necesitan el signo dólar y deben ser incluidas entre corchetes: Fuente$(), ObtenerInfoSistema$() e Idioma$(). Estas funciones de WordBasic tienen las mismas palabras claves que instrucciones de
WordBasic (por ejemplo, hay una instrucción Fuente y hay una función llamada Fuente$()), y WordBasic sin este signo dólar es incapaz de distinguirlo.
El ejemplo siguiente abre el documento CARTA.DOC de Word y utiliza la instrucción
ObtenerMarcador$() para recuperar el texto del marcador y mostrarlo en un cuadro de diálogo:
Dim marca As String
Dim WordObj As Object
Set WordObj = CreateObject("Word.Basic")
WordObj.ArchivoAbrir Nombre:= "CARTA.DOC"
marca = WordObj.ObtenerMarcador("marcador1")
MsgBox marca
El siguiente ejemplo recupera la lista de marcadores del documento activo y muestra su nombre en una serie de cuadros de mensaje. Se usan instrucciones de WordBasic como si fueran parte del lenguaje de Visual Basic. De hecho, estas instrucciones extienden la funcionalidad de Visual Basic.
La única diferencia es que WordBasic no es un lenguaje orientado a objetos con métodos y propiedades como los de Visual Basic, la sintaxis de las instrucciones de WordBasic no coincidencon la de Visual Basic.
Dim WordObj As Object
Set WordObj = CreateObject("Word.Basic")
Dim count As Integer, countmarks As Integer
countmarks = WordObj.CountBookmarks()
If countmarks <> 0 Then
ReDim bmarks$(1 To countmarks)
For count = 1 To countmarks
bmarks$(count) = WordObj.BookmarkName(count)
Next count
For count = 1 To countmarks
MsgBox bmarks$(count)
Next
End If
En el siguiente ejemplo, las instrucciones cambian el formato a negrita del párrafo seleccionado en Word, y si el párrafo está ya en negrita, lo pone en normal.
Dim WordObj As Object
Set WordObj = CreateObject("Word.Basic")
WordObj.EdiciónIrA Destino:= "\Para" 'Selecciona el párrafo actual.
If WordObj.Negrita() <> 0 Then
WordObj.Negrita 0 'Elimina el formato negrita del párrafo seleccionado.
Else
WordObj.Negrita 'Aplica formato negrita al texto seleccionado.
End If
¿SOBRE QUÉ ACTÚA LA INSTRUCCIÓN?
Una diferencia significante entre Visual Basic y WordBasic es que en Visual Basic cualquier instrucción ó método especifica sobre qué objeto va a actuar. En WordBasic, este no es siempre el caso. Por ejemplo, la instrucción de WordBasic EdiciónCortar puede actuar sobre un sólo carácter o sobre un documento entero: corta aquello que esté seleccionado en el documento activo cuando la instrucción se ejecuta.
La mayoría de instrucciones de formato y edición funcionan de esta manera. Si se usa Visual Basic para hacer estas cosas, hay que tener en cuenta que se están utilizando las instrucciones de WordBasic, y que normalmente se necesitará saber sobre la selección actual o la localización del punto de inserción.
ACCEDIENDO A OBJETOS DE WORD INCRUSTADOS
Hasta ahora hemos descrito el acceso a Word como una aplicación por separado, pero también se puede acceder a un objeto de Word tal como un documento de Word o una imagen de Word incrustada en la aplicación contenedora.
En Visual Basic, se puede utilizar la propiedad Object (Objeto) para acceder al documento o imagen y usar instrucciones y funciones de WordBasic para actuar sobre él. A continuación, se muestra la sintaxis a utilizar en Visual Basic versión 3.0 ó posterior (no disponible en Macintosh):
Set ObjectVar = OLEControlName.Object.Application.WordBasic
ObjectVar es una variable de objeto declarada previamente;
OLEControlName es el nombre del control OLE cual el objeto de Word está incrustado.
Por ejemplo, se pueden usar las siguientes instrucciones para acceder a un documento incrustado en un control OLE llamado OLE1:
Dim WordObj As Object
Set WordObj = OLE1.Object.Application.WordBasic
En Microsoft Excel Basic, se puede usar el método OLEObjects para recuperar el objeto de Word incrustado. El ejemplo siguiente accede a un objeto de un documento de Word con el nombre Picture1 (el nombre dado al objeto en Microsoft Excel, no un nombre de archivo de documento) en la hoja activa.
Dim WordObj As Object
Set WordObj = ActiveSheet.OLEObjects("Picture 1")
En Microsoft Access Visual Basic, se usa la propiedad Object para acceder a un objeto
incrustado de Word. Por ejemplo, se podría usar las siguientes instrucciones para acceder a un documento incrustado en un control OLE llamado OLE1:
Dim WordObj As Object
Set WordObj = Me!OLE1.Object.Application.WordBasic
El objeto incrustado debe estar activado antes de acceder a él. Se puede incluir una instrucción para activar el control OLE o se puede asumir que el objeto es activado de otra manera (por ejemplo haciendo un doble clic sobre el objeto). En Visual Basic versión 3.0, se puede usar la propiedad Action para activar el control OLE. Por ejemplo:
OLE1.Action = 7
En esta instrucción, OLE1 es el nombre del control OLE en el cual el objeto de Word esta incrustado.
En Visual Basic 4.0, se puede activar el control OLE usando la propiedad Action o el método DoVerb. Por ejemplo, las dos instrucciones siguientes son equivalentes:
OLE1.DoVerb(vbOLEShow)
OLE1.Action = 7
En Microsoft Excel Visual Basic, se usa el método Activate para activar el objeto de Word. En el siguiente ejemplo , WordObj es una variable de objeto en el cual el objeto del documento Word está almacenado:
WordObj.Activate
En Microsoft Access Visual Basic, se usa la propiedad Action para activar el objeto Word. Por ejemplo:
Me!OLE1.Action = acOLEActivate
El siguiente ejemplo accede a un objeto de Word incrustado en Visual Basic versión 4.0 (que actúa como aplicación contenedora). Utiliza la instrucción de WordBasic EdiciónSeleccionarTodo para seleccionar todo el texto y la instrucción de WordBasic Negrita para dar formato como negrita. La instrucción Check1.SetFocus desactiva en objeto Word y devuelve el foco a una caja de selección llamada "Check1".
Dim WordObj As Object
OLE1.DoVerb(vbOLEShow)
Set WordObj = OLE1.Object.Application.WordBasic
WordObj.EdiciónSeleccionarTodo
WordObj.Negrita
Check1.SetFocus
Set WordObj = Nothing
A continuación el mismo ejemplo usando Microsoft Excel Visual Basic. La instrucción final, Range("B6").Activate, desactiva el objeto incrustado de Word y activa la
celda B6 en la hoja activa del libro.
Dim WordObj As Object
Set WordObj = ActiveSheet.OLEObjects("Picture 1")
WordObj.Activate
With WordObj.Object.Application.WordBasic
.EdiciónSeleccionarTodo
.Negrita
End With
Range("B6").Activate
Y a continuación el mismo ejemplo usando Microsoft Access Visual Basic. La instrucción final DoCmd.GoToControl "Check1", activa la caja de selección llamada "Check1"
Dim WordObj As Object
Set WordObj = Me!OLE1.Object.Application.WordBasic
Me!OLE1.Action = acOLEActivate
WordObj.EdiciónSeleccionarTodo
WordObj.Nedrita
DoCmd.GoToControl "Check1"
Set WordObj = Nothing
RECUPERANDO PARÁMETROS DE CUADROS DE DIÁLOGO DE WORD
Es posible recuperar parámetros de un cuadro de diálogo de Word cuando se está usando Automatización OLE, para acceder o bien al mismo Word (a través de un objeto "Basic") o bien a un documento de Word incrustado. Para esto, primero se necesita crear una variable de objeto que contenga los parámetros y después localizar el parámetro en la variable de objeto. Ejemplo:
Dim TOVvar As Object
Set TOVvar = WordObj.CurValues.ArchivoAbrir
La primera instrucción define una variable de objeto para manejar los parámetros del cuadro de diálogo. La segunda instrucción asigna la variable de los actuales parámetros del cuadro de diálogo - en este caso, el parámetro del cuadro de diálogo Abrir (menú Archivo). WordObj es la variable de objeto definida para acceder a WordBasic. CurValues devuelve los parámetros del cuadro de diálogo especificado.
Para especificar un cuadro de diálogo, se usa la instrucción de WordBasic que corresponde al cuadro de diálogo de Word. Por ejemplo, ArchivoAbrir es el nombre de la instrucción de WordBasic que corresponde al cuadro de diálogo Abrir (menú Archivo). Si no se sabe el nombre del cuadro de diálogo a utilizar, ver "Referencia de WordBasic" en la ayuda en línea de Word.
Una vez que se han localizado los parámetros del cuadro de diálogo en la variable de objeto, usar las siguiente sintaxis para acceder a los parámetros:
DialogObjectVar.DialogBoxSettingName
DialogBoxSettingName es el nombre de un argumento de la instrucción de WordBasic que
corresponde al cuadro de diálogo cuyo parámetro está almacenado en DialogObjectVar.
Para la lista de argumentos válidos, ver "Referencia de WordBasic" en la ayuda en línea de Word.
El siguiente ejemplo de Visual Basic cambia el parámetro de Fuente de borrador del menú
Herramientas Opciones, en la ficha Ver. Si se está usando Visual Basic 3.0 no se puede usar la instrucción WordObj.HerramOpcionesVer ya que FuentesBorrador es un argumento nombrado.
En vez de esto, se especificará el argumento posicionalmente, tal como se describe más tarde en este artículo.
Dim WordObj As Object
Dim TOVvar As Object
Set WordObj = CreateObject("Word.Basic")
Set TOVvar = WordObj.CurValues.HerramOpcionesVer
If TOVvar.FuentesBorrador = 1 Then
WordObj. HerramOpcionesVer FuentesBorrador := 0
Else
WordObj. HerramOpcionesVer FuentesBorrador := 1
End If
EJECUTANDO MACROS DE WORD Y MOSTRANDO CUADROS DE DIÁLOGO
Se pueden ejecutar macros de Word a través de Automatización OLE, tal como se puede desde dentro de otra macro de Word. Después de que esta macro se ejecuta, el control se devuelve al procedimiento que la ha llamado.
Para ejecutar una macro de Word se usa la instrucción HerramMacro. Por ejemplo, la siguiente instrucción ejecuta una macro llamada ContarVentanasAbiertas.
WordObj.HerramMacro "ContarVentanasAbiertas", verdadero
La aplicación Word deberá estar activa si la macro muestra algún cuadro de diálogo, cuadro de mensaje, cuadro de entrada o cualquier otra cosa que requiera una respuesta por parte del usuario para que la macro pueda continuar. Si Word no es la aplicación activa, la macro se interrumpe y ocurre un error de Automatización OLE. Para hacer que Word sea la aplicación activa, se puede usar una instrucción similar a la sentencia de WordBasic ApActivar en la macro de la aplicación contenedora.
Se puede directamente definir y mostrar un cuadro de diálogo a través de Automatización OLE, pero no se puede ejecutar una macro que muestre un cuadro de diálogo. Si el cuadro de diálogo de Word, es posible usar el método CurValues para recuperar sus parámetros. Si el cuadro de diálogo ha sido creado y personalizado por el usuario, la macro que muestra el cuadro de diálogo puede guardar los parámetros del cuadro de diálogo para que permanezcan después de que la macro finalice. Por ejemplo, la macro podría guardar los parámetros en un archivo de parámetros.
PASANDO VALORES A UNA MACRO DE WORD
No es posible pasar argumentos directamente a una macro de Word a través de Automatización OLE. Dentro de WordBasic se puede usar la sintaxis NombreMacro.Subroutina [(ListaArgumentos)] para llamar a subrutinas en otras macros y pasarles argumentos, pero esta sintaxis no está soportada por Automatización OLE. Si se quiere que el código de Visual Basic ejecute una macro de WordBasic y le pase valores a esa macro, se deberán almacenar en algún lugar para que luego la macro pueda acceder a ellos.
Por ejemplo, es posible almacenar valores en un archivo de parámetros o en variables de
documento de Word.
El siguiente ejemplo de Visual Basic ejecuta una macro de Word llamada
CrearYGuardarNuevoDoc y muestra el mensaje cuando la macro ha terminado. La instrucción de Visual Basic AppActivate se usa para activar Word antes de que la macro se ejecute, hasta que la macro muestre el cuadro de diálogo Archivo Guardar Como.
Dim WordObj As Object
Set WordObj = CreateObject("Word.Basic")
AppActivate "Microsoft Word"
WordObj.HerramMacro " CrearYGuardarNuevoDoc ", Verdadero
MsgBox "Se ha terminado la macro CrearYGuardarNuevoDoc."
Es posible ejecutar esta macro en Visual Basic 3.0, pero la instrucción AppActivate necesita como argumento el mismo texto que aparece en la barra de título de la ventana de la aplicación Word.
Este texto puede cambiar si la ventana del documento es maximizada, a si que se necesitará añadir un If condicional para comprobar si ha cambiado el nombre de la ventana, y pasarle a AppActivate el correspondiente argumento. El siguiente condicional usa las funciones de WordBasic ContarVentanas(), DocMaximizar() y NombreVentana$() para realizar esta tarea:
If WordObj.ContarVentanas() > 0 Then
If WordObj.DocMaximizar() = True Then
AppActivate "Microsoft Word - " + WordObj.NombreVentana$()
Else
AppActivate "Microsoft Word"
End If
Else
AppActivate "Microsoft Word"
End If
A continuación la macro de WordBasic anteriormente citada con el nombre
CrearYGuardarNuevoDoc :
Sub MAIN
ApMaximizar "Microsoft Word"
On Error Goto bye
ArchivoNuevo
ArchivoGuardar
ApActivar "Microsoft Excel"
bye:
End Sub
Esta macro maximiza la ventana de Word (en el caso de que está minimizada al ejecutar la macro), crea un archivo nuevo usando la sentencia ArchivoGuardar, y se muestra el cuadro de diálogo Guardar Como (ya que el archivo abierto no tiene aún nombre).
La instrucción ApActivar al final de la macro de WordBasic activa Excel y devuelve el control a la rutina que llamó a la macro de WordBasic. Si se usa Visual Basic 4, es posible usar la instrucción ApActivar con el texto de la barra de título de la aplicación (por ejemplo, ApActivar "Form1").
En Excel, la rutina sería la siguiente:
Sub prueba()
Dim WordObj As Object
Set WordObj = CreateObject("Word.Basic")
AppActivate "Microsoft Word"
WordObj.HerramMacro Nombre:="prueba", Ejecutar:=1
MsgBox "La macro Prueba se ha finalizado."
End Sub
USANDO ARGUMENTOS POSICIONALES EN VISUAL BASIC 3.0
Instrucciones de WordBasic que corresponden a cuadros de diálogo de Word usan argumentos nombrados (argumentos cuyos valores están asociados con nombres). Por ejemplo, Fuente es el argumento con nombre de la siguiente instrucción.
FormatoLetraCapital.Fuente = "Arial"
En Visual Basic 4.0, Microsoft Excel Visual Basic y Microsoft Access Visual Basic, es posible usar instrucciones de WordBasic usando argumentos con nombre, tal como aparece en el siguiente ejemplo:
WordObj. FormatoLetraCapital Fuente:="Arial"
No es posible llamar a una instrucción de WordBasic desde Visual Basic 3.0 usando argumentos con nombre. En Visual Basic 3.0 se identificarán los argumentos por posición. El ejemplo siguiente muestra una instrucción de WordBasic tal como aparecería en una macro de Word:
FormatoLetraCapital.Posición = 1,.Fuente = "Arial",.DisminuirAlto = 3 ,.DistanciaDesdeElTexto =6
Para usar esta instrucción desde un procedimiento de Visual Basic 3.0, se debería escribir lo siguiente:
WordObj. FormatoLetraCapital 1, "Arial", 3, 6
En esta instrucción, WordObj es una variable de objeto que se refiere a WordBasic. Si se quiere omitir algún argumento, se deberá indicar con una coma, tal como muestra el siguiente ejemplo:
WordObj. FormatoLetraCapital, "Arial", , 6
Las comas seguidas al final de la instrucción pueden ser omitidas: Por ejemplo, la siguiente instrucción
WordObj. FormatoLetraCapital 1, "Arial", , ,
podría quedarse como:
WordObj. FormatoLetraCapital 1, "Arial"
Valores lógicos como "verdadero" y "falso" se usan para especificar comandos de botón. Por ejemplo, la siguiente instrucción de WordBasic ejecuta la macro ContarVentanasAbiertas:
HerramMacro = " ContarVentanasAbiertas",.Ejecutar
donde.Ejecutar es el nombre del argumento equivalente al botón Ejecutar en el cuadro de diálogo Macros. En un procedimiento de Visual Basic 3.0, la instrucción debería aparecer tal como sigue:
WordObj.HerramMacro "ContarVentanasAbiertas", True
Un valor VERDADERO es equivalente a un comando de botón. FALSO es equivalente a no
seleccionarlo. También es posible darle el valor -1 para Verdadero y 0 (cero) para Falso. La siguiente instrucción edita la macro ContarVentanasAbiertas:
WordObj.HerramMacro " ContarVentanasAbiertas ", FALSE, TRUE
En WordBasic el tercer argumento de la instrucción HerramMacro es.Edición, de tal manera que en Visual Basic un valor VERDADERO en esta tercera posición equivale a seleccionar el botón Edición. Omitir una argumento de comando de botón es equivalente a darle el valor de FALSO.
NOTA: La Ayuda en línea de WordBasic se encuentra información sobre la sintaxis de las instrucciones y funciones en WordBasic, y la mayoría de ellas describen el orden correcto de los argumentos.