Velocizzare copia formule



  • Velocizzare copia formule
    di Fabio (utente non iscritto) data: 10/02/2015 22:30:52

    Buonasera, ho la necessità di copiare delle formule per estrarre dei dati da fogli diversi.
    Essendo numerose le righe dove copiare le formule, l'operazione è lenta.
    Ho provato sia con il CercaVert sia con Scarto Confronta, ma il risultato non cambia.
    Anche disattivando il calcolo automatico, quando lo riattivo l'operazione è lenta.
    Qualcuno ha qualche suggerimento per velocizzare la copia delle formule?
    Allego un file con i dati indispensali per capire il problema.
    Grazie e buona serata.



  • di Lucas87 data: 11/02/2015 10:51:04

    Ciao
    Copiare così tante celle con formule è da pazzi...
    Spiega cosa dovrebbero fare le formule in modo da poter trovare una soluzione.



  • di Fabio (utente non iscritto) data: 11/02/2015 11:21:54

    Ciao Lucas87,
    cerco di spiegarlo....
    devo cercare il valore della cella A4 del Foglio POL, nei valori della colonna C - Foglio TIT.
    Se lo trova mi deve restituire (nella cella C4 - Foglio POL) il valore della corrispondente riga - colonna J Foglio TIT; se non lo trove mi deve restituire 0
    Con il CercaVert sarebbe: CERCA.VERT(A4;TIT!$C$3:$AO$17000;34;0) con l'aggiunta se non trova il valore .....
    Naturalmente questo va riprodotto per più colonne.
    Grazie e buona giornata.



  • di Vecchio Frac data: 11/02/2015 13:37:43

    Io ho impostato le formule trovate nel foglio assegnandole di botto al range C3:C17000, D3:D17000 e così via. Il miglioramento nell'esecuzione è irrilevante (siamo nell'ordine di una cinquantina di secondi per entrambe le versioni, quella del codice di copiaincolla originale e il mio).
    Probabilmente risulta più veloce andare di Find e Offset ma ancora non ho provato.





  • di Fabio (utente non iscritto) data: 11/02/2015 14:39:11

    Innanzitutto grazie per la risposta.
    non ho capito se il tuo codice l'hai inserito nel file o se devo farlo io.
    Per non sbagliare, puoi mettermi il tuo codice che hai provato?
    Grazie



  • di Vecchio Frac data: 11/02/2015 15:23:01

    Ehm... l'ho eliminato senza salvare, tanto non c'era miglioramento di prestazione ^_^





  • di isy (utente non iscritto) data: 11/02/2015 20:34:32

    Se si ordinano prima i dati su foglio: TIT, è possibile utilizzare la versione di ricerca binaria VLOOKUP che sarà molto veloce

    Il risultato compare in un paio di secondi.

    In cella L4 inserisco la formula: =SE(CERCA.VERT($A4;TIT!$C$3:$C$16469;1;VERO)=$A4;CERCA.VERT($A4;TIT!$C$3:AJ$16469;34;VERO);"")




     
    Option Explicit
    
    Sub VlookupK()
    
        Dim lr                    As Long
        Dim tr                    As Long
    
        With Application
            .ScreenUpdating = False
            .Calculation = xlCalculationManual
            .EnableEvents = False
        End With
        ActiveSheet.DisplayPageBreaks = False
        lr = Range("A" & Rows.Count).End(xlUp).Row
        tr = Sheets("TIT").Range("C" & Rows.Count).End(xlUp).Row
        
        With Range("L4:L" & lr)
            .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[24],34,TRUE),0)"
            .Value2 = .Value2
        End With
        With Range("M4:M" & lr)
            .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[25],35,TRUE),0)"
            .Value2 = .Value2
        End With
        With Range("N4:N" & lr)
            .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[26],36,TRUE),0)"
            .Value2 = .Value2
        End With
        With Range("O4:O" & lr)
            .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[27],37,TRUE),0)"
            .Value2 = .Value2
        End With
        With Range("P4:P" & lr)
            .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[28],38,TRUE),0)"
            .Value2 = .Value2
        End With
        With Range("Q4:Q" & lr)
            .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[29],39,TRUE),0)"
            .Value2 = .Value2
        End With
        With Range("R4:R" & lr)
            .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[30],40,TRUE),0)"
            .Value2 = .Value2
        End With
        With Application
            .EnableEvents = True
            .Calculation = xlCalculationAutomatic
            .ScreenUpdating = True
        End With
    
    End Sub
    



  • di Fabio (utente non iscritto) data: 11/02/2015 21:39:09

    Eccccezzzzzzzziunale........
    spero di riuscire a sfruttare il tuo suggerimento anche per altri fogli.
    Ti disturberò se avrò bisogno di qualche chiarimento.
    Grazie infirnite e buona serata.



  • di Fabio (utente non iscritto) data: 12/02/2015 22:19:48

    Ciao isy
    come previsto ho ancora bisogno di aiuto.
    Sto utilizzando il tuo codice per altre colonne e avrei la necessità di inserire una lettera (X) se non trova il valore cercato.
    Ho modificato la tua riga (vedi prima riga sotto con la seconda) ma non funziona.
    Ho prvato anche mettendo "X" ma va in errore.
    Come va indicata la lettera che voglio inserire?
    Grfazie ancora
    buona serata
     
    .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[24],34,TRUE),0)"
    
    .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[24],34,TRUE),X)"



  • di isy data: 12/02/2015 22:56:45

    Cit: Come va indicata la lettera che voglio inserire?
    Per inserire testo devi utilizzare 4 Apici.

     
    'Per non inserire alcun testo:
    .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[24],34,TRUE),"""")"
    
    'Per aggiungere testo:
    .FormulaR1C1 = "=IF(VLOOKUP(RC1,TIT!R3C3:R" & tr & "C3,1,TRUE)=RC1,VLOOKUP(RC1,TIT!R3C3:R" & tr & "C[24],34,TRUE),""x"")"



  • di Fabio (utente non iscritto) data: 12/02/2015 23:33:31

    Perfetto
    Grazie



  • di Fabio (utente non iscritto) data: 13/02/2015 22:15:56

    Ciao isy, è un po' che provo e riprovo a trasformare in R1C1 una semplice formula =SE(E(J12=1;K12;2);1;SE(E(M12=1;N12;2);2;99)) ma senza riuscirci.
    Ho anche cercato in internet ma non ho trovato nulla. Sai anche consigliarmi dove posso trovare delle indicazioni sulle corrispondenze tra le le formule excel con le formule in R1C1.
    Grazie



  • di isy data: 13/02/2015 22:44:03

    Cit:
    è un po' che provo e riprovo a trasformare in R1C1 una semplice formula =SE(E(J12=1;K12;2);1;SE(E(M12=1;N12;2);2;99)) ma senza riuscirci.

    Per ottenere la formula da utilizzare attiva il registratore macro
    Si tratta di seguire alcune semplici regole
    Nel mio caso ho preso spunto da pochi esempi e li ho adattati in funzione delle necessità.

    Apri un nuovo post per la tua richiesta, tutti potranno suggerirti la soluzione migliore al caso
    Allega se necessario un file d'esempio