Find e Replace multipli per Excel



  • "Find & Replace" multipli per Excel
    di Far2012 (utente non iscritto) data: 18/11/2012 14:40:34

    Ciao tutti,

    uno un VBA per word per fare "Find & Replace" multipli. Avrei bisogno di fare la stessa cosa in Excel. Mando in allegato VBA che uso per word. Vorrei sapere se esiste già un vba simile per Excel o se mi potreste aiutare a convertirlo a Excel?

    Grazie mille
    Far



  • di Vecchio Frac data: 18/11/2012 21:02:36

    Non esiste un VBA per Excel.
    VBA è VBA e basta, poi ogni applicazione espone i propri modelli specifici.
    In Excel l'oggetto Document di Word non esiste, esiste l'oggetto Sheet che ne è l'analogo.
    Per il resto i comandi base e la logica sono uguali.
    Per questo è mutuabile un codice da un'applicazione a un'altra.





  • di Far2012 (utente non iscritto) data: 18/11/2012 21:16:41

    Ciao e grazie della risposta Frac.
    Ho imparato una cosa nuova. Ma quindi come si può realizzare un VBA che cerca e sostituisce contemporaneamente "una lista delle parole" in un sheet o diversi sheet?

    grazie ancora
    Far



  • di Vecchio Frac data: 19/11/2012 10:10:37

    Prova a utilizzare il registratore di macro, avviando una sessione e simulando una ricerca.
    Analizza il risultato e poi buttalo via perchè spesso è illeggibile :) ma ti rimarrà il concetto di base: qual è l'istruzione corretta e come si usa.





  • di Far2012 (utente non iscritto) data: 21/11/2012 23:35:37

    Ciao,
    come suggerito ho provato di registrare una macro per cerca e sostitusci multipli, ma purtroppo non essendo esperto non sono riuscito a concludere niente. In allegato invio il file che sono riuscito a creare.
    Vi ringrazio in anticipo per il riscontro.
    Far



  • di Vecchio Frac data: 22/11/2012 08:18:27

    Il codice che hai abbozzato nel Modulo3 cerca il testo specificato in "What:=" e lo sostituisce con quello specificato in "Replacement:="
    Cells.Replace What:="Aikido", Replacement:="123"

    La sintassi è corretta.
    Puoi accorpare le diverse istruzioni Replace in un blocco With per evitare di ripeterle.
    Se la sostituzione deve avvenire in fogli diversi basta specificarli dopo il With:
    With Sheets("Foglio2")
    .Cells.Replace ...
    End With

    oppure
    With ThisWorkbook
    Sheets("Foiglio1").Cells.Replace ...
    Sheets("Foglio2").Cells.Replace ...
    Ed With
     
    Sub find_replace()
    
        With Cells
            .Replace What:="uno", Replacement:="1"
            .Replace What:="due", Replacement:="2"
            .Replace What:="tre", Replacement:="3"
        End With
    
    End Sub






  • di Far2012 (utente non iscritto) data: 22/11/2012 13:17:49

    Ciao e grazie ancora per la risposta.
    Ho provato e ha funzionato, ma visto che la quantità delle parole da cercare e sostituire sono alte, avrei necessità che la Macro chiamasse un'altro file Excel che si chiama (lista.xlsx) e che ha uno solo sheet che sichiama "lista" e ha due colonne. Nella colonna A ci sono "le parole da cercare" e nella colonna B ci sono le parole che devono sostituire le parole della colonna A.
    In sostanza la macro dovrebbe ricercare e sostituire tutte le parole in un Workbook, basandosi su un file esterno di Excel chiamato "lista.xlsx".
    Ho cercato a combinare i codici ma non ha funzionato. Mando in allegato sia file con macro che la lista.

    Grazie in anticipo
    Far



  • di Vecchio Frac data: 22/11/2012 21:59:52

    Ma se non ho capito male, nella tabella delle corrispondenze vuoi che la colonna A rimanga intatta, vuoi solo la traduzione della parola da mettere come corrispondente in colonna B.
    Esempio, se in A ho "Bushi", e nel file della lista a Bushi corrisponde "Guerriero", in colonna B del foglio principale voglio che compaia "Guerriero", e non che venga sostituito anche Bushi della colonna A.
    Avevo iniziato a scrivere qualcosa ma poi mi sono fermato a riflettere.
    Dimmi se il ragionamento è, come penso, esatto :)

    (p.s. invece di un secondo file xlsx da usare come appoggio delle parole da cercare e sostituire, un file di testo con campi separati da tab oppure parola1 = parola2 forse sarebbe meglio).





  • di Far2012 (utente non iscritto) data: 22/11/2012 23:00:37

    Ciao e grazie della risposta.
    No, lasciamo stare il primo file.
    L'idea è usare un secondo file come d'appoggio per cercare e sostituire in tutte le celle in tutte i sheet e va benissimo anche utilizzre un file txt con campi separati da tab.

    Grazie
    Far



  • di Vecchio Frac data: 23/11/2012 08:36:26

    In un file Excel crea un modulo e immettici il codice qui sotto. Salva il file :)
    Crea nella stessa directory un file di testo con Notepad e inserisci le parole da cercare / sostituire separate da segno di uguale, ad esempio:
    aaa=bbb
    ddd=fff
    ggg=nnn
    sss=ddd
    zzz=ooo
    ppp=PPP
    ApA=aPa
    Ssa=ssA
    NNb=nNB
    VBg=Gvb
    sNH=Anh

    Chiama questo file di testo "lista.txt".
    Scrivi nel file di Excel alcune delle parole da sostituire, lancia la macro e goditi le sostituzioni :)
     
    'In un Modulo:
    Option Explicit
    
    Sub find_replace()
    Dim free_file As Integer, s As String, v As Variant
    
        free_file = FreeFile
        Open "lista.txt" For Input As free_file
        
        While Not EOF(1)
            Line Input #1, s
            v = Split(s, "=")
            Cells.Replace Trim(v(0)), Trim(v(1)), MatchCase:=True
        Wend
        
        Close free_file
        
        MsgBox "Operazioni completate.", vbInformation, "Fatto"
    
    End Sub






  • di Far2012 (utente non iscritto) data: 23/11/2012 11:48:17

    Ti ringrazio molto. Funziona prefettamente.
    Un'altra domanda: se volessi farlo girare per fare ricerca e sostituzione all'interno di tanti file Excel che stanno dentro un folder con diversi subfolder, che cosa dovrei fare?

    Grazie ancora
    Far



  • di Vecchio Frac data: 25/11/2012 17:52:37

    Devi creare un oggetto FileSystemObject con il quale scorrere i Files all'interno delle SubFolder di una Folder specificata, quindi effettuare le operazioni interessate. Tieni conto che c'è anche una tecnica per accedere/modificare dati dentro file Excel senza necessariamente aprirli.





  • di Far2012 (utente non iscritto) data: 25/11/2012 17:53:38

    Ciao, per quanto riguarda questa discussione, mi potreste dare una soluzione per cerca e sostituisci all'interno di tanti file Excel che stanno dentro un folder con diversi Subfolder?

    Inoltre vorrei sapere se è possibile inserire anche un comando particolare?
    Vorrei sapere se è possibile dire che quando trovi in una cella la parola come "parola" sostituisci solo il primo carattere per esempio "a=A" ma l'ultimo carattere "a" lascialo com'è. Per esempio io in word uso questo comando: cerca "a^p" e sostituisci con "A^p". In questo modo si sostituisce solo l'ultimo carattere prima del segno paragrafo. In Excel trattandosi di cella non so come fare?

    Grazie mille
    Far



  • di Vecchio Frac data: 25/11/2012 18:04:23

    Averti nominato FileSystemObject, Files, Folders e SubFolders non ti ha aiutato?

    Sul secondo punto:
    replace ("parola", "a", "A", count:=1)
    ---> pArola






  • di Far2012 (utente non iscritto) data: 25/11/2012 18:15:07

    Come sempre grazie di celere risposta.
    Per quanto riguarda il primo punto, non essendo familiare con Excel, non so dove inserire la riga del comando dentro la macro che precedentemente gentilmente avevi realizzato.

    Per quanto riguarda il secondo punto non si tratta di ricerca e sostituzione di un carattere dentro solo una parola, ma si tratta di fare la ricerca e sostituzione di un carattere specifico in tantissime parole.

    Grazie ancora
    Far



  • di Vecchio Frac data: 25/11/2012 20:48:07

    Il codice qui sotto è il prototipo del codice per scorrere una cartella di file e restituisce in una finestra di messaggio ogni file Excel (xls) che trova. E' un prototipo per farti vedere come funziona (anche se funziona correttamente).

    Sulla ricerca, la funzione VBA Replace funziona in quel modo su un termine di ricerca alla volta all'interno del codice; per sostituire testo presente nelle celle del foglio devi dare un'occhiata alla funzione di Excel omonima Replace:

    range.Replace(What, Replacement, LookAt, SearchOrder, MatchCase, MatchByte, SearchFormat, ReplaceFormat)





  • di Vecchio Frac data: 25/11/2012 20:48:44

    Ho dimenticato il codice allegato ^_^
     
    Option Explicit
    
    Sub scorri_files()
    Dim fso, cartella, cartelle, sottocartella, sottocartelle, un_file
    
        Set fso = CreateObject("Scripting.FileSystemObject")
        For Each cartella In fso.GetFolder(ThisWorkbook.Path).subFolders
            For Each un_file In cartella.Files
                If Right(un_file.Name, 3) = "xls" Then
                    MsgBox "Trovato file xls: " & un_file.Name
                End If
            Next
        Next
    End Sub
    






  • di Far2012 (utente non iscritto) data: 25/11/2012 21:07:22

    grazie della risposta.
    per quanto riguarda la ricerca, consulterò le funzioni Excel.
    per quanto riguarda il codice per le cartelle, ho creato il file ma mi sembra che non funziona, perché non ricevo una finestra di messaggio. O forse ho sbagliato io? Allego il file

    Grazie



  • di Vecchio Frac data: 25/11/2012 22:45:47

    Il codice è ok, perchè funzioni devono esserci due condizioni:
    - ci sia almeno una sottocartella nel percorso dove si trova il file Excel che contiene questa macro;
    - che in detta sottocartella ci sia almeno un file di estensione xls da mostrare.

    Le istruzioni coinvolte sono:
    fso.GetFolder(ThisWorkbook.Path).SubFolders ---> punta al percorso di dove si trova lo stesso file da cui lanci la macro e ne recupera tutte le sottocartelle

    If Right(un_file.Name, 3) = "xls" Then ---> se l'estensione del file contenuto in questa sottocartella è "xls" allora...

    significa che naturalmente se i tuoi file hanno estensione "xlsx" devi cambiare l'istruzione nel modo appropriato!
    L'avevo ben detto che era un prototipo... significa che va adattato alle esigenze :)