Abrir un doc de word especifico o si esta abierto continuar
No se si es posible pero quisiera saber cómo podría hacerlo. Tengo una macro que me abre un documento de word específico; sin embargo en ocasiones este documento de word ya está abierto y al ejecutar la macro se bloquea todo excel.. Quisiera saber si existe una manera de que en la parte de que va a abrir el word, si está abierto simplemente lo ubique y continúe con la macro... Sin bloquearse.
1 respuesta
Prueba lo siguiente:
Sub PORTADA()
'Declaración de variables
Dim num As Variant
Dim ruta As String, archi As String
Dim TEX2 As String, TEX3 As String
Dim WordApp As Object
Dim wdDoc As Object
'Dim WordApp As Word.Application
'Dim wdDoc As Word.Document
'
'Ambiente
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'
'Buscar archivos en la ruta con el número
num = Worksheets("Ficha").Range("F2").Value
ruta = "C:\Users\Laura\Dropbox\TODAS\"
archi = Dir(ruta & "*" & num & "*.docx")
'
If archi <> "" Then
'
'Verifica si el archivo está abierto
On Error Resume Next
Set WordApp = GetObject(, "Word.Application")
On Error GoTo 0
If WordApp Is Nothing Then
Set WordApp = CreateObject("Word.Application")
End If
WordApp.Visible = True
On Error Resume Next
Set wdDoc = WordApp.Documents(ruta & archi)
On Error GoTo 0
If wdDoc Is Nothing Then
'Abre el archivo
Set wdDoc = WordApp.Documents.Open(ruta & archi)
Else
'activa el archivo
WdDoc. Activate
End If
Sheets("PORTADA"). Range("D3:I34"). Copy
'Se pegara en el documento lo copiado en la hoja de calculo
WordApp. Selection. PasteAndFormat 13
WordApp. Selection. InsertBreak
WordApp. Selection.Move 6, -1
WordApp.ActiveDocument.PrintOut Range:=2
WordApp.Documents.Save True
Else
'crea nuevo archivo
Sheets("PORTADA"). Range("D3:I34"). Copy
TEX2 = ThisWorkbook.Worksheets("PORTADA").Range("M10").Value
TEX3 = ThisWorkbook.Worksheets("PORTADA").Range("M11").Value
Set WordApp = CreateObject("word.Application")
WordApp. Documents. Add
WordApp.Selection.PasteAndFormat 13
WordApp.Selection.InsertBreak
WordApp.Selection.Move 6, -1
WordApp.ActiveDocument.PrintOut Range:=2 ' wdPrintCurrentPage
WordApp.ActiveDocument.SaveAs ruta & TEX2 & TEX3 & ".doc"
End If
'Cerrar word
'WordApp.Quit
Set WordApp = Nothing
Set wdDoc = Nothing
'
Application.ScreenUpdating = True
Application.CutCopyMode = False
End Sub
Hola, te agradezco. Sin embargo, aunque me funciona me abre un documento nuevo de word y me aparece que el archivo esta bloqueado para edición de invitado. No sé como quitar eso... ya revisé de evarias maneras
Mira
Sub GUARDAR()
Application.ScreenUpdating = False
'Abre word
Dim num As Variant
Dim ruta As String
Dim TEX2 As String, TEX3 As String
Dim WordApp As Object
Dim wdDoc As Object
'Dim WordApp As Word.Application
'Dim wdDoc As Word.Document
'
'Ambiente
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'
num = Worksheets("Ficha").Range("F2").Value
ruta = "C:\Users\Laura\Dropbox\DOCUMENTOS PERSONALES\CONSULTORIO\hISTORIAS CLINICAS\TODAS\"
'
'Buscar archivos en la ruta con el número
archi = Dir(ruta & "*" & num & "*.docx")
'
If archi <> "" Then
'Verifica si el archivo está abierto
On Error Resume Next
Set WordApp = GetObject(, "Word.Application")
On Error GoTo 0
If WordApp Is Nothing Then
Set WordApp = CreateObject("Word.Application")
End If
WordApp.Visible = True
On Error Resume Next
Set wdDoc = WordApp.Documents(ruta & archi)
On Error GoTo 0
If wdDoc Is Nothing Then
'Abre el archivo
Set wdDoc = WordApp.Documents.Open(ruta & archi)
Else
'activa el archivo
wdDoc.Activate
End If
'Titulo fecha
Sheets("Ficha").Range("B10").Copy
'Se pegara en el documento lo copiado en la hoja de calculo
WordApp.Selection.EndKey Unit:=6
WordApp.Selection.PasteSpecial xlPasteAllExceptBorders
WordApp.Documents.Save
'Cerrar word
WordApp.Quit
Set WordApp = Nothing
Set wdDoc = Nothing
Else
'crea nuevo archivo
Sheets("PORTADA").Range("D3:I34").Copy
TEX2 = ThisWorkbook.Worksheets("PORTADA").Range("M10").Value
TEX3 = ThisWorkbook.Worksheets("PORTADA").Range("M11").Value
Set WordApp = CreateObject("word.Application")
WordApp.Documents.Add
WordApp.ActiveDocument.SaveAs ruta & TEX2 & TEX3 & ".doc"
'Titulo fecha
Sheets("Ficha").Range("B10").Copy
'Se pegara en el documento lo copiado en la hoja de calculo
WordApp.Selection.EndKey Unit:=6
WordApp.Selection.PasteSpecial xlPasteAllExceptBorders
WordApp.Documents.Save
'Cerrar word
WordApp.Quit
Set WordApp = Nothing
Set wdDoc = Nothing
End If
Application.ScreenUpdating = True
End SubEn un caso me funcionó pero abrio el otro documento y salió el solo lectura, y en el otro no hizo nada... no pego la información
Cambiar esta línea
WordApp. Documents. Save
Por esta
WordApp. Documents. Save True
Ahora, probemos el caso cuando el archivo, sí existe y además está abierto.
Ejecuta la macro paso a paso con F8. También pon interrupciones:

Revisa exactamente por cuáles líneas pasa el código.
Si el archivo existe y además está abierto, debe pasar por esta línea:
WdDoc. Activate
Entonces analiza en qué momento te abre un nuevo libro. Si ya está abierto el archivo doc ya no debería abrir uno nuevo.
Igualmente lo intenté con otro archivo y llega al mismo punto pero después ya no copia la información
¿El archivo lo tienes compartido en la red?
¿Cuándo tienes abierto el archivo, lo puedes editar o solamente es de lectura?
Te hago todas esas preguntas, porque la macro que te puse, me funciona sin problema.
el archivo esta en Dropbox unicamente.... y sí puedo editarlo cuando esta abierto. Entiendo, te agradezco si puedo solucionarlo..
Incluso hay veces que me sale el mismo letrero cuando estoy editando el archivo me pide guardarlo nuevamente y es como un bucle guarda y otra vez pide lo mismo.
Tal vez es un conflicto en la versión de office y dropbox.
Intentaste probando con un archivo word pero que esté directamente en tu disco duro.
Ya acabo de probar así con el mismo archivo con una copia en mi escritorio directamente y sucedió lo mismo.. Pero cree uno nuevo y ahí si me funcionó... aunque me creo este archivo al lado ~$prueba.docx
Prueba con el siguiente código. Debes poner todo en el mismo módulo:
Sub PORTADA()
'Declaración de variables
Dim num As Variant
Dim ruta As String, archi As String
Dim TEX2 As String, TEX3 As String
Dim WordApp As Object
Dim wdDoc As Object
'Dim WordApp As Word.Application
'Dim wdDoc As Word.Document
'
'Ambiente
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'
'Buscar archivos en la ruta con el número
num = Worksheets("Ficha").Range("F2").Value
ruta = "C:\Users\Laura\Dropbox\TODAS\"
archi = Dir(ruta & "*" & num & "*.docx")
'
If archi <> "" Then
'Verifica si el archivo está abierto
If IsFileOpen(ruta & archi) Then
Set WordApp = GetObject(, "Word.Application")
Set wdDoc = WordApp.Documents(ruta & archi)
wdDoc.Activate
Else
Set WordApp = CreateObject("Word.Application")
Set wdDoc = WordApp.Documents.Open(ruta & archi)
End If
Sheets("Ficha").Range("B10").Copy
'Se pegara en el documento lo copiado en la hoja de calculo
WordApp.Selection.EndKey Unit:=6
WordApp.Selection.PasteSpecial xlPasteAllExceptBorders
WordApp.Documents.Save True
Else
'crea nuevo archivo
Sheets("Ficha").Range("B10").Copy
TEX2 = ThisWorkbook.Worksheets("PORTADA").Range("M10").Value
TEX3 = ThisWorkbook.Worksheets("PORTADA").Range("M11").Value
Set WordApp = CreateObject("word.Application")
WordApp.Documents.Add
WordApp.Selection.EndKey Unit:=6
WordApp.Selection.PasteSpecial xlPasteAllExceptBorders
WordApp.ActiveDocument.SaveAs ruta & TEX2 & TEX3 & ".doc"
WordApp.Quit
End If
'Cerrar word
'WordApp.Quit
Set WordApp = Nothing
Set wdDoc = Nothing
'
Application.ScreenUpdating = True
Application.CutCopyMode = False
End Sub
Function IsFileOpen(strFullPathFileName As String) As Boolean
'// VBA version to check if File is Open
'// We can use this for ANY FILE not just Excel!
'// Ivan F Moala
'// http://www.xcelfiles.com
Dim hdlFile As Long
'// Error is generated if you try
'// opening a File for ReadWrite lock >> MUST BE OPEN!
On Error GoTo FileIsOpen:
hdlFile = FreeFile
Open strFullPathFileName For Random Access Read Write Lock Read Write As hdlFile
IsFileOpen = False
Close hdlFile
Exit Function
FileIsOpen:
'// Someone has it open!
IsFileOpen = True
Close hdlFile
End Function
- Compartir respuesta
