Sostituire parola



  • Sostituire parola
    di Antonio (utente non iscritto) data: 03/10/2013 18:35:55

    Salve. Mi servirebbe una macro che praticamente ogni volta che scrivo in una cella di tutta la cartella di lavoro per esempio la parola Tonio me la sostituisca automaticamente con la parola Antonio. Naturalmente la parola per esempio Tonio può stare nella stessa cella dove ci sono altre parole per esempio Tonio Rossi. Grazie



  • di Vecchio Frac data: 03/10/2013 18:44:08

    Avrai bisogno di intercettare l'evento Worksheet_Change del foglio in questione.
    Quando nel target si ravvisa la stringa da cambiare, nel target si farà un Replace sistemando la parola chiave con la stringa estesa.
    Attenzione a disabilitare gli eventi nella routine (riabilitandoli all'uscita) per evitare ricorsioni.

    Quanto di quello che hai appena letto è arabo per te? ^_^





  • di Antonio (utente non iscritto) data: 03/10/2013 20:54:20

    È un misto fra giapponese e ostrogoto



  • di totygno71 (utente non iscritto) data: 03/10/2013 21:31:42

    Seguendo pedissecuamente le direttive di Vecchio Frac...
     
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    Application.EnableEvents = False
    
        If Target = "Tonio" Then
            Target.Replace What:="Tonio", Replacement:="Antonio"
        End If
    
    Application.EnableEvents = True
    
    End Sub
    



  • di gaetanopr data: 03/10/2013 21:38:53

    io cambierei
     
    If Target = "Tonio" Then
    
    con
    
    If Target Like "*Tonio*" Then



  • di Antonio (utente non iscritto) data: 03/10/2013 21:41:39

    Grazie. Quel codice va messo in thisworkbook o in modulo?



  • di totygno71 (utente non iscritto) data: 03/10/2013 21:44:32

    Direttamente ne foglio che desideri_



  • di Vecchio Frac data: 03/10/2013 21:54:03

    Finalmente qualcuno che sa usare Like ^_^





  • di Antonio (utente non iscritto) data: 03/10/2013 21:57:00

    Che cosa cambia usando like?



  • di totygno71 (utente non iscritto) data: 03/10/2013 21:57:01

    O_o
    La richiesta non contemplava tale evenienza!!! U_U



  • di gaetanopr data: 03/10/2013 21:58:07

    cit>>
    Naturalmente la parola per esempio Tonio può stare nella stessa cella dove ci sono altre parole per esempio Tonio Rossi
    serve a questo



  • di Vecchio Frac data: 03/10/2013 21:58:34

    Come no?
    cit. "Tonio può stare nella stessa cella dove ci sono altre parole per esempio Tonio Rossi"

    ^_^

    (Like è una finezza)





  • di totygno71-Linco_mpreso (utente non iscritto) data: 03/10/2013 22:04:55

    Ragione avete... -_-' avevo capito che Tonio Rossi doveva restare li dov'era... ^_^



  • di Antonio (utente non iscritto) data: 03/10/2013 22:08:57

    Ok, quindi devo usare obbligatoriamente If Target Like "*Tonio*" Then



  • di Vecchio Frac data: 03/10/2013 22:15:29

    Oddio è tornato il Linco-Rinco ^_^
    LOL

    (non spaventatevi... totygno è abituato alle battute)

    Per restare seri, al posto di Like si poteva usare Instr:
    If InStr(LCase(Target), "tonio") Then Target = Replace(Target, "Tonio", "Antonio", , , vbTextCompare)
    Ma Like è molto più carino ^_^

    Però...se digito "Antonio" in una cella cosa succede? ^_^





  • di Vecchio Frac data: 03/10/2013 22:21:30

    ...la soluzione è nelle espressioni regolari... però adesso sono stanco e quindi chiudo e vado a nanna ^_^
    magari domani riesco a tirare fuori il coniglio dal cilindro :)





  • di Antonio (utente non iscritto) data: 03/10/2013 22:32:18

    Naturalmente se in una cella scrivo Antonio deve rimanere Antonio. Se oltre alla parola Tonio vorrei sostituire altre parole per esempio Toni Tonino sempre con Antonio come si deve modificare il codice? Scusate se ne approfitto. Serena notte a tutti



  • di Vecchio Frac data: 04/10/2013 08:39:26

    Per risolvere il problema di cui sopra (se digito "Antonio" risulta "AnAntonio"!) propongo questa versione.
    Puoi prevedere i diversi casi di sostituzione nel blocco Select/Case.
    Il codice è forse troppo prudente ma risulta abbastanza blindato.
     
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim re As Object, match As Variant, m As String, s As String
        
        If Target.Cells.Count > 1 Then Exit Sub
        If Target = "" Then Exit Sub
        
        Application.EnableEvents = False
        
        Set re = CreateObject("VBScript.RegExp")
        re.Pattern = "w*"
        re.IgnoreCase = True
        re.Global = True
        
        s = ""
        If re.Test(Target) Then
            For Each match In re.Execute(Target)
                If match <> "" Then
                    m = ""
                    Select Case LCase(match)
                    Case "tonio"
                        m = "Antonio"
                    Case "pippo"
                        m = "Filippo"
                    Case "berto"
                        m = "Alberto"
                    End Select
                    If m <> "" Then s = s & m & " " Else s = s & match & " "
                End If
            Next
            Target = RTrim(s)
        End If
        
        
        Application.EnableEvents = True
    End Sub






  • di Antonio (utente non iscritto) data: 04/10/2013 21:29:58

    Ok, la macro di Vecchio Frac è perfetta. Grazie mille