Mostrando las entradas con la etiqueta CreateObject. Mostrar todas las entradas
Mostrando las entradas con la etiqueta CreateObject. Mostrar todas las entradas

lunes, 7 de octubre de 2019

Interactuando con Microsoft Word (I): Enviar datos de Excel a Word (VBA)

En innumerables ocasiones he visto que mucha gente pregunta como enviar datos de Excel a Word, he de ser sincero y lo primero que se me viene a la cabeza es “que lo hagan desde Word usando Combinar Correspondencia”, pero en muchas de esas mismas ocasiones quieren y/o necesitan hacerlo desde Excel o en todo caso no solo enviar datos por partes sino más bien enviar incluso tablas o rangos completos. ¿Cuál es la solución? Definitivamente usar macros (VBA).

Para empezar, es importante aclarar que, si bien vamos a realizar la programación desde el entorno del VBA de Excel, como vamos a interactuar con Microsoft Word, lo que haremos es hacer referencias a los objetos de dicho programa, es decir, casi como usar el VBA desde el mismo Word. Dicho eso, lo primero que haremos es suponer que tenemos los siguientes datos:

Luego, como la idea es trabajar con Word, declararemos una variable respectiva y crearemos dicho objeto Word.

Dim MiappWord As Object 
Set MiappWord = CreateObject("Word.Application") 

Luego, como ya tenemos el Word listo, lo que haremos es crear un documento nuevo en blanco.

MiappWord.Documents.Add

Una vez hecho eso vamos a copiar el rango que necesitamos enviar a Word:

Hoja1.Range("A1:E97").Copy

Como ven ahí, en esta ocasión uso el nombre del módulo de la hoja para hacer referencia al rango de dicha hoja, no estoy usando ni Sheets ni WorkSheets ¿por qué? En realidad, es una buena forma de hacer referencia a las hojas sobre todo cuando más de una persona usa el archivo ya que si cambian el nombre de la hoja, y por ejemplo dice Sheets(“Hoja1”), dicha instrucción de VBA dejaría de servir, haciendo referencia al módulo de la hoja hay mayor garantía de que no se cambie (no es que nadie sapa como hacerlo, claro). Pero mejor volvamos a lo nuestro.

Como ya tenemos los datos en el portapapeles, ahora lo que haremos es pegarlos en Word, para ello utilizaremos el método PasteExcelTable que pega celdas de Excel en Word. Más referencias aquí: Enlace. Entonces, usaremos lo siguiente:

MiappWord.Selection.PasteExcelTable False, False, False

Ahora haremos visible el Word para ver el resultado.

MiappWord.Visible = True

Si leyeron el enlace recomendado, verán que lo que hemos hecho es pegar las celdas de Excel copiadas, manteniendo el formato de origen, por lo que debemos tener lo siguiente en nuestro archivo Word:

Vamos a probar diversas opciones del método sugerido, pero en cada ocasión vamos a insertar una página nueva en Word para que se note cada vez que pegamos los datos. Al método sugerido, vamos a agregarle un par más para que prueben. Comentaré en el código que es lo que hace cada uno.

With MiappWord
     'usar estilos de destino
     .Selection.PasteExcelTable False, True, False
     .Selection.InsertNewPage
     'vincular y mantener formato de origen
     .Selection.PasteExcelTable True, False, False
     .Selection.InsertNewPage
     'vincular y usar estilos de destino
     .Selection.PasteExcelTable True, True, False
     .Selection.InsertNewPage
     'imagen
     .Selection.PasteSpecial Link:=False, DataType:=wdPasteEnhancedMetafile, _
         Placement:=wdInLine, DisplayAsIcon:=False
     .Selection.InsertNewPage
     'conservar solo texto
     .Selection.PasteAndFormat (wdFormatPlainText)
 End With 

Para que esta última parte funcione sin mayor dilema, activen la siguiente referencia a Microsoft Word:

Si deseamos también podemos guardar el archivo.

MiappWord.ActiveDocument.SaveAs Filename:=ThisWorkbook.Path & "\miarchivo.docx"

Por último, podríamos tener una macro así ya con todo ordenado:

Sub EnviardatosaWord()

Dim MiappWord As Object 

Set MiappWord = CreateObject("Word.Application") 

MiappWord.Documents.Add 
Hoja1.Range("A1:E97").Copy 

With MiappWord
     'mantener el formato de origen
     .Selection.PasteExcelTable False, False, False
     .Selection.InsertNewPage
     'usar estilos de destino
     .Selection.PasteExcelTable False, True, False
     .Selection.InsertNewPage
     'vincular y mantener formato de origen
     .Selection.PasteExcelTable True, False, False
     .Selection.InsertNewPage
     'vincular y usar estilos de destino
     .Selection.PasteExcelTable True, True, False
     .Selection.InsertNewPage
     'imagen
     .Selection.PasteSpecial Link:=False, DataType:=wdPasteEnhancedMetafile, _
         Placement:=wdInLine, DisplayAsIcon:=False
     .Selection.InsertNewPage
     'conservar solo texto
     .Selection.PasteAndFormat (wdFormatPlainText)
     .ActiveDocument.SaveAs Filename:=ThisWorkbook.Path & "\miarchivo.docx"
     .Visible = True
 End With 

Application.CutCopyMode = False
Set MiappWord = Nothing 
MsgBox "Todo listo" 

End Sub 
Espero les sea útil. Hasta la próxima.

Abraham Valencia
Lima, Perú

Descargue el ejemplo de aquí

miércoles, 23 de mayo de 2018

Trabajar, desde Excel-VBA, con otros programas de Microsoft

Cuando programas, una de las grandes ventajas de trabajar con Excel y toda la suite de Microsoft es la compatibilidad entre su lenguaje Visual Basic for Applications (VBA). De este modo podemos trabajar con más de uno de sus programas a la vez y/o interactuar entre ellos solo debemos aprender, tal como en el caso de Excel, los objetos, propiedades y otros de cada programa.

Una forma de abrir o crear archivos desde el VBA es usar la función “CreateObject”. La sintaxis de dicho método es la siguiente:

CreateObject (clase, nombre del servidor)

En donde “clase” es el nombre de la aplicación y/o la clase del objeto para crear y “nombre del servidor” es justamente el nombre del servidor de red en donde se crea el objeto. Si el nombre de servidor se deja en blanco, el objeto se creará en el equipo desde donde se usa la función.

Vamos a dejar de lado lo del servidor y centrarnos en la creación de objeto en nuestro propio equipo. Por ejemplo, vamos a suponer que queremos crear un archivo de Word nuevo entonces lo primero que vamos a hacer es declarar una variable con la que nombraremos a nuestro objeto “Word”, después crearemos el objeto, lo haremos visible (por defecto se crea el objeto como no visible) y agregaremos un documento nuevo:

Sub CreandoWord()
Dim MiappWord As Object 
Set MiappWord = CreateObject("Word.Application") 
MiappWord.Documents.Add 
MiappWord.Visible = True 
Set MiappWord = Nothing 
End Sub

La línea “MiappWord.Documents.Add”, que es la que agrega el documento nuevo de Word, puede ser obtenida fácilmente con la grabadora de macros de Word, aunque lo menciono solo como referencia ya que ese sería un tema ajeno a Excel.

Supongamos ahora lo que queremos es abrir un archivo ya existente, pues usaríamos algo como esto:

Sub CreandoWord() 
Dim MiappWord As Object 
Set MiappWord = CreateObject("Word.Application") 
MiappWord.Documents.Open ("D:\Filatelia\Actividades CAF 2018.docx") 
MiappWord.Visible = True 
Set MiappWord = Nothing 
End Sub

Una forma en que el editor de VBA nos puede “ayudar” con los objetos, propiedades y métodos de, en este caso, Word, es si declaramos la referencia respectiva:

No olviden que el 15.0 puede variar dependiendo de la versión de Office que estén usando. Luego cambiamos la declaración de variable a tipo “Word.Application” y tendremos el siguiente resultado:

También podemos, por ejemplo, abrir una presentación hecha en Power Point del siguiente modo:

Sub AbrirPPT() 
Dim appPpt As Object 
Set appPpt = CreateObject("Powerpoint.Application") 
appPpt.Presentations.Open Filename:=ThisWorkbook.Path & "\Hola.pptx" 
appPpt.ActivePresentation.SlideShowSettings.Run 
appPpt.Visible = True 
Set appPpt = Nothing 
End Sub 

En este caso el archivo de Power Point está en la misma carpeta que el archivo Excel. La línea que abren dicho archivo y la que activa la presentación, son parte del manejo de objetos y métodos de dicho programa pero lamentablemente en este caso dicho programa ya no cuenta con grabadora de macros que nos ayude pues Microsoft decidió retirarla desde la versión de Office 2007.

Es casi el mismo procedimiento para Infopath, Publisher, etc., pero no olvidemos que puede servir para otros programas como por ejemplo Internet Explorer:

Sub Guglear() 
Dim ie As ObjectDim 
PaginaWeb As String 
PaginaWeb = "www.google.com.pe" 
Set ie = CreateObject("InternetExplorer.Application") 
ie.Navigate PaginaWeb 
Do     
 DoEvents 
Loop Until ie.readyState = 4 
ie.Visible = True 
Set ie = Nothing 
End Sub  

Y eso es todo en esta ocasión. Hasta la próxima.

Abraham Valencia