Estou tentando criar uma macro para localizar e substituir em massa vários documentos do Word. Eu encontrei este na rede e o alterei, mas continuo recebendo um erro de tempo de execução (5174) dizendo que o arquivo não foi encontrado (mesmo que esteja definitivamente na pasta).
Além disso, depois de encontrar uma solução para o problema inicial, preciso encontrar e substituir as imagens que estão no rodapé.
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
Responder1
Funciona bem para mim. Meu palpite é que você tem um arquivo de entrada quebrado e/ou um nome de arquivo instável.
Hora de começar a depuração:
No editor VBA,definir um ponto de interrupçãona Documents.Open FileName:=FName
linha, eadicionar um relógiopara Fname
.
Execute o código e cada vez que ele parar, anote o nome do arquivo no qual ele está trabalhando (mostrado no painel “Watches”). Agora, quando ocorrer o erro, você saberá com qual arquivo está tendo problemas.
Verifique esse arquivo quanto a corrupção, problemas de permissão e/ou estranheza geral. :)
Responder2
Aqui está uma resposta potencial, ela foi projetada para ser amigável:
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
'O texto acima define seus objetos
strFind = InputBox("Enter Text to find")
strReplace = InputBox("Enter replacement Text")
'o usuário define o texto que deseja localizar e substituir usando caixas 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
'O bloco de código acima permite ao usuário selecionar o arquivo da pasta para pesquisar
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
Isso parece funcionar bem para o Word 2016. Ele permite que o usuário defina o caminho do arquivo e use caixas de entrada para definir o texto a ser substituído/localizado. Para substituir números em vez de texto, defina strFind e strReplace como números inteiros (ou outro tipo de número) em vez de texto. Boa codificação!