Я пытаюсь создать макрос для массового поиска и замены в нескольких документах Word. Я нашел его в сети и изменил его, однако я продолжаю получать ошибку времени выполнения (5174), сообщающую, что файл не найден (хотя он определенно находится в папке).
Кроме того, после того как я нашел решение первоначальной проблемы, мне нужно будет иметь возможность находить и заменять изображения, находящиеся в нижнем колонтитуле.
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
решение1
У меня все отлично работает. Я предполагаю, что у вас поврежденный входной файл и/или странное имя файла.
Пришло время начать отладку:
В редакторе VBAустановить точку останована Documents.Open FileName:=FName
линии, идобавить часык Fname
.
Запустите код и каждый раз, когда он останавливается, отметьте имя файла, над которым он работает (показано на панели «Watches»). Теперь, когда он выдает ошибку, вы будете знать, с каким файлом у него проблемы.
Проверьте этот файл на наличие повреждений, проблем с разрешениями и/или общих странностей. :)
решение2
Вот возможный ответ, он разработан так, чтобы быть удобным для пользователя:
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
«Текст выше определяет ваши объекты»
strFind = InputBox("Enter Text to find")
strReplace = InputBox("Enter replacement Text")
' пользователь определяет текст, который он хочет найти и заменить, используя поля ввода
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
«Приведенный выше блок кода позволяет пользователю выбрать папку для поиска файлов.
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
Кажется, это хорошо работает для Word 2016. Это позволяет пользователю определять путь к файлу и использует поля ввода для определения текста для замены/поиска. Чтобы заменить числа вместо текста, определите strFind и strReplace как целые числа (или другой числовой тип) вместо текста. Удачного кодирования!