Ciclo velocizzabile



  • Ciclo velocizzabile?
    di Cesare data: 19/07/2013 10:24:58

    Premetto che sto cominciando adesso a dilettarmi con VBA e sono proprio un principiante. Ho un file che aggiorno periodicamente con dei dati giornalieri che importo da un file txt. Filtro i dati lasciando solo gli ultimi 2 mesi (circa 15.700 righe) e lancio la macro (realizzata con notevole aiuto esterno) di aggiornamento. Attualmente impiega circa 2 minuti. Secondo voi è velocizzabile? Tra l'altro ho notato che se la macro la lancio senza aver prima filtrato i dati e quindi con circa 72.000 righe, impiega quasi lo stesso tempo, la differenza è veramente di pochissimi secondi.

    Già che ci siamo, vorrei inserire una progress bar e ho letto in giro qualche post. Nessun problema per creare la form, ma non sono riuscito a capire in quale parte del codice esattamente richiamarla.

    Grazie anticipatamente per l'aiuto.
     
    Dim UC As Integer, UR As Long, RR As Long, I As Long, J As Long, K As Long, Trovato As Integer
        Dim Ws1 As Worksheet, Ws2 As Worksheet
        Dim Matrice1(), Inizio As Double, Sostituiti As Long, Ricalcolo As Variant
            
        Inizio = Timer
        Ricalcolo = Application.Calculation
        Application.Calculation = xlCalculationManual
        Application.ScreenUpdating = False
        Set Ws1 = Sheets("BE_Fatt")
        Set Ws2 = Sheets("Dati_Importati")
        UR = Ws2.Range("A" & Rows.Count).End(xlUp).Row
        UC = Ws1.Range(Ws1.Cells(1, Columns.Count).Address).End(xlToLeft).Column
        Matrice1 = Ws2.Range(Ws2.Cells(1, 1), Ws2.Cells(UR, 3))
        Sostituiti = 0
        UR = Ws1.Range("L" & Rows.Count).End(xlUp).Row
        UC = Ws1.Range(Ws1.Cells(1, Columns.Count).Address).End(xlToLeft).Column
        For I = 2 To UBound(Matrice1)
            If Application.WorksheetFunction.CountIf(Ws1.Range("M100:M" & UR), Matrice1(I, 2)) > 0 Then
                For J = 100 To UR
                ProgressBar.Show
                    If Ws1.Cells(J, "M") = Matrice1(I, 2) Then
                        For K = 14 To UC
                            If Ws1.Cells(5, K) = Matrice1(I, 1) Then
                                Ws1.Cells(J, K) = Matrice1(I, 3)
                                Sostituiti = Sostituiti + 1
                                Exit For
                            End If
                        Next K
                        Exit For
                    End If
                Next J
             End If
        Next I
        Application.ScreenUpdating = True
        Application.Calculation = Ricalcolo
        If Sostituiti > 0 Then
            MsgBox "Elaborazione effettuata.  " & vbCrLf & vbCrLf & "Sostituiti: " & Sostituiti & " dati in   '" & Format(Timer - Inizio, "0.00") & "'  Secondi"
        Else
            MsgBox "Non sono stati trovati dati da sostituire", vbCritical
        End If
        Set Ws1 = Nothing
        Set Ws2 = Nothing
        Application.ScreenUpdating = True



  • di Vecchio Frac data: 19/07/2013 16:18:43

    Il problema è andare un po' alla cieca, cercando di ottimizzare un codice che in astratto gira benissimo, ma che non possiamo verificare perchè manca una base dati reale.
    I For nidificati per esempio potrebbero forse essere evitati, ma a dire il vero sono in difficoltà anche perchè non riporti la sub completa (manca la firma della routine).




  • ciclo velocizzabile?
    di Cesare (utente non iscritto) data: 19/07/2013 17:01:14

    Intanto grazie per la risposta, ho allegato il file ripulito di dati sensibili e ridotto per questioni di grandezza.
    Nel foglio "Dati_importati" ho già filtrato i dati lasciandone solo una parte, da lì si lancia la macro.
    Naturalmente la stessa chiederà nuovamente se si vuole filtrare.
    Grazie per l'aiuto