macro lentissima



  • macro lentissima
    di camacio (utente non iscritto) data: 17/11/2015 14:41:35

    Salve, ho seriamente bisogno di risolvere la lentezza assurda di una macro.
    Premetto che sono un novellino autodidatta da circa 10 giorni.
    Il tempo richiesto per acquisire elaborare e copiare una riga è di circa 1,8 secondi. (Windows 2007-excel 2010 -ram 4 giga)
    Spiego meglio il lavoro che devo fare:
    I fogli di lavoro sono due:
    Il principale dove elaboro i dati "COPIAPOISSON"
    Il secondorio foglio dove riporto i risultati elaborati "COPIARISULTATIPOISSON"
    Poi ho un database di 36 fogli(stessa cartella di lavoro) che riportano tutte la partite di calcio con relativi risultati, da qui carico i dati del campionato .

    Inizio ad assegnare alla cella B1 il nome del foglio (esempio ITALIA2010) a questo punto con delle formule all'interno del foglio COPIAPOISON si assegnano automaticamene, a delle celle, i dati necessari x il calcolo(squadra A squadraB goal ecc).

    Inizio ad assegnare di volta in volta i valori alle due celle AD1 e AE1.
    Di seguito sempre con con delle formule, viene copiato il valore di AD1 e AE1 in altre celle dello stesso foglio, inizia l'elaborazione (formula di Poisson) che restituisce un risultato nell'intervallo OJ572:OY572.
    Questo risultato ottenuto lo copio nell'intervallo AF2:AU2 ( questo è il 1° risultato di 380 del campionato ITALIA2010) dello stesso foglio.
    Ottenuti tutti i 380 risultati calcolo la Media e la copio in un'altro foglio ("COPIARISULTATIPOISSON").
    Il ciclo riparte con un'altro campionato.

    Ho già provato ad utilizzare queste due funzioni ma nessun risultato soddisfacente.
    Con il calcolo manuale non lavora bene cioè, mi copia sempre lo stesso valore e non fa elaborare le formule del foglio.
    Il problema sostanziale secondo me é che ogni volta che copio i risultati ottenuti dal 1° al 380° (OJ572:OY572) il foglio fa elaborare le formule x calcolare la media finale.


    Application.ScreenUpdating = False
    'Application.Calculation = xlCalculationManual


    Grazie

     
    Sub copiaFREQUENZEPOISSON()
    Dim r As Integer, y As Integer, A As Variant, B As Integer,C As Integer
    Application.ScreenUpdating = False
    
    Sheets("COPIAPOISSON").Select
    A = 3
    C= 2
    
    
                                                  '--1° CICLO DI 6 CAMPIONATI X 6 NAZIONI 
    For r = 1 To 36
    Range("B1") = Cells(r + 1, 2)           '---assegno alla cella B1 nome e anno del primo campionato.Con delle formule collegate a questa cella carico tutte le partite con relativi risultati.
    
                                                 '-----------------------------------------INIZIO ISTRUZIONI X ELIMINARE DUPLICATI SQUADRE
    
        Range("E2:E61").Select
        Selection.Copy
        Range("B40").Select
        Selection.PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
        ActiveSheet.Range("$B$40:$B$99").RemoveDuplicates Columns:=1, Header:=xlNo
    
                                                    '-----FINE ELIMINA DUPLICATI----INIZIO CICLO ASSEGNAZIONE VALORE ALLE CELLE AD1,AE1
    B = Range("A1") 'numero di partite giocate in questo campionato, 380
    
    For y = 1 To B
    Range("AD1") = Cells(y + 1, 16) 'acquisisce di volta in volta tutti i 380 valori del relativo campionato caricato
    Range("AE1") = Cells(y + 1, 22) 'acquisisce di volta in volta tutti i 380 valori
                                                            --INIZIO FASE ELABORAZIONE SEMPRE STESSO FOGLIO
    
    Range("OJ572:OY572").Select      '----ottengo il risultato elaborato nell'intervallo  
                                                           
    Selection.Copy                     '--------copio il risultato nella cella AF2 dello stesso foglio
    Cells(C, 32).Select
        Selection.PasteSpecial Paste:=xlPasteValues
                                                                
                                        
       C = (1 + C)              
    Next Y
    
                                                             '----- FINE ASSEGNAZIONI DI TUTTI I 380 VALORI ALLE CELLE AD1 AE1'
    Range("dx485:if486").Select
                                                             '-----------'FINE FASE ELABORAZIONE OTTENGO RISULTATO CHE COPIERò NEL FOGLIO COPIARISULTATI POISSON
    
    Selection.Copy
    Sheets("COPIARISULTATIPOISSON").Select
    Cells(A, 1).Select
        Selection.PasteSpecial Paste:=xlPasteValues
     A = (2 + A)
     Sheets("COPIAPOISSON").Select
    
    Next r
    
    Application.ScreenUpdating = True
    'Application.Calculation = xlCalculationAutomatic
    End Sub



  • di camacio (utente non iscritto) data: 18/11/2015 14:11:34

    Qualcuno può aiutarmi a velocizzare questo codice???
    Grazie



  • di alfrimpa data: 18/11/2015 14:52:20

    Ciao

    Premetto che non mi candido a fornirti una soluzione (non sono abbastanza bravo) ma per poter far si che qualcuno possa aiutarti dovresti quanto meno allegare il tuo file per dare la possibilità a chi volesse risponderti di fare delle prove senza dover riscostruire da solo il file.

    Alfredo