¿Cómo puedo buscar y reemplazar en múltiples archivos de Word?

10

Estoy buscando una manera de buscar y reemplazar en muchos archivos de Word (.doc) (con el fin de automatizar el proceso).

El software que encontré hasta ahora solo me permite buscar, pero no reemplazar.

¿Cómo puedo hacer eso con Word?

Tal Galili
fuente

Respuestas:

7

Puede probar VBA Find & Replace (enlace en caché).

VBA Find and Reemplazar © proporciona un método para buscar y reemplazar texto en cualquier parte de un documento (o colección de documentos) usando pares de variables "buscar" y "reemplazar" definidos por el usuario, o una lista definida por el usuario de "buscar" y "reemplazar" pares. También proporciona un método para buscar texto y reemplazar el texto encontrado con una entrada de "Texto automático" o "Bloque de creación" definida por el usuario.

Jay Wick
fuente
Esto se parece a lo que quería: ¡eres genial!
Tal Galili
¿En qué archivos busca este complemento? No puedo encontrar la posibilidad de especificar un directorio de inicio. ¿Utiliza solo todos los archivos abiertos? ¿Y cómo busco sin reemplazar?
Michael S.
2
@gentlesea ¿no ayuda la configuración 'Procesar archivos en carpeta por lotes'?
Jay Wick
1
Hay un período adicional al final de esa URL; lo eliminaría, pero StackOverflow está diseñado incorrectamente y evita que: gregmaxey.mvps.org/VBA_Find_And_Replace.htm
Chris Adams
1
gracias, realmente lo aprecio (:
p._phidot_
0

Con el fin de ejecutar múltiples reemplazos normales y basados ​​en comodines en múltiples archivos de MS Word ubicados en varias carpetas en una carpeta raíz dada, he creado la siguiente macro VBA. Para usarlo, debe cambiar el contenido de las siguientes variables (constantes):

  • rootPath : carpeta raíz en la que se encuentran las carpetas que contienen documentos de Word.
  • findTextsWild y replaceTextsWild : conjunto de expresiones de buscar y reemplazar basadas en comodines.
  • findTexts y replaceTexts : conjunto de expresiones normales de buscar y reemplazar.

Puede ser que lo encuentre útil :-)

Sub GlobalTextReplacement()
' Root under which all manuals are stored
Dim rootPath As String
rootPath = "c:\Data\Manuals\"

' Find and replace text for wildcard replacement. Performed first.
Dim findTextsWild() As Variant, replaceTextsWild() As Variant
findTextsWild = Array("[ ]{2;}", "[cC]onfiguration[/ ]@[pP]olicy [rR]epository", "[sS]ervlet[- ]@[fF]ilter")
replaceTextsWild = Array(" ", "Configuration/Policy Repository", "Servlet-Filter")

' Find and replace text for normal case insensitive replacement. Performed second.
Dim findTexts() As Variant, replaceTexts() As Variant
findTexts = Array("DirX Access", "Policy Repository", "User Repository", "Servlet", "servletfilter", "SAML assertion", "DirX Access Server", "DirX Access Manager", "Deployment Manager", "Policy Manager", "Client SDK", "^p ", " ^p")
replaceTexts = Array("DirX Access", "Policy Repository", "User Repository", "Servlet", "Servlet-Filter", "SAML assertion", "DirX Access Server", "DirX Access Manager", "Deployment Manager", "Policy Manager", "Client SDK", "^p", "^p")

' Main code
Application.ScreenUpdating = False

Dim dirNames(20) As String
Dim dirNamesCount As Integer
dirNamesCount = 0

Dim dirName As String
dirName = Dir$(rootPath & "*", vbDirectory)
Do Until LenB(dirName) = 0
    Dim dirPath As String
    dirPath = rootPath & dirName
    If ((GetAttr(dirPath) And vbDirectory) = vbDirectory) And (dirName <> ".") And (dirName <> "..") Then
        dirNamesCount = dirNamesCount + 1
        dirNames(dirNamesCount) = dirPath & "\"
    End If
    dirName = Dir$
Loop

Do While dirNamesCount > 0
    Dim fileName As String
    dirName = dirNames(dirNamesCount)
    dirNamesCount = dirNamesCount - 1
    fileName = Dir$(dirName & "*.doc", vbDirectory)
    Do Until LenB(fileName) = 0
        Dim filePath As String
        filePath = dirName & fileName
        fileName = Dir$

        Dim document As document
        Set document = Documents.Open(filePath)
        document.TrackRevisions = True

        document.Select

        Dim i As Integer, maxIndex As Integer
        maxIndex = UBound(findTextsWild)
        For i = LBound(findTextsWild) To maxIndex
            With Selection.Find
                .ClearFormatting
                .Replacement.ClearFormatting
                .Text = findTextsWild(i)
                .Replacement.Text = replaceTextsWild(i)
                .Execute Replace:=wdReplaceAll, Forward:=True, _
                    Wrap:=wdFindContinue, MatchWildcards:=True
            End With
        Next

        maxIndex = UBound(findTexts)
        For i = LBound(findTexts) To maxIndex
            With Selection.Find
                .ClearFormatting
                .Replacement.ClearFormatting
                .Text = findTexts(i)
                .Replacement.Text = replaceTexts(i)
                .Execute Replace:=wdReplaceAll, Forward:=True, _
                    Wrap:=wdFindContinue, MatchCase:=False, MatchWildcards:=False
            End With
        Next

        document.Save
        document.Close
    Loop
Loop

Application.ScreenUpdating = True
End Sub
Maxwell
fuente
-1

Si no posee Microsoft Word y está buscando una alternativa gratuita que lo ayude, pruebe OpenOffice.org .

No creo que esto lo ayude si está buscando una manera de automatizar este proceso.

Doug Harris
fuente
-1

Notepad ++ puede hacer esto usando "Buscar en archivos"

zeyrkelian
fuente
Atajo de teclado Ctrl + Shift + F
Itzjak
2
Notepad ++ puede abrir documentos de Microsoft Word?
Daniel Beck
1
Esto PUEDE funcionar si la coincidencia de la cadena y la cadena de reemplazo no son caracteres especiales porque los documentos de Word 2007+ son en realidad archivos XML por naturaleza. Pero dije que sí. ¿Te ha gustado probar esto antes de publicarlo como respuesta?
tumchaaditya
-2
Option Explicit

Public Sub BatchReplaceAll()
    Dim FirstLoop As Boolean
    Dim myFile As String
    Dim PathToUse As String
    Dim myDoc As Document
    Dim Response As Long

    PathToUse = ActiveDocument.Path
    On Error Resume Next
    Documents.Close SaveChanges:=wdPromptToSaveChanges
    FirstLoop = True
    myFile = Dir$(PathToUse & "\*.doc*")

    While myFile <> ""
        Set myDoc = Documents.Open(PathToUse & "\" & myFile)
        If FirstLoop Then
            Application.Dialogs(wdDialogEditReplace).Show
            FirstLoop = False

            Response = MsgBox("Do you want to process the rest of the files in this folder", vbYesNo)
            If Response = vbNo Then Exit Sub
        Else
            With Dialogs(wdDialogEditReplace)
                .ReplaceAll = 1
                .Execute
            End With
        End If
        myDoc.Close SaveChanges:=wdSaveChanges
        myFile = Dir$()
    Wend
End Sub
Avadhani
fuente
3
¿Qué es este bloque de código, qué hace y cómo puede ayudar a resolver este problema?
user2375849