Ciclo For particolarmente lungo



  • Ciclo For particolarmente lungo
    di prestige89 (utente non iscritto) data: 26/04/2014 19:11:48

    Sto riscontrando un problema che non mi è mai capitato prima. Ho una serie di 3 cicli annidiati per creare delle percentuali. In tutto vengono analizzate circa un milione e mezzo di celle e create delle percentuali. Questo viene, appunto, gestito con 3 cicli for annidiati. Ora, se eseguo il codice in modalità debud andando step by step funziona tutto alla perfezione. Se però lancio il programma, si blocca nei cicli for e compare la scritta "Non risponde".... c'è un modo per ovviare a questo problema? Non penso sia problemi di RAM, ne vedo ancora qualche GB libero in memoria....
     
    'creo le percentuali su tutti i foglio del nostro file
    Sub Percentuali(file As String)
        Dim foglio As String
        Dim yes As Long
        Dim par As Long
        Dim err As Long
        
        Workbooks(file).Activate
        
        OCIDELTAminore = 3
        OCIQUOTAminore = 79
        OCIDELTAmagg = 155
        OCIQUOTAmagg = 231
        OCIAGGIO = 307
        OCIBFAMNT = 383
        POSIZIONEy = 132
        POSIZIONEp = 197
        POSIZIONEerr = 262
        
        
        
        Worksheets(foglio).Activate
        For i = 1 To 52     'scorro tutti e 52 i fogli
            foglio = fasce(i, 1) & " - " & fasce(i, 2)  'creo il nome del foglio che voglia andare ad analizzare
            For riga = 3 To 455     'scorro le 455 righe di ogni foglio
                For colonna = 2 To 64   'scorro le 62 colonne di ogni foglio
                    yes = 0
                    par = 0
                    err = 0
                    If Worksheets(foglio).Cells(riga, colonna) = "" Then riga = riga + 3
                    yes = Worksheets(foglio).Cells(riga, POSIZIONEy + colonna - 2)
                    par = Worksheets(foglio).Cells(riga, POSIZIONEp + colonna - 2)
                    err = Worksheets(foglio).Cells(riga, POSIZIONEerr + colonna - 2)
                    If yes = 0 And par = 0 And err = 0 Then
                        Worksheets(foglio).Cells(riga, colonna) = "-"
                        Worksheets(foglio).Cells(riga, colonna + 65) = "-"
                      Else
                        Worksheets(foglio).Cells(riga, colonna) = yes / (yes + par + err)
                        Worksheets(foglio).Cells(riga, colonna + 65) = (yes + par) / (yes + par + err)
                    End If
                Next colonna
            Next riga
        Next i
    
    End Sub



  • di Zer0Kelvin data: 27/04/2014 14:13:26

    Ciao.
    Ci sono alcune variabili non dichiarate ed un misterioso array Fasce di cui non conosciamo il contenuto.
    Intanto prova a modificare così il codice e vediamo che succede.
    Spero che tu non abbia infilato un "On Error ..." da qualche parte.
     
    Option Explicit
    
    Sub Percentuali(file As String)
    Const POSIZIONEy = 132
    Const POSIZIONEp = 197
    Const POSIZIONEerr = 262
    
    Dim foglio As String
    Dim yes As Long, par As Long, err As Long
    Dim i As Long, riga As Long, colonna As Long
        
        For i = 1 To 52     'scorro tutti e 52 i fogli
            foglio = fasce(i, 1) & " - " & fasce(i, 2)  'creo il nome del foglio che voglia andare ad analizzare
            With Workbooks(file).Sheets(foglio)
                For riga = 3 To 455     'scorro le 455 righe di ogni foglio
                    For colonna = 2 To 64   'scorro le 62 colonne di ogni foglio
                        If .Cells(riga, colonna) = "" Then riga = riga + 3
                        yes = .Cells(riga, POSIZIONEy + colonna - 2)
                        par = .Cells(riga, POSIZIONEp + colonna - 2)
                        err = .Cells(riga, POSIZIONEerr + colonna - 2)
                        If yes = 0 And par = 0 And err = 0 Then
                            .Cells(riga, colonna) = "-"
                            .Cells(riga, colonna + 65) = "-"
                          Else
                            .Cells(riga, colonna) = yes / (yes + par + err)
                            .Cells(riga, colonna + 65) = (yes + par) / (yes + par + err)
                        End If
                    Next colonna
                Next riga
            End With
        Next i
    End Sub
    



  • di prestige89 (utente non iscritto) data: 27/04/2014 16:21:20

    FUNZIONA! Non so come tu abbia fatto, ma grazie davvero. Ti offrirei pure un caffè... ma qui sul forum mi risulta parecchio difficile! =)

    Cmq, per chiarire, array Fasce è un array dichiarato come (1 to 52, 1 to 2) ed è Public, perchè mi serve richiamarlo in altre funzioni, e (colpa mia che non le ho riportate), quelle non dichiarate erano tutte Public. Quello che non avevo dichiarato erano le "i", "riga" e "colonna", cosa che tu hai saggiamente corretto invece. E no, non avevo messo alcun "On error" nel codice.

    Grazie davvero =)



  • di Zer0Kelvin data: 27/04/2014 17:57:49

    Beh, a caval donato non si guarda in bocca e tutto è bene ciò che finisce bene!