Errore runtime overflow



  • Errore runtime overflow
    di Mauro (utente non iscritto) data: 17/01/2013 14:40:40

    Ciao a tutti, nella seconda parte del codice riportato sotto da errore di run-time '6': OVERFLOW, nelle informazioni il risultato di un'assegnazione, di un calcolo o di una conversione del tipo di dati ha dimensioni troppo grandi per poter essere rappresentato nell'intervallo di valori consentito per il tipo specifico di variabile, ma nel caso dalla seconda alla quarta parte del codice è ancora a zero.
    Ringrazio in anticipo.
    Mauro
     
    Private Sub Worksheet_Activate()
    Dim a As Double, b As Double, c As Double
    Dim mediaprimo As Double, media1 As Double, media2 As Double, media3 As Double
    media1 = 0
    media2 = 0
    media3 = 0
    For a = 8 To 38
    media1 = media1 + Cells(a, 3)
    Next
    For b = 44 To 74
    media2 = media2 + Cells(b, 3)
    Next
    For c = 80 To 110
    media3 = media3 + Cells(c, 3)
    Next
    mediaprimo = (media1 + media2 + media3) / Cells(2, 7)
    Cells(2, 5) = mediaprimo
    
    Dim d As Double, e As Double, f As Double
    Dim mediasecondo As Double, media4 As Double, media5 As Double, media6 As Double
    media4 = 0
    media5 = 0
    media6 = 0
    For d = 116 To 146
    media4 = media4 + Cells(d, 3)
    Next
    For e = 152 To 182
    media5 = media5 + Cells(e, 3)
    Next
    For f = 188 To 218
    media6 = media6 + Cells(f, 3)
    Next
    mediasecondo = (media4 + media5 + media6) / Cells(3, 7)
    Cells(3, 5) = mediasecondo
    
    Dim g As Double, h As Double, i As Double
    Dim mediaterzo As Double, media7 As Double, media8 As Double, media9 As Double
    media7 = 0
    media8 = 0
    media9 = 0
    For g = 224 To 254
    media7 = media7 + Cells(g, 3)
    Next
    For h = 260 To 290
    media8 = media8 + Cells(h, 3)
    Next
    For i = 296 To 326
    media9 = media9 + Cells(i, 3)
    Next
    mediaterzo = (media7 + media8 + media9) / Cells(4, 7)
    Cells(4, 5) = mediaterzo
    
    Dim l As Double, m As Double, n As Double
    Dim mediaquarto As Double, media10 As Double, media11 As Double, media12 As Double
    media10 = 0
    media11 = 0
    media12 = 0
    For l = 332 To 362
    media10 = media10 + Cells(l, 3)
    Next
    For m = 368 To 398
    media11 = media11 + Cells(m, 3)
    Next
    For n = 404 To 434
    media12 = media12 + Cells(n, 3)
    Next
    mediaquarto = (media10 + media11 + media12) / Cells(5, 7)
    Cells(5, 5) = mediaquarto
    
    End Sub



  • di Vecchio Frac data: 17/01/2013 17:53:37

    Il tipo di dati Double rappresenta un numero con la massima capacità possibile perchè memorizza numeri a 64 bit.
    Quindi è praticamente impossibile sforare con un overflow questa capacità.
    C'è sicuramente qualcosa che sfugge... a cominciare dalla riga esatta di dove si verifica l'errore. Dire "la seconda parte del codice" non vuol dire niente.
    E (per inciso) se questi calcoli riguardano il calcolo di una "media", puoi evitare di farlo a mano ciclando per ogni cella del range e calcolando la media dividendo il risultato per il numero dei valori.
    Puoi invece utilizzare direttamente la funzione che calcola la media (worksheetfunction.Median) (ammesso che in G2 ci sia il numero di valori totali sui quali calcolare la media):
    (questo calcolerebbe mediaprimo)
    [E2] = worksheetfunction.Median([C8:C38,C44:C74,C80:C110]

    Con quattro righe di codice e neanche una variabile risparmi un sacco di cicli For.




  • Errore runtime overflow
    di Mauro (utente non iscritto) data: 17/01/2013 18:25:51

    Ho riscritto il codice, se al momento non ho nessun dato nelle celle C........, mi da errore di run-time'1004': impossibile trovare la proprietà median per la classe worksceetfunction. mentre se inserisco dei dati è ok.
     
    Private Sub Worksheet_Activate()
    [E2] = WorksheetFunction.Median([C8:C38,C44:C74,C80:C110])
    [E3] = WorksheetFunction.Median([C116:C146,C152:C182,C188:C218])
    [E4] = WorksheetFunction.Median([C224:C254,C260:C290,C296:C326])
    [E5] = WorksheetFunction.Median([C332:C362,C368:C398,C404:C434])
    End Sub



  • di HarryBosch data: 17/01/2013 18:29:59

    Secondo me si può risolvere come sotto...
    Controlla che poi ti spiego i passaggi se effettivamente esegue quanto voluto
     
    Sub prova_questa()
        Dim tot As Long, i As Integer, riga As Integer, r As Integer
        riga = 8
        For i = 1 To 12
            tot = tot + WorksheetFunction.Sum(Range(Cells(riga, 3), Cells(riga + 30, 3)))
            riga = riga + 36
            If i Mod 3 = 0 Then
                Cells(r + 2, 5) = tot / Cells(r + 2, 7)
                r = r + 1
                tot = 0
            End If
        Next i
    End Sub



  • di Vecchio Frac data: 17/01/2013 18:35:00

    cit. "se al momento non ho nessun dato nelle celle C........, mi da errore di run-time'1004'"
    ---> Sono d'accordo con Excel questa volta :)
    Puoi intercettare l'errore con On Error e quindi scivolare via nel caso di celle vuote o non compilate correttamente.
    Il codice di HarryBosch va bene ed è piuttosto smart, ed è pure compatto come piace a me ;) solo che non sono sicuro che Long sia il tipo di dati adatto, se ci sono dei numeri con virgola, ce la perdiamo.
    Ma non sappiamo quali sono i dati in gioco :)





  • Errore runtime overflow
    di Mauro (utente non iscritto) data: 17/01/2013 18:42:30

    Ho provato anche questa, se ho dei dati funziona, mentre se ho ancora le celle vuote mi da errore di run-time'6':
    overflow


  • Errore runtime overflow
    di Mauro (utente non iscritto) data: 17/01/2013 18:48:50

    I dati hanno il numero con la virgola max 999,00



  • di HarryBosch data: 17/01/2013 18:51:06

    Si, mi è rimasto quel "Long" ma in effetti è da sostituire con Double per i decimali.
    La routine va in errore quando dividi per 0 o nulla visto che non è possibile; puoi controllare l'errore e continuare con il resto. L'eventuale casella rimane vuota.
    Vedi ora
     
    Sub prova_questa()
        Dim tot As Double, i As Integer, riga As Integer, r As Integer
        riga = 8
        For i = 1 To 12
            tot = tot + WorksheetFunction.Sum(Range(Cells(riga, 3), Cells(riga + 30, 3)))
            riga = riga + 36
            If i Mod 3 = 0 Then
                On Error Resume Next
                Cells(r + 2, 5) = tot / Cells(r + 2, 7)
                r = r + 1
                tot = 0
            End If
        Next i
    End Sub
    


  • Errore runtime overflow
    di Mauro (utente non iscritto) data: 17/01/2013 19:44:56

    è perfetta (me la spieghi)

    Grazie

    Mauro



  • di HarryBosch data: 18/01/2013 00:57:04

    Come vedi ho utilizzato un ciclo solo; possibile in quanto i dati sono disposti in intervalli regolari. Infatti, hai 12 gruppi di numeri di cui determini le somme: ogni gruppo è composto da 30 righe di dati e ogni gruppo è distanziato dal successivo di 5 celle.

    Quindi, con un unico ciclo da 1 a 12 puoi selezionare tutti i gruppi: For i = 1 To 12
    Per ogni gruppo calcolo il totale: WorksheetFunction.Sum(Range(Cells(riga, 3), Cells(riga + 30, 3)))
    L'intervallo del gruppo è dato dal Range: Cells(riga, 3), Cells(riga + 30, 3)
    dove riga parte da 8 (primo gruppo) e termina dopo 30 righe: riga + 30

    Aumento la variabile riga di 36 perché è lo stacco per arrivare al successivo intervallo.
    riga = riga + 36

    Se il ciclo è un multiplo di 3 (perché ogni 3 gruppi calcoli il rapporto): If i Mod 3 = 0 Then
    allora riporto nella cella E2 il rapporto tra il totale dei 3 gruppi trovati e il valore in G2:
    Cells(r + 2, 5) = tot / Cells(r + 2, 7)
    e resetto il tot perché per i prossimi 3 gruppi calcolerò una nuova somma: tot = 0

    Non so se sono riuscito a farmi capire; eventualmente ti consiglio comunque di passare il codice rigo per rigo con il debug, per verificarne i valori assunti ad ogni passaggio.