sábado, 15 de agosto de 2020

Datos masivos desde Excel (VBA) hacia una Hoja de Cálculo de Google: El dilema de las tildes y eñes

Hace algunas semanas aprendimos cómo enviar datos masivos desde Excel, usando VBA, hacia una Hoja de Cálculo de Google como si fuese nuestra base datos en línea (Enlace). ¿Cuál fue el problema que encontramos? Al enviar vocales con tilde o letras eñe, sean mayúsculas o minúsculas, la Hoja de Cálculo no las reconocía y no las consideraba, es decir, hacía como que no existían pues ni siquiera dejaba espacios en blanco en su reemplazo.

El problema era la codificación que usa Google para los caracteres Ascii extendidos. Como no es difícil identificarlos, en este caso vamos a resolverlo con una Función Definida por el Usuario (UDF por sus siglas en inglés) que convierte los caracteres que nos interesan en esta ocasión, en códigos que Google pueda identificar. Entonces, copien y peguen la siguiente UDF en un módulo del archivo:

Function Cambiacodificacion(Textoinicial) As String 

Dim Base(1 To 12) As String, CodigoG(1 To 12) As String 
Dim TextoFinal$, Codificado$ 
Dim x As Integer, y As Integer 

Base(1) = "Á": CodigoG(1) = "%C3%81" 
Base(2) = "É": CodigoG(2) = "%C3%89" 
Base(3) = "Í": CodigoG(3) = "%C3%8D" 
Base(4) = "Ó": CodigoG(4) = "%C3%93" 
Base(5) = "Ú": CodigoG(5) = "%C3%9A" 
Base(6) = "á": CodigoG(6) = "%C3%A1" 
Base(7) = "é": CodigoG(7) = "%C3%A9" 
Base(8) = "í": CodigoG(8) = "%C3%AD" 
Base(9) = "ó": CodigoG(9) = "%C3%B3" 
Base(10) = "ú": CodigoG(10) = "%C3%BA" 
Base(11) = "Ñ": CodigoG(11) = "%C3%91" 
Base(12) = "ñ": CodigoG(12) = "%C3%B1" 

For x = 1 To Len(Textoinicial)
     Codificado = Mid$(Textoinicial, x, 1)
         For y = 1 To 12
             If Codificado = Base(y) Then Codificado = CodigoG(y): Exit For
         Next y
     TextoFinal = TextoFinal + Codificado
 Next x

Cambiacodificacion = TextoFinal 

End Function 
Una vez hecho eso y como se supone vieron el artículo anterior, debemos cambiar la línea respectiva de este modo:
misDatos = "entry.734588322=" & Range("A" & x) & "&entry.1744113014=" & Cambiacodificacion (Range("B" & x)) & "&entry.283729869=" & Range("C" & x) & "&entry.1406906612=" & Range("D" & x)            

¿Notaron el cambio? Una vez hecho eso, podemos usar vocales con tilde, en nuestros datos de Excel, o la letra eñe ya sean mayúsculas o minúsculas y al enviar todo a Google, no tendremos dilema alguna y las veremos tal cual lo enviado. Todo se vería así:

Y listo amigos/as, resuleto el problema ya si desean usar más caracteres queda como tarea de todos/as agregarlos, no es difícil esa parte. ¡Hasta la próxima!

Abraham Valencia
Lima, Perú

domingo, 12 de julio de 2020

Datos masivos desde Excel (VBA) hacia una Hoja de Cálculo de Google como si fuese nuestra base datos.

Hoy en día en que compartimos mucha información a través de internet y sobre todo usando “nubes” tipo Google Drive, OneDrive o DropBox, la necesidad de tener alternativas para intercambiar datos y/o actualizarlos haciendo uso de esas y otras herramientas, sin duda cada vez es mayor. Para bases de datos sin duda las alternativas son diversas como el caso de Oracle, MySQL o SQL Server; claro, para poder tener los datos en internet y conectarnos desde cualquier lugar, esas alternativas son de pago y no siempre se puede acceder por motivos, justamente, económicos (las ediciones gratuitas son de conexión local o de poder configurarlas para sesiones remotas, tiene limitaciones). Retomando lo de la “nube”, si bien permite trabajar en distintas PC, laptops, móviles, etc. ingresando a través de internet o descargando la aplicación requerida, básicamente lo que hacen es mantener varios archivos iguales y actualizarlos mediante sincronización, lo que como seguro ya saben, también tiene sus limitaciones, más aún cuando se quiere trabajar con usuarios distintos cada uno “logueado” con su propia cuenta.

Entonces ¿Tenemos posibilidades económicas o gratuitas de tener una base de datos en línea y poder conectarla desde Excel? Comenzaré diciendo algo que afirmó por años: Excel no es un sistema gestor de base de datos, es una hoja de cálculo, pero entiendo que mucha gente lo usa como si fue tal. Dicho eso, paso a responder la pregunta: Sí, considero que existe una alternativa ¿Cuál es? Pues considero que una alternativa es usa una Hoja de Cálculo de Google y, a través de VBA, enviarle los datos que deseamos desde la PC que queramos, así esté ubicada en cualquier lugar del mundo, claro, siempre que tenga conexión a internet. Y no, no es necesario entrar a Google Drive o descargar e instalar la aplicación. Ah, claro, así como Excel, las Hojas de Cálculo de Google también tienen límites de capacidad, pero ya les toca a ustedes averiguar cuáles son si es que se decantan por la opción de la que hablaremos hoy.

Para comenzar, lo que usaremos serán los Formularios de Google, probablemente ustedes ya hayan visto algo parecido, la diferencia es que Google ya ha variado las propiedades de sus objetos de dichos formularios y hoy veremos cómo se puede hacer ahora y, además, como mandar varios datos a la vez sin problema alguno. Entonces, comencemos.

Como este no es un tutorial sobre el uso de los formularios que usaremos, asumiré que ya saben cómo crearlos así que podrían comenzar con uno así:

Para todos los campos usé objetos de “Respuesta corta”, pero en el caso de ID y Edad, además, la “validación de respuesta” es tipo “Número”. No olviden este detalle para que, a la hora de enviar los datos, el tipo coincida en cada campo.

Ahora, en la pestaña “Respuestas” activen el botón “Crear hoja de cálculo” (el verde con rauas blancas)..

En las opciones que te salen, elige “Crear una hoja de cálculo” y dale clic a “Crear”. Si deseas previamente coloca un nombre en la opción correspondiente al lado de “Crear una hoja de cálculo”, tal como he hecho yo.

En pantalla tendremos algo como esto. No olviden que el campo “Marca temporal” lo agrega Google, no hay problema.

Ahí mismo elige el menú “Formulario” y luego “Ir al formulario publicado”.

En esta parte es muy importante que copien el enlace de la web del formulario. Por ejemplo, en mi caso es el siguiente:

https://docs.google.com/forms/d/e/1FAIpQLSfhc8fyp2InjqYpUJiZEKdyI2ABYudFu07JUPKAoz-cJ87dTA/viewform

Continuando en la web del formulario, como ya mencioné líneas arriba van a encontrar varias publicaciones acerca de cómo llenarlo desde Excel con VBA, en todas usan la propiedad “Name” de los objetos del formulario, pero si ustedes ven el código HTML del formulario, verán que ya Google no necesariamente usa dicha propiedad.

Entonces ¿Qué usaremos? No hay problema, solo es cuestión de revisar todo el código del formulario y encontrar lo siguiente (En Chrome, por ejemplo, se puede hacer con las opciones “inspeccionar” o “Ver código fuente de la página”):

¿Ven la línea resaltada? Desplieguen la opción de la izquierda (el triángulo) y deberían tener lo siguiente, o algo así, en su pantalla:

Si ven con detalle, se darán cuenta que ahí están los nombres de los cuatro campos que usé en el formulario (Id, nombre, sexo, edad) y a la derecha de cada uno la palabra “null”, un cero (0) y dos corchetes ¿Ven los números al lado de los corchetes? Eso son los que copiarán. En mi caso son: 734588322, 1744113014, 283729869 y 1406906612.

Ahora sí vamos a Excel. En una hoja de Excel tenemos que tener lo siguiente, para mi caso, claro.  

Ahora entra al editor de VBA y lo primero que debes hacer ahí es activar las referencias a “Microsoft XML, v6.0” (el número 6 puede variar dependiendo de tu versión de Office). Como en otras ocasiones, recomiendo usar el objeto MSXML2.XMLHTTP60, que se usa para realizar solicitudes HTTP. Dichas solicitudes nos permiten interactuar con un servicio web, API y similares. Con dicho objeto usaremos el método “Post” para poder enviar la información necesaria que queremos publicar/insertar en nuestra Hoja de Google (ya hemos hablado de dicho método y sus parámetros en otros artículos, por ende, no los volveré a explicar hoy aquí). Para finalizar usaremos el método “Send” para abrir la conexión y enviar la solicitud al servidor. Entonces, vamos declarando las siguientes variables.

'Para declarar y crear el objeto 
Dim WebXML As New MSXML2.XMLHTTP60 
'Para detectar la última fila 
Dim UltimaFila As Long 
'Para enviar el parámetro de la URL al POST y al Send 
Dim miURL As String, misDatos As string 

Como vamos a hacer que se envíe todo a la Hoja de Cálculo de Google, vamos a detectar la última fila llena y con un bucle “For – Next” recorreremos todo el rango y al final borraremos los datos.  Para ello también vamos a declarar la variable correspondiente.

Dim x as Long

Para comenzar a dar valores a las variables, recordemos que guardamos/copiamos la url del formulario, pero si lo vuelven a ver, verán que terminar con “vieform”, pues esa parte cámbienla por “formResponse”. En mi caso quedaría así:

UltimaFila = Cells(Rows.Count, 1).End(xlUp).Row 
miURL = "https://docs.google.com/forms/d/e/1FAIpQLSdhhL-3DomHpEnXufpdCJPYbLsdurtLRQpB0MhVbqqGIC2UPw/formResponse" 

Con el método “Send” vamos a enviar los datos ¿Recuerdan los números que copiamos que correspondían a los campos del formulario?  Pues para que funcione, en la cadena vamos a anteceder cada uno de esos números de la palabra “entry” y un punto (.), de tal modo que queden así, por ejemplo: “entry.734588322”. Sin las comillas, obviamente. Como vamos a recorrer los datos con un bucle, vamos a ir tomando el valor correspondiente para cada campo del formulario, de tal modo que nuestra cadena quedaría así:

misDatos = "entry.734588322=" & Range("A" & x) & "&entry.1744113014=" & Range("B" & x) & "&entry.283729869=" & Range("C" & x) & "&entry.1406906612=" & Range("D" & x)

Y ya con el bucle sería así:

For x = 2 To UltimaFila
     misDatos = "entry.734588322=" & Range("A" & x) & "&entry.1744113014=" & Range("B" & x) & "&entry.283729869=" & Range("C" & x) & "&entry.1406906612=" & Range("D" & x)
     
     With WebXML
         .Open "POST", miURL, False
         .setrequestheader "Content-type", "application/x-www-form-urlencoded"
         .send (misDatos)     
     End With      

Next

Juntando todo y ordenando, deberíamos tener esto:

Option Explicit
 'Todo Sobre Excel
 'Abraham Valencia
 'https://abrahamexcel.blogspot.com/
 'https://www.facebook.com/TodosobreExcelAV/
 'https://twitter.com/Todosobre_Excel
 'Lima, Perú
 'Julio del 2020

 Sub EnviaraGoogle()     

 'Para declarar y crear el objeto 
Dim WebXML As New MSXML2.XMLHTTP60 
'Para detectar la última fila 
Dim UltimaFila As Long 
'Para enviar el parámetro de la URL al POST y al Send 
Dim miURL As String, misDatos As String 
Dim x As Long 

UltimaFila = Cells(Rows.Count, 1).End(xlUp).Row 
miURL = "https://docs.google.com/forms/d/e/1FAIpQLSfhc8fyp2InjqYpUJiZEKdyI2ABYudFu07JUPKAoz-cJ87dTA/formResponse" 

For x = 2 To UltimaFila

     misDatos = "entry.734588322=" & Range("A" & x) & "&entry.1744113014=" & Range("B" & x) & "&entry.283729869=" & Range("C" & x) & "&entry.1406906612=" & Range("D" & x)
     
      With WebXML
         .Open "POST", miURL, False
         .setrequestheader "Content-type", "application/x-www-form-urlencoded"
         .send (misDatos)
     End With     

 Next 

MsgBox "Datos enviados a Google", vbOKOnly, "Todo Sobre Excel" 

End Sub 

Si todo salió bien, en nuestra Hoja de Cálculo de Google deberíamos tener lo siguiente:

Si después desea ver los datos en Excel ya compilado, escribí sobre eso hace meses, denle un vitazo: Enlace. Y ahora sí, eso es todo en esta ocasión ¡Hasta la próxima!

Abraham Valencia
Lima, Perú

Nota: Hay un dilema con las letras con tilde, la eñe y algunos otros caracteres, haré pruebas sobre eso y actualizaré el artículo.

domingo, 5 de julio de 2020

Interactuando con Microsoft Word (IV): Enviar datos de celdas de Excel hacia objetos de un archivo Word

¡Hola nuevamente! En esta ocasión seguiremos interactuando con Word y lo que toca hacer es enviar, nuevamente, datos, pero ya no una tabla completa sino, datos específicos a cajas de texto en el archivo de Word, como si fuera un reporte y Excel nuestra base de datos. Para mí es más práctico usar la herramienta “Combinar correspondencia” desde el mismo Word, pero sé que para muchos es mejor hacer todo desde Excel, así que, manos a la obra.

Lo primero es tener datos, por ejemplo, del siguiente modo:

Ojo que en la celda B1 hay una lista desplegable de los datos de la columna “Id” de la Tabla (Asumo que saben cómo hacerla).

En Word tendremos un documento así:

Por si no lo saben, aquellas partes del Word en donde dice “Haga clic o pulse aquí para escribir texto”, cada uno es un “Control de contenido de texto sin formato” que serán los campos en donde insertemos el texto que tenemos en Excel. Para usarlos, activen la pestaña “Programador” de su Word y en el grupo “Controles” los encontrarán.

Para que sea fácil su identificación en el archivo Word vamos a modificar la propiedad “Título” de cada control, no será difícil si vamos seleccionado cada uno y presionamos el botón “Propiedades” del mismo grupo “Controles” y agregamos el título que elijamos.

En mi caso elegí TxtId, TxtNombres, TxtSexo, etc.

Ahora sugiero releer un par de artículos sobre las referencias a activar y el objeto Word (Enlace1) y otro sobre cómo detectar archivos abiertos (Enlace2). Del segundo enlace copiaremos en nuestro archivo Excel la UDF “IsFileOpen”.

Luego vamos a declarar las variables y abrir el archivo Word al que enviaremos los datos. Ya que enviaremos solo un registro a la vez, es importante que previamente se haya elegido un dato en la lista desplegable de la celda B1..

 If Range("B1") = "" Then
     MsgBox "Elija un dato de la lista", vbOKOnly, "Todo Sobre Excel"
     Exit Sub
 End If 

strArchivo = ThisWorkbook.Path & "\Formulario de datos.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 el archivo word
      Set objDoc = GetObject(strArchivo)
      Set MiappWord = objDoc.Application
 Else
      'si está cerrado el archivo Word
      Set MiappWord = CreateObject("Word.Application")
      MiappWord.Documents.Open strArchivo
      MiappWord.Visible = True 
End If 

Algo que no hicimos al inicio es declarar las variables que usaremos para los datos que enviaremos a Word. Asimismo, como en Excel nuestros datos están como Tabla, declararemos una variable para dicha tabla. En un momento veremos para qué es todo eso

Dim strNombre$, strSexo$, strDireccion$, strPrograma$ 
Dim FechaN as Date 
Dim MiTabla as ListObjects 

Para hallar los valores que corresponda al ID que elijamos en la celda B1, vamos a usar la WorkSheetFunction llamada VlookUp, de funcionamiento similar a BuscarV. Yo prefiero usar Find, pero para el ejercicio considero que será más fácil entender la función elegida. Esos sí, como buscaremos los datos en una Tabla, primero asignaremos el objeto Tabla a la variable respectiva y ya después usaremos el VLookUp.

Set miTabla = Hoja1.ListObjects("Tabla1")

With Application.WorksheetFunction
     strnombre = .VLookup(Range("B1"), miTabla.Range, 2, 0)
     strsexo = .VLookup(Range("B1"), miTabla.Range, 3, 0)
     fechan = .VLookup(Range("B1"), miTabla.Range, 4, 0)
     strdireccion = .VLookup(Range("B1"), miTabla.Range, 5, 0)
     strprograma = .VLookup(Range("B1"), miTabla.Range, 6, 0) 
End With 

Como ya tenemos los valores en nuestras variables, ahora sí comenzaremos a trabajar con el objeto Word y con los controles que ahí tenemos. Como vamos a trabajar con el documento activo, y hemos colocado nuestros propios títulos a cada control de nuestro archivo Word, usaremos también el método SelectContentControlsByTitle así como el objeto Range del control, que representa su área continua. Por último, a través de la propiedad Text le daremos el valor de nuestras variables de Excel. Ah, ojo con los nombres de los títulos de los controles ya que son sensibles a mayúsculas y minúsculas. El resultado en Word debe verse así:

Juntando todo y ordenando, deberíamos tener esto:

Option Explicit
 'Todo Sobre Excel
 'Abraham Valencia
 'https://abrahamexcel.blogspot.com/
 'https://www.facebook.com/TodosobreExcelAV/
 'https://twitter.com/Todosobre_Excel
 'Lima, Perú
 'Julio del 2020

 Sub EnviarDatosaWord() 

Dim MiappWord As Word.Application 
Dim objDoc As Object 
Dim strArchivo$, strnombre$, strsexo$, strdireccion$, strprograma$ 
Dim fechan As Date 
Dim miTabla As ListObject 

If Range("B1") = "" Then
     MsgBox "Elija un dato de la lista", vbOKOnly, "Todo Sobre Excel"
     Exit Sub 
End 

If strArchivo = ThisWorkbook.Path & "\Formulario de datos.docx" If Dir(strArchivo) = "" Then
      MsgBox "No existe el archivo", vbOKOnly, "Todo Sobre Excel"
      Exit Sub 
End If 

Set miTabla = Hoja1.ListObjects("Tabla1") 

With Application.WorksheetFunction
     strnombre = .VLookup(Range("B1"), miTabla.Range, 2, 0)
     strsexo = .VLookup(Range("B1"), miTabla.Range, 3, 0)
     fechan = .VLookup(Range("B1"), miTabla.Range, 4, 0)
     strdireccion = .VLookup(Range("B1"), miTabla.Range, 5, 0)
     strprograma = .VLookup(Range("B1"), miTabla.Range, 6, 0) 
End With 

If IsFileOpen(strArchivo) Then
      'si está abierto el archivo word
      Set objDoc = GetObject(strArchivo)
      Set MiappWord = objDoc.Application 
Else
      'si está cerrado el archivo Word
      Set MiappWord = CreateObject("Word.Application")
      MiappWord.Documents.Open strArchivo
      MiappWord.Visible = True 
End If 

With MiappWord.ActiveDocument
     .SelectContentControlsByTitle("TxtId").Item(1).Range.Text = Hoja1.Range("B1").Value
     .SelectContentControlsByTitle("TxtNombres").Item(1).Range.Text = strnombre
     .SelectContentControlsByTitle("TxtSexo").Item(1).Range.Text = strsexo
     .SelectContentControlsByTitle("TxtFechaN").Item(1).Range.Text = fechan
     .SelectContentControlsByTitle("TxtDirección").Item(1).Range.Text = strdireccion
     .SelectContentControlsByTitle("TxtPrograma").Item(1).Range.Text = strprograma
     .SelectContentControlsByTitle("TxtFechaI").Item(1).Range.Text = Date     
 End With

 'Dejamos el cursor al final de la página 
MiappWord.Selection.EndKey Unit:=wdStory 

MsgBox "Todo listo", vbOKOnly, "Todo Sobre Excel" 

'Esta línea no es necesaria, pero por costumbre algunos la usamos 
Set MiappWord = Nothing 

End Sub 

Y listo, eso es todo por hoy. Ah, por supuesto que si quieren pueden mejorar el formato del Word, al ser este un ejemplo pues no le dedico tiempo a ese tipo de detalles ¡Hasta la próxima!

Abraham Valencia
Lima, Perú

Descargue el ejemplo de aquí

jueves, 25 de junio de 2020

Interactuando con Microsoft Word (III): Abrir archivos de Word, o detectar si ya están abiertos, para trabajar con ellos desde Excel usando VBA.

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í