Estoy intentando crear una macro para realizar una búsqueda y reemplazo masivo en varios documentos de Word. Encontré este en la red y lo modifiqué, sin embargo, sigo recibiendo un error de tiempo de ejecución (5174) que dice que no se pudo encontrar el archivo (aunque definitivamente está en la carpeta).
Además, después de haber encontrado una solución al problema inicial, necesito poder buscar y reemplazar imágenes que se encuentran en un pie de página.
Sub ReplaceText()
Dim Directory As String
Dim FType As String
Dim FName As String
Directory = "C:\Users\pieria\Desktop\TempPics"
FType = "*.docx"
ChDir Directory
FName = Dir(FType)
' for each file you find, run this loop
Do While FName <> ""
' open the file
Documents.Open FileName:=FName '<--Error is supposedly here
' search and replace the company name
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "CompanyA"
.MatchCase = True
.Replacement.Text = "CompanyB"
End With
Selection.Find.Execute Replace:=wdReplaceAll
' save and close the current document
ActiveDocument.Close wdSaveChanges
' look for next matching file
FName = Dir
Loop
End Sub
Respuesta1
Funciona bien para mí. Supongo que tienes un archivo de entrada roto y/o un nombre de archivo incorrecto.
Es hora de comenzar a depurar:
En el editor de VBA,establecer un punto de interrupciónen la Documents.Open FileName:=FName
línea, yagregar un reloja Fname
.
Ejecute el código y cada vez que se detenga, anote el nombre del archivo en el que está trabajando (que se muestra en el panel "Relojes"). Ahora, cuando arroje el error, sabrá con qué archivo tiene problemas.
Verifique ese archivo en busca de daños, problemas de permisos y/o rarezas generales. :)
Respuesta2
Aquí hay una posible respuesta, está diseñada para ser fácil de usar:
Public Sub MassReplace()
Dim strPath As String
Dim strFile As String
Dim FType As String
Dim FName As String
Dim strFind As String
Dim strReplace As String
Dim WordApp As Object
Dim WordDoc As Object
'El texto de arriba define tus objetos
strFind = InputBox("Enter Text to find")
strReplace = InputBox("Enter replacement Text")
'el usuario define el texto que desea buscar y reemplazar usando cuadros de entrada
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show Then
strPath = .SelectedItems(1)
Else
MsgBox "No folder selected!", vbExclamation
Exit Sub
End If
End With
If Right(strPath, 1) <> "\" Then
strPath = strPath & "\"
strFile = Dir(strPath & "*.docx*")
End If
Application.ScreenUpdating = False
'El bloque de código anterior permite al usuario seleccionar el archivo de carpeta para buscar
Do While strFile <> "" 'Do this while strFile is not blank
Set WordApp = CreateObject("Word.Application") 'Open MS word
WordApp.Visible = True 'Make word visible
Set WordDoc = WordApp.Documents.Open(strPath & strFile) 'open file in folder
WordApp.ActiveDocument.Range.Select ' select all text
With WordApp.Selection.Find 'Using the find function allows a search of text
.Text = strFind 'find "strFind"
.Replacement.Text = strReplace 'replacement text is "strReplace"
.Wrap = wdFindContinue
'.Format = False
'.MatchCase = False
'.MatchWholeWord = False
'.MatchWildcards = False
'.MatchSoundsLike = False
.Execute Replace:=wdReplaceAll 'replace all text
WordApp.ActiveDocument.Close wdSaveChanges 'Close document and save changes
End With 'End with block
WordApp.Quit 'Close the word application
strFile = Dir 'Go back to the directory
Loop
Application.ScreenUpdating = True
End Sub
Esto parece funcionar bien para Word 2016. Permite al usuario definir la ruta de su archivo y utiliza cuadros de entrada para definir el texto a reemplazar/buscar. Para reemplazar números en lugar de texto, defina strFind y strReplace como números enteros (u otro tipo de número) en lugar de texto. ¡Feliz codificación!