Sostituzione testo in WORD

di il
4 risposte

Sostituzione testo in WORD

Con questa routine in VBA di Word sostituisco un testo in un documento WORD.

Sub TESTISOSTITUZIONEInputBOXSostituisci()
 On Error Resume Next
    ParolaDASOSTITUIRE = InputBox("Inserisci parola da sostituire")
    ParolaDAINSERIRE = InputBox("Scrivi PAROLA DA INSERIRE")
       Selection.Find.ClearFormatting
       Selection.Find.Replacement.ClearFormatting
           With Selection.Find
              .Text = ParolaDASOSTITUIRE
              .Replacement.Text = ParolaDAINSERIRE
              .Forward = True
           End With
   Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Tuttavia vorrei che alla fine uscisse una Messagebox che mi dicesse quante sostituzioni sono state operate.

Come devo modificarlo?

4 Risposte

  • Re: Sostituzione testo in WORD

    Ciao,

    dovrebbe esser una cosa di questo tipo :

    Esempio:

    Option Explicit
    
    Sub TESTISOSTITUZIONEInputBOXSostituisci()
    Dim ParolaDASOSTITUIRE As String
    Dim ParolaDAINSERIRE As String
    ParolaDASOSTITUIRE = InputBox("Inserisci parola da sostituire")
    ParolaDAINSERIRE = InputBox("Scrivi PAROLA DA INSERIRE")
    
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = ParolaDASOSTITUIRE
        .Replacement.Text = ParolaDAINSERIRE
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    
    If Selection.Find.Execute(Replace:=wdReplaceAll) Then
        MsgBox "Sostituzione effettuata per la ricerca di :" & vbCrLf & ParolaDASOSTITUIRE, vbInformation, "Info"
    Else
        MsgBox "Nessuna sostituzione effettuata per la ricerca di:" & vbCrLf & ParolaDASOSTITUIRE, vbInformation, "Info"
    End If
    End Sub

    In Vba usa sempre Option Explicit e definisci sempre le variabili.
    Poi vanno fatti alcuni controlli … 

    verifica ;-)

  • Re: Sostituzione testo in WORD

    Se vuoi effettuare alcuni controlli ed eliminare le variabili:

    Esempio

    Option Explicit
    Sub TESTISOSTITUZIONEInputBOXSostituisci()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
       .Text = InputBox("Inserisci parola da sostituire")
       If .Text = vbNullString Then GoTo ActionDeleted
       .Replacement.Text = InputBox("Scrivi PAROLA DA INSERIRE")
       If .Replacement.Text = vbNullString Then GoTo ActionDeleted
       .Forward = True
       .Wrap = wdFindContinue
       .Format = False
       .MatchCase = False
       .MatchWholeWord = False
       .MatchWildcards = False
       .MatchSoundsLike = False
       .MatchAllWordForms = False
       If .Execute(Replace:=wdReplaceAll) Then
           MsgBox "Sostituzione effettuata per la ricerca di :" & vbCrLf & vbCrLf & .Text & _
                  vbCrLf & "con :" & vbCrLf & .Replacement.Text, vbInformation, "Info"
       Else
           MsgBox "Nessuna sostituzione effettuata per la ricerca di:" & vbCrLf & vbCrLf & .Text & _
                  vbCrLf & "con :" & vbCrLf & .Replacement.Text, vbInformation, "Info"
       End If
    End With
    Exit Sub
    ActionDeleted:
    MsgBox "Operazione Annullata", vbInformation, "Info"
    End Sub

    Tanto per darti una traccia di cosa potresti fare 

  • Re: Sostituzione testo in WORD

    Mentre per il conteggio non esiste una proprietà Count  che io sappia…. 

    quindi devi trovare e sostituire un occorrenza alla volta e accumulare il conteggio in una variabile da esporre nel messaggio finale.

    Io sono riuscito a trovare la soluzione solo in questo modo: 
    Esempio … Da un testo Cerca la parola Ciao e Sostituisci con Come stai

    e sono riuscito a conteggiare le occorrenze solo ripetendo in un ciclo le impostazioni delle proprietà e la ricerca, sostituendo un occorrenza alla volta:

     Option Explicit
     
    ' WORD DOCUMENT SEARCH AND REPLACE
    Sub MySearchAndReplace()
    Dim lngCount As Long
    Dim blnResult As Boolean
    Dim txtSearch As String
    Dim txtReplace As String
    
    ' set and check inputbox
    txtSearch = InputBox("Trova :", "Search")
    If txtSearch = vbNullString Then GoTo ActionDeleted
    txtReplace = InputBox("Sostituisci con :", "Replace")
    If txtReplace = vbNullString Then GoTo ActionDeleted
    
    ' set properties
    Do
       Selection.Find.ClearFormatting
       Selection.Find.Replacement.ClearFormatting
       With Selection.Find
           .Text = txtSearch
           .Replacement.Text = txtReplace
           .Forward = True
           .Wrap = wdFindContinue
           .Format = False
           .MatchCase = False
           .MatchWholeWord = False
           .MatchWildcards = False
           .MatchSoundsLike = False
           .MatchAllWordForms = False
       End With
       ' search and replace
       blnResult = Selection.Find.Execute(Replace:=wdReplaceOne)
       ' check and increase count
       If blnResult Then lngCount = lngCount + 1
    Loop While blnResult
    
    ' refresh document
    Selection.Collapse wdCollapseEnd
    ActiveDocument.Fields.Update
    
    ' check result and send msg
    If lngCount > 0 Then
       MsgBox "Trovato [ " & lngCount & " ] occorenze per la ricerca di :" & vbCrLf & vbCrLf & "'" & txtSearch & "'" & _
              vbCrLf & "sostituito con :" & vbCrLf & "'" & txtReplace & "'", vbInformation, "Info"
    Else
       MsgBox "Nessuna occorenza trovate per :" & vbCrLf & vbCrLf & "'" & txtSearch & "'", vbInformation, "Info"
    End If
    Exit Sub
    ' action deleted
    ActionDeleted:
    MsgBox "Operazione Annullata", vbInformation, "Info"
    End Sub

    Verifica se fa al caso tuo e se i controlli sono soddisfacenti.

    ;-)


    Edit:
    ti descrivo la Sub per darti una traccia abbastanza completa…

    • In Vba Imposta sempre Option Explicit  Option Explicit statement (VBA) | Microsoft Learn
    • Definizione delle variabili da usare nella Sub
      • variabile di tipo Long per conteggiare il totale delle occorrenze da sostituire
      • variabile di tipo Boolean da usare per Vero/Falso nel controllo se esistono occorrenze per la ricerca da effettuare
      • due variabili stringa usate per ricevere il valore restituito dalle InputBox
    • Impostazione e Controllo per le InputBox
      • nelle variabili stringa si riceve i valori di ritorno dalle InputBox
      • si esegue il test per validare le due variabili nel caso in cui venga premuto il pulsante Annulla nelle InputBox
        • in tal caso si salta alla fine della Sub dove viene emesso il messaggio di Operazione Annullata
    • Impostazione delle proprietà per effettuare la ricerca e la sostituzione delle occorrenze
      • qui si definiscono le modalità di ricerca e di sostituzione delle occorrenze
    • Esecuzione di un ciclo Do While
      • se Selection.Find.Execute(Replace:=wdReplaceOne) riturna il valore Booleano = True 
        • si incrementa il conteggio delle occorenze 
        • si esegue il loop per verificare se ci sono ulteriori occorrenze
        • se non ci sono occorrenze per il Trova e Sostituisci, allora il valore Booleano sarà = False e si esce dal Loop
    • Refresh del documento 
      • viene tolta la selezione sulla ultima occorrenza trovata e sostituita
      • refresh del documento per una corretta visualizzazione durante l'emissione di MsgBox di completamento. Se togli tali istruzioni si vedrà sotto alla MsgBox l'ultima occorrenza rilevata e ancora non refresh…ata e potrebbe trarre in inganno.
    • Controllo del risultato ed emissione messaggio di completamento
      • si valuta il conteggio delle occorrenze se è maggiore di 0 oppure no … 
        • gli MsgBox descrivono il risultato dell'operazione eseguita

    P.S. Ho provato con tale metodo e i test sono buoni. Vediamo se qualcun altro ha degli approcci diversi e migliori perchè per me l'argomento è del tutto nuovo. 

  • Re: Sostituzione testo in WORD

    Una Nota proprio per essere esaustivi…

    Non ho messo volutamente la function Trim per eliminare gli spazzi all'inizio e alla fine delle stringhe di Ricerca e Sostituzione, in quanto gli stessi possono essere e far parte della ricerca e sostituzione.

    Valuta eventualmente tale implementazione se è richiesta nel tuo campo di applicazione.

Devi accedere o registrarti per scrivere nel forum
4 risposte