+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Macro combinata word/excel per ricerca stringhe

  1. #1
    loirent non è in linea Novello
    Post
    3

    Post Macro combinata word/excel per ricerca stringhe

    Ciao a tutti, non sono un esperto di programmazione,

    mi trovo a dover modificare una macro già esistente.
    Ho 2 file, uno word e uno Excel. La macro che ho è su file word.
    Tale prende una colonna di valori da Excel e li cerca su un file word.
    Per ogni valore della cella di Excel la stringa viene ricercata nel file word e se trovata viene evidenziata di blu; e questo mi va bene.
    Quello che mi manca e che non riesco ad implementare è una modifica alla macro che, nella parte Excel mi evidenzi di blu (ma anche un altro colore è uguale) le celle per le quali il contenuto è stato trovato nel file word.

    Per fare un esempio pratico, se io ho un testo word in cui ho:

    "Oggi Antonio è andato a casa di Giovanni"

    e un file Excel in cui ho

    "Pippo; Pluto; Giovanni; Antonio"

    Attualmente lanciando la macro

    "Oggi Antonio è andato a casa di Giovanni"

    e il file Excel inalterato

    "Pippo; Pluto; Giovanni; Antonio"

    Quello che vorrei in più è:

    "Oggi Antonio è andato a casa di Giovanni"

    e il file Excel con anch'esso i campo evidenziati

    "Pippo; Pluto; Giovanni; Antonio"

    Come posso modificare la mia macro word? Oppure mi va bene anche una seconda macro da mettere su il file Excel da lanciare in un secondo momento ma tale che il risultato finale sia quello qui sopra.

    codice:
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    
    Sub Importa()
     
    'Dichiaro le variabili locali
    Dim ValoreCella As String
    Dim ValoreCella2 As String
    Dim i As Integer
     
    Dim r As Range
    
    'Creo la nuova applicazione
    Set xlApp = New Excel.Application
     
    'Attraverso la nuova applicazione apro il Workbook
    'assegnandolo alla variabile oggetto xlBook
    Set xlBook = xlApp.Workbooks.Open("C:\Users\loirent\Desktop\xxx\ciao.xlsx")
    
    'Decido quale foglio utilizzare
    Set xlSheet = xlBook.Worksheets("Foglio1")
     
    'Instauro un ciclo per prendere, una alla volta, il
    'valore dalle prime x celle della prima colonna,
    'passandole sul documento Word
    For i = 1 To 4
        ValoreCella = xlSheet.Cells(i, 1).Value
        'Application.Selection.TypeText ValoreCella & vbCrLf
        ValoreCella2 = xlSheet.Cells(i, 1).Value
        Set r = ActiveDocument.Range '.Range(Start:=ActiveDocument.Bookmarks("inipag2").Range.Start, End:=ActiveDocument.Bookmarks("finepag2").Range.End)
        r.Select
        
        With Selection.Find
            '.ClearFormatting
            .Text = ValoreCella
            '.Replacement.ClearFormatting
             With .Replacement
                .ClearFormatting
                .Font.ColorIndex = wdBlue
                .Text = ValoreCella2
             End With
            .Execute Replace:=wdReplaceAll, Forward:=True, _
                Wrap:=wdFindContinue
            '.Replacement.Text = ValoreCella2
            '.Execute Replace:=wdReplaceAll, Forward:=True, _
                Wrap:=wdFindContinue
        End With
    Next i
     
    'Chiudo il Workbook e l'Applicazione
    xlBook.Close
    xlApp.Quit
     
    'Annullo le variabili per liberare le risorse
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    End Sub
    Ultima modifica di AntonioG; 02-12-2015 09:24  Motivo: Tag CODE

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,925
    Blogs
    5
    Quando posti del codice utilizza i tag CODE. Dai una lettura al regolamento anche per quello che riguarda la questione "pappa pronta".

    Hai provato a fare qualcosa con il codice?
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    loirent non è in linea Novello
    Post
    3
    Hai ragione, ho sbagliato. Adesso provo ad andare nello specifico del codice
    Con riferimento al ciclo for, nel quale io scorro le celle del file Excel, viene effettuata la sostituzione della stringa nel file word (Word 2013)
    codice:
     
    For i = 1 To 4
        ValoreCella = xlSheet.Cells(i, 1).Value
        ValoreCella2 = xlSheet.Cells(i, 1).Value
        Set r = ActiveDocument.Range 
        r.Select    
        With Selection.Find      
            .Text = ValoreCella    
             With .Replacement
                .ClearFormatting
                .Font.ColorIndex = wdBlue
                .Text = ValoreCella2
             End With
            .Execute Replace:=wdReplaceAll, Forward:=True, _
                Wrap:=wdFindContinue            
                Wrap:=wdFindContinue
        End With
    Next i
    però questo avviene nel file word, ossia nel file nel quale è implementata la macro.
    Non capisco però come referenziare la cella Excel per colorarne il testo e non so neanche se sia possibile modificare il file Excel se la macro gira sul file word.

    Ho provato a inserire la modifica nel ciclo for, così, ma non funziona;
    Controllando con il debug, l'istruzione viene eseguita nel ciclo, la cella non viene modificata e anzi l'applicazione non viene chiusa per cui la macro non termina mai, il file word è bloccato e devo chiudere word col task manager

    codice:
    xlSheet.Cells(i, 1).Font.ColorIndex = wdBlue
    Ma è possibile modificare il file Excel da una macro word?
    Ultima modifica di loirent; 03-12-2015 08:27 

  4. #4
    PaoloTalini non è in linea Scribacchino
    Luogo
    Pontedera (PI)
    Post
    862
    loirent ;
    Ma è possibile modificare il file Excel da una macro word?
    Si.
    Il codice che proponi, migliorabile, apre/legge/chiude il file Excel; potrebbe anche modificarlo.
    codice:
    For i = 1 To 4
        ValoreCella = xlSheet.Cells(i, 1).Value
        ValoreCella2 = xlSheet.Cells(i, 1).Value
        Set r = ActiveDocument.Range 
        r.Select    
        With Selection.Find      
            .Text = ValoreCella    
             With .Replacement
                .ClearFormatting
                .Font.ColorIndex = wdBlue
                .Text = ValoreCella2
             End With
            .Execute Replace:=wdReplaceAll, Forward:=True, _
                Wrap:=wdFindContinue            
                Wrap:=wdFindContinue
        End With
    Next i
    Dichiari due variabili uguali e ne usi una.
    La selezione di una cella e/o intervallo rallentano e rendono inefficiente il codice.

    Il codice :
    codice:
    xlSheet.Cells(i, 1).Font.ColorIndex = wdBlue
    Funzionerebbe se inserito in un contesto corretto. Dove lo hai inserito?
    Scrivi :
    codice:
    'assegnandolo alla variabile oggetto xlBook
    Set xlBook = xlApp.Workbooks.Open("C:\Users\loirent\Desktop\xxx\ciao.xlsx")
    Devi attivare il file Excel per modificarlo. In questo contesto, per non attivare/aprire Excel, sembra
    conveniente dichiarare una variabile che valorizzata all'interno del ciclo Word possa essere riversata
    sul file Excel prima della sua chiusura/salvataggio.
    P. Talini
    __________________________________________________ _______________________________________
    Tutti sanno che una cosa è impossibile da realizzare,
    finché arriva uno sprovveduto che non lo sa e la inventa. (Albert Einstein)

  5. #5
    loirent non è in linea Novello
    Post
    3
    L'assegnamento lo faccio all'interno del ciclo.
    Ma se lo lancio ovvero se eseguo il codice qua sotto mi va in ciclo infinito.

    Seleziono male il file Excel?
    Oppure sbaglio a fare l'assegnamento?

    codice:
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    
    Sub Importa()
     
    'Dichiaro le variabili locali
    Dim ValoreCella As String
    Dim ValoreCella2 As String
    Dim i As Integer
     
    Dim r As Range
    
    
    
     
    'Creo la nuova applicazione
    Set xlApp = New Excel.Application
     
    'Attraverso la nuova applicazione apro il Workbook
    'assegnandolo alla variabile oggetto xlBook
    Set xlBook = xlApp.Workbooks.Open("C:\Users\loirent\Desktop\xxx\ciao.xlsx")
    
    
     
    'Decido quale foglio utilizzare
    Set xlSheet = xlBook.Worksheets("Foglio1")
     
    'Instauro un ciclo per prendere, una alla volta, il
    'valore dalle prime x celle della prima colonna,
    'passandole sul documento Word
    For i = 1 To 4
        ValoreCella = xlSheet.Cells(i, 1).Value
        'Application.Selection.TypeText ValoreCella & vbCrLf
        ValoreCella2 = xlSheet.Cells(i, 1).Value
        Set r = ActiveDocument.Range '.Range(Start:=ActiveDocument.Bookmarks("inipag2").Range.Start, End:=ActiveDocument.Bookmarks("finepag2").Range.End)
        r.Select
        
        With Selection.Find
            '.ClearFormatting
            .Text = ValoreCella
            '.Replacement.ClearFormatting
             With .Replacement
                .ClearFormatting
                .Font.ColorIndex = wdBlue
                .Text = ValoreCella2
             End With
            .Execute Replace:=wdReplaceAll, Forward:=True, _
                Wrap:=wdFindContinue
            '.Replacement.Text = ValoreCella2
            '.Execute Replace:=wdReplaceAll, Forward:=True, _
                Wrap:=wdFindContinue
            
        End With
        xlSheet.Cells(i, 1).Font.ColorIndex = wdBlue
    Next i
     
    'Chiudo il Workbook e l'Applicazione
    xlBook.Close
    xlApp.Quit
     
    'Annullo le variabili per liberare le risorse
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
      
     
    End Sub

  6. #6
    PaoloTalini non è in linea Scribacchino
    Luogo
    Pontedera (PI)
    Post
    862
    loirent;

    Il codice proposto esegue un ciclo 'For i = 1 To 4' sul file Excel e un metodo 'Find' sul file word.
    (sembra parte di un codice da manuale)

    Probabilmente il metodo usato trattiene/blocca il file Word entrando in un ciclo infinito.
    Suppongo che il codice iniziale funzionasse.
    Potresti usare tale codice implementandolo con una variabile indicizzata.
    Valorizza la variabile dal file Word come evento del metodo Find.
    Usa tale variabile per formattare/valorizzare il risultato della ricerca sul file Excel prima di salvarlo/chiuderlo.

    Procedere per piccoli passi, eseguire il Debug del codice, è il metodo da usare per risolvere.
    P. Talini
    __________________________________________________ _______________________________________
    Tutti sanno che una cosa è impossibile da realizzare,
    finché arriva uno sprovveduto che non lo sa e la inventa. (Albert Einstein)

+ Rispondi al Thread

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi