Il giorno mercoledì 8 luglio 2015 11:13:12 UTC+2, Bruno Campanini ha scritto:
> by sal pretended :
>
> Non mi sembra tu possa eliminare il ciclo, puoi ottimizzarlo:
>
> For i = 3000 to 5000
> n = n +1
> S = S + calc(i, 4)
> Next
> S = S / n
>
> Bruno
Ciao Bruno come sempre grazie per le risposte.
sono quello dei grandi numeri, il ciclo di per se mi implica molto anche con la tua soluzione.
dovrei cercare di eliminarlo proprio.
questa la macro intera, anche se dici che leggere il codice di altri e come l'arabo
Option Explicit
Option Base 1
Sub Calcolo_1()
Dim r, x, y, k, n, T1, TT, rng(), Limite1, Limite2, Limite3, Fisso1, Fisso2, Dati, Calc
Dim Riga, Colonna, intervallo
Limite1 = 6000
Limite2 = 12000
Limite3 = 13000
Fisso1 = 4140
Application.Calculation = xlCalculationManual
TT = Now
Sheets("Dati").Select 'seleziona il foglio dati
r = Cells(Rows.Count, 2).End(xlUp).Row 'prende 50.000 righe
Dati = Range("A3:C" & r)
ReDim Calc(r, 1 To 16)
For x = LBound(Dati) To UBound(Dati)
Calc(x, 1) = Dati(x, 1)
Calc(x, 2) = Dati(x, 2)
Calc(x, 3) = Dati(x, 3)
If x = 1 Then
If Dati(x, 3) = 0 Then
Calc(x, 4) = 0
Else
Calc(x, 4) = Dati(x, 3)
End If
Else
If Dati(x, 3) = 0 Then
Calc(x, 4) = Calc(x - 1, 4)
Else
Calc(x, 4) = Dati(x, 3)
End If
End If
If x >= Limite1 Then
n = 1
ReDim rng(x)
For k = x - (Limite1 - 1) To x 'ciclo da rivedere
rng(n) = Calc(k, 4)
n = n + 1
Next k
Calc(x, 6) = WorksheetFunction.Average(rng) '"Calc(x - Limite1, 4):Calc(x, 4)")
End If
If x >= Limite2 Then
n = 1
ReDim rng(x)
For k = x - (Limite2 - 1) To x 'ciclo da rivedere
rng(n) = Calc(k, 4)
n = n + 1
Next k
Calc(x, 5) = WorksheetFunction.Average(rng) 'Calc(x - Limite2, 4), Calc(x, 4))
Calc(x, 7) = Calc(x, 6) - Calc(x, 5)
Calc(x, 8) = Calc(x, 7) - Calc(x - 1, 7)
If Calc(x, 8) = 0 Then Calc(x, 9) = Calc(x, 9) Else Calc(x, 9) = Calc(x, 8)
If Calc(x, 10) > 0 Then Calc(x, 11) = 1 Else Calc(x, 11) = 0
If Calc(x - 1, 11) = 0 And Calc(x, 11) = 1 Then Calc(x, 12) = "up" Else Calc(x, 12) = 0
If Calc(x, 12) = "up" Then Calc(x, 13) = Calc(x, 2) Else Calc(x, 13) = 0
If Calc(x - 1, 11) = 1 And Calc(x, 11) = 0 Then Calc(x, 14) = "down" Else Calc(x, 14) = 0
If Calc(x, 14) = "down" Then Calc(x, 15) = Calc(x, 2) Else Calc(x, 15) = 0
End If
If x >= Limite3 Then
n = 1
ReDim rng(x)
For k = x - (1000 - 1) To x 'Ciclo da rivedere
rng(n) = Calc(k, 9)
n = n + 1
Next k
Calc(x, 10) = WorksheetFunction.Average(rng) * Fisso1 'Calc(x - 1000, 9), Calc(x, 9)) * Fisso1
n = 1
ReDim rng(x)
For k = x - (5000 - 1) To x 'ciclo da rivedere
rng(n) = Calc(k, 9)
n = n + 1
Next k
Calc(x, 16) = WorksheetFunction.Average(rng) * Fisso1 'Calc(x - 1000, 9), Calc(x, 9) * Fisso2)
End If
Next x
Sheets("Calcolo").Select 'seleziona il foglio di scrittura dati
r = Cells(Rows.Count, 2).End(xlUp).Row
Range("A3:P" & r).ClearContents
Riga = UBound(Calc, 1)
Colonna = UBound(Calc, 2)
Set intervallo = Range("A3").Resize(Riga, Colonna)
intervallo.Value = Calc
Application.Calculation = xlCalculationAutomatic
TT = Now - T1
MsgBox "Tempo impiegato " & Format(TT, "hh:mm:ss")
End Sub.
i dati sono circa 50.000 righe ed ogni riga viene processata con calcoli, questi calcoli sono sul foglio con le formule, ora un foglio con 50.000 righe e 16 colonne piene di calcoli, ogni piccola variazione, anche mettendo il calcolo manuale implica un sacco di tempo per l'aggiornamento.
quindi ho creato questa macro che fa i calcoli e scrive il risultato sul foglio senza formule, vengono fatte dalla macro.
nella macro ci sono 5 medie da calcolare, ogni media calcola diverse righe da 1000 - 6000 e 13000, e questo mi comporta appunto un tempo importante per la macro.
ho fatto una prova eliminando i cicli per le medie il tutto fra lettura-calcolo e scrittura si arriva a circa 2 secondi per l'esecuzione completa.
ma come dici non ce modo di eliminarli.
con Redim preserve non si può salvare il pezzo di una matrice in un altra matrice, sapendo la riga(indice) di inizio e fine.
Ciao By Sal (8-D