En los artículos anteriores de cómo interactuar con Microsoft Word (Enlace1, Enlace2), vimos básicamente la forma de enviar datos desde una hoja de Excel a un archivo de Word nuevo, pero ¿Qué pasa si queremos enviar nuestros datos a un archivo que ya existe? La primera respuesta que quizá se les viene a la mente es “pues lo abrimos ¡obvio!”, claro, eso es lo que haremos, aunque iremos un poquito más allá y veremos que hacer si ya está abierto el archivo en cuestión.
Ya saben ustedes que lo primero es activar las referencias respectivas a Microsoft Word en el editor de VBA, después de eso vamos a declarar las variables que vamos a usar. Una para crear un objeto que nos ayudará a trabajar con el archivo Word si ya está abierto, una para crear el objeto Word y otra para la ruta del archivo.
Dim objDoc As Object
Dim MiappWord As Word.Application
Dim strArchivo$
Ahora vamos a darle valor a la variable con la ruta del archivo, asumiendo que el archivo Word y el de Excel están en la misma carpeta.
strArchivo = ThisWorkbook.Path & "\ArchivoEjemploWord.docx "
Como para que no quede duda de que todo saldrá bien, usando Dir nos aseguramos que el archivo exista.
If Dir(strArchivo) = "" Then
MsgBox "No existe el archivo", vbOKOnly, "Todo Sobre Excel"
Exit Sub
End If
De no existir el archivo, un MsgBox nos lo indicará y se terminará el proceso.
Ahora algo importante, para saber si el archivo está abierto vamos a usar una UDF que Microsoft puso a disposición pública hace año (ahora la página no existe), se puede mejorar, claro, pero dado que hay algo ya hecho ahorremos tiempo. Pueden ponerla en el mismo módulo de la rutina que estamos haciendo o en otro, no hay problema.
' This function checks to see if a file is open or not. If the file is
' already open, it returns True. If the file is not open, it returns
' False. Otherwise, a run-time error occurs because there is
' some other problem accessing the file.
' Código de macro para comprobar si un archivo ya está abierto
' http://support.microsoft.com/kb/291295/es
Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer
'
On Error Resume Next ' Turn error checking off.
filenum = FreeFile() ' Get a free file number.
' Attempt to open the file and lock it.
Open filename For Input Lock Read As #filenum
Close filenum ' Close the file.
errnum = Err ' Save the error number that occurred.
On Error GoTo 0 ' Turn error checking back on.
' Check to see which error occurred.
Select Case errnum
' No error occurred.
' File is NOT already open by another user.
Case 0
IsFileOpen = False
' Error number for "Permission Denied."
' File is already opened by another user.
Case 70
IsFileOpen = True
' Another error occurred.
Case Else
Error errnum
End Select
End Function
Entonces, ya con nuestra UDF y un If, vamos a detectar si el archivo está abierto, y de estarlo, con la función GetObject vamos a hacer la referencia respectiva al archivo (objDoc) y como lo que haremos es crear un objeto, vamos luego a convertirlo en nuestro objeto Word (MiappWord). De estar cerrado (Else), crearemos un objeto Word, abriremos el documento del ejemplo y lo haremos visible. Miren y analicen el código.
If IsFileOpen(strArchivo) Then
'si está abierto
Set objDoc = GetObject(strArchivo)
Set MiappWord = objDoc.Application
Else
'si está cerrado
Set MiappWord = CreateObject("Word.Application")
MiappWord.Documents.Open strArchivo
MiappWord.Visible = True
End If
Sea abierto o cerrado, una vez que tengamos el control del archivo, y para que se vea como se puede hacer cosas en él, dejaré una línea simple que lo único que hará es llevar el cursor al final del archivo Word.
MiappWord.Selection.EndKey Unit:=wdStory
Nuestra rutina completa debe de quedar así:
Option Explicit
'Todo Sobre Excel
'Abraham Valencia
'https://abrahamexcel.blogspot.com/
'https://www.facebook.com/TodosobreExcelAV/
'https://twitter.com/Todosobre_Excel
'Lima, Perú
'Junio del 2020
Sub AbrirWord()
Dim MiappWord As Word.Application
Dim objDoc As Object
Dim strArchivo$
strArchivo = ThisWorkbook.Path & "\ArchivoEjemploWord.docx "
If Dir(strArchivo) = "" Then
MsgBox "No existe el archivo", vbOKOnly, "Todo Sobre Excel"
Exit Sub
End If
If IsFileOpen(strArchivo) Then
'si está abierto
Set objDoc = GetObject(strArchivo)
Set MiappWord = objDoc.Application
Else
'si está cerrado
Set MiappWord = CreateObject("Word.Application")
MiappWord.Documents.Open strArchivo
MiappWord.Visible = True
End If
MiappWord.Selection.EndKey Unit:=wdStory
End Sub
Y listo, eso es todo en esta ocasión y la prometo que continuaremos con más sobre interactuar con Word desde Excel a través de VBA ¡Hasta la próxima!
Abraham Valencia
Lima, Perú
Descargue el ejemplo de aquí
No hay comentarios.:
Publicar un comentario