Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

macro lenta causa formula

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

macro lenta causa formula

Postdi miko » 16/06/13 21:18

ciao,
ho ripreso una vecchia macro, funzionante, ma ho notato la lentezza
di esecuzione dovuta alla presenza di una stessa
formula inserita in molte celle.
in colonna N di foglio 1 inserisco,tramite macro, le somme delle righe,
mentre in foglio 2 conto quanti valori uguali si trovano in colonna N di foglio 1.
la formula usata è:
Codice: Seleziona tutto
=CONTA.SE(Foglio1!N:N;281)

quello che cambia tra le diverse celle è il valore da ricercare, in questo caso 281.
la formula è inserita in centinaia di celle.
anche digitando un singolo valore in colonna N di foglio 1, noto che l'elaborazione
impiega molto tempo, anche se si tratta di secondi.
cercavo una soluzione differente, formula o macro per velocizzare l'esecuzione
immaginando di dover inserire più valori in colonna N di foglio 1.
ciao, grazie
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: macro lenta causa formula

Postdi ricky53 » 16/06/13 22:06

Ciao,
tu vai a controllare tutte le celle della colonna!
Se hai dal 2007 in avanti sai quante sono le celle?
Sono 1.048.576


Prova questo esempio
Codice: Seleziona tutto
Sub Conta()
    Num_Volte = Application.WorksheetFunction.CountIf(Range("N2:N" & Range("N" & Rows.Count).End(xlUp).Row), "=" & Range("N1"))
End Sub


Ho contato solo fino all'ultima cella della colonna con valori e non tutta la colonna.
Inoltre ho messo in "A1" il valore da controllare: il tuo "281", così se devi cambiarlo non devi modificare il codice.

Se vuoi puoi associare la macro ad un pulsante o eseguirla con "Alt+F8"
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: macro lenta causa formula

Postdi miko » 17/06/13 10:38

ciao,
uso excel 2003;
dalla tua descrizione ho capito che la mia formula conta-cerca in tutta la colonna N,
mentre la tua conta-cerca da N2 fino all'ultima cella piena di colonna N.
per come hai impostato il tuo codice credo che deve modificarsi in
Num_Volte = Application.WorksheetFunction.CountIf(Range("N2:N" & Range("N" & Rows.Count).End(xlUp).Row), "=" & Range("A1"))
diversamente ottengo risultati errati.
la tua macro, purtroppo anche se funziona, non può essere adattata alle mie esigenge;
noto anche nella tua una lentezza di esecuzione;
immagino allora che l'uso delle formule rallenti l'esecuzione;
devo contare 500 valori diversi, e quindi è impesabile dover digitare ogni singolo valore in cella A1;
quello che vorrei realizzare, con un metodo più veloce, è che se in colonna N di foglio 1
viene inserito un valore automaticamente in foglio 2 venga aggiornato il conteggio di quel valore;
se si inseriscono più valori in colonna N di foglio 1, ricordo che in colonna N si trovano le somme dei valori delle righe,
allora in automatico vengano aggiornati i conteggi di questi valori.
nel momento in cui scrivo sto pensando a questa soluzione:
supponiamo che in colonna N sono stati inseriti 10 valori ed eseguito il conteggio riportato in foglio 2;
ad un successivo inserimento di valori in colonna N, diciamo altri 5
non è necessario ripetere il conteggio dalla prima cella fino all'ultima, 15, ma solo dalla 11 alla 15,
dato che i precedenti sono stati già conteggiati.
mi rimane però il grosso problema di realizzare la macro dato che devo considerare 500 valori diversi anche se consecutivi.
vi mostro uno stralcio di immagine di come è strutturato il foglio 2 che riporta i conteggi:

Immagine

grazie, ciao
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: macro lenta causa formula

Postdi Anthony47 » 17/06/13 11:56

Forse pubblicando un file di esempio si puo' capire meglio anche quanto hai detto fin qui.

Ciao a tutti.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro lenta causa formula

Postdi ricky53 » 17/06/13 14:45

Ciao,
prima leggi quanto ha scritto Anthony.


Adesso veniamo al m io intervento.

Non è la macro ad essere lenta è il file che ha tante formule che lo rallentano.
Per verificarlo prova in questo modo:

1. esegui la macro come l'ho scritta

2. togli gli apici alle due istruzioni come descritto nel codice e riesegui la macro



Codice: Seleziona tutto
Sub Conta()
    Dim mCalcolo As Variant, Num_Volte As Integer, Inizio As Double
    mCalcolo = Application.Calculation

'..................................................................
' Fare una prima esecuzione poi
'
' TOGLIERE gli apici alle due istruzioni seguenti e rilanciare la MACRO !!!
'
'    Application.ScreenUpdating = False
'    Application.Calculation = xlCalculationManual
'..................................................................


    Inizio = Timer
   
    Num_Volte = Application.WorksheetFunction.CountIf(Range("N2:N" & Range("N" & Rows.Count).End(xlUp).Row), "=" & Range("A1"))
   
    MsgBox " Tempo di elaborazione:  '" & Format(Timer - Inizio, "0.000") & "'"
   
    Application.ScreenUpdating = True
    Application.Calculation = mCalcolo
End Sub



Che tempi hai ottenuto ???
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: macro lenta causa formula

Postdi miko » 17/06/13 20:02

buona sera,
vi invio il file, che ho dovuto ridimensionare, e che spero sia sufficiente per capire
e risolvere il problema.
http://www.filedropper.com/somme
Nel primo foglio ci sono le estrazioni dell'enalotto ed in colonna N le rispettive somme.
Nel foglio 2 sotto l'etichetta VALORI ATTUALI sono riportate le frequenze delle somme,
cioè quante volte una data somma è presente in colonna N.
cliccando su una qualunque cella vedrete la formula che ho usato fino ad ora.
Se inserite un qualunque valore in colonna N di foglio 1, vedrete modificare nel foglio 2
il valore della corrispondente somma.
nel modulo 1 ho inserito l'ultima macro di Ricky53;
avevo immaginato che la lentezza fosse dovuta alle centinaia di formule, come titolo il topic,
e leggendo il contributo di ricky
..Non è la macro ad essere lenta è il file che ha tante formule che lo rallentano..
ne ero certo,
ma usando la macro di ricky incomincio ad avere dei dubbi, forse mi sfugge qualcosa.
avevo già inserito gli ScreenUpdating nel mio file ma i tempi erano sempre elevati.
La macro di Ricky è velocissima;
sia commentando oppure no le linee indicate, gli ScreenUpdating,
non si nota alcuna differenza data la elevata velocità di esecuzione ed i tempi sono dell'ordine di 0,000.
ma ho notato che se nel file che vi ho inviato inserisco questa semplice linea di codice:
Range("N1").Value = Num_Volte
prima o dopo il msbbox oppure prima o dopo gli ScreenUpdating finali, i tempi aumentano notevolmente
passando a 0,719-0,750, che se in condizioni normali sono ben poca cosa, nel file publicato con pochi elementi
in colonna N e con un solo numero da conteggiare mi sembrano eccessivi;
se si tiene pure conto che la macro di Ricky è velocissima anche con tutte le centinaia di formule presenti in foglio 2
dubito che sia la presenza di queste ultime.
a questo punto non capisco come una semplice linea di codice possa rallentare notevolmente l'esecuzione.
saluti e grazie
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: macro lenta causa formula

Postdi ricky53 » 18/06/13 00:19

Ciao,
Strano.
La cosa non mi convince.

Scarico il tuo file, provo e ci risentiamo domani.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: macro lenta causa formula

Postdi Anthony47 » 18/06/13 01:57

La macro di Ricky calcola un valore senza mai modificare il contenuto di Foglio1, quindi le formule non si ricalcolano e non rallentano niente. Quando modifichi invece N1, tutte le formule che hanno N1 come "precedente" vengono ricalcolate, e sono le famose formule =CONTA.SE(Foglio1!N:N;xyz)
Questo scatena il rallentamento che vedi.

Tuttavia, nel file pubblicato il ciclo di calcolo di tutte quelle formule e' dell' ordine di 8-9 msec (per tutte le formule), ben lontano dai 700 e passa msec che tu segnali.
Immagino quindi che tu hai fatto prove su un file abbastanza piu' lungo, e infatti se copio in ENALOTTO i dati verso il basso per circa 8000 righe i tempi di ricalcolo cominciano a divenire significativi.
Una ipotesi di lavoro e' questa:
-creati un foglio chiamato FoglioS (e' il foglio in cui creeremo le somme via macro)
-in A1 e B1 metti le intestazioni, tipo (rispettivamente) Somma e Count
-da A2 ad A526 creati una serie di numeri da 1 a 525 (scrivi 1 in A2, poi clicca sull' angolo basso/dx della cella e trascina fino ad A526; clicca sulla freccina di Opzioni riemimento automatico e scegli Ricopia serie. Oppure scrivi 1 in A2, poi in A3 usa la formula =A2+1 che copierai verso il basso)
-manda in esecuzione questa macro:
Codice: Seleziona tutto
Sub newCountr()
Dim myVArr, Urs As Long, myCnt(1 To 600) As Long
Dim I As Long, J As Long
myTim = Timer
With Sheets("ENALOTTO")
    Urs = .Cells(Rows.Count, 3).End(xlUp).Row
    myVArr = .Range("C8:H" & Urs).Value
End With
Sheets("FoglioS").Range("B2:B700").ClearContents
For I = LBound(myVArr, 1) To UBound(myVArr, 1)
    mysum = 0
    For J = LBound(myVArr, 2) To UBound(myVArr, 2)
        mysum = mysum + myVArr(I, J)
    Next J
    myCnt(mysum) = myCnt(mysum) + 1
Next I
With Sheets("FoglioS")
    .Range("A1").Value = "Somma": .Range("B1").Value = "Count"
    .Range("B2").Resize(525, 1).Value = Application.WorksheetFunction.Transpose(myCnt())
End With
MsgBox ("Completato in " & Format(Timer - myTim, "0.##") & "sec")
End Sub
Questa macro ti inserira' in colonna B di FoglioS la conta delle somme delle estrazioni presenti nel foglio Enalotto.
Per 8000 record il tempo di esecuzione e' di 20-25 msec

Se i risultati sono idonei per il tuo scopo, potrai quindi eliminare il foglio SOMMA con tutte le sue formule e i suoi rallentamenti.

Spero che quanto proposto sia di qualche utilita'.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro lenta causa formula

Postdi miko » 18/06/13 09:32

ciao,
rifacendomi a quanto ho scritto nell'altro mio topic, a proposito dell'help, e con riferimento a
La macro di Ricky calcola un valore senza mai modificare ....

queste spiegazioni-conoscenze non le ho mai trovate nell'help e perciò ritengo che sia meglio
"interloquire" con voi che con uno sterile help, anche se ogni tanto vi disturbo, e cerco di farlo il meno possibile.
come hai immaginato ho fatto delle prove sia sul file completo di circa 8000 righe che su quello ridotto inviatovi.
seguendo le tue indicazioni ho provato la tua ultima macro, ma ricevo errore alla linea evidenziata:
Codice: Seleziona tutto
........
For J = LBound(myVArr, 2) To UBound(myVArr, 2)
        mysum = mysum + myVArr(I, J)
    Next J
    myCnt(mysum) = myCnt(mysum) + 1 '<<<<<<<<<<<
........

quando si raggiunge la linea in errore J vale 7 ed il messaggio recita:
"INDICE NON COMPRESO NELL'INTERVALLO".
ho provato a capire quale sia la causa ma evidentemente non ci sono riuscito.
una precisazione che mi era sfuggita in precedenza:
l'archivio del foglio enalotto contiene estrazioni del periodo guerra
per cui vi sono righe-celle vuote, ciò vale anche evidentemente per la colonna somme.
non so se questo influisce sull'esecuzione della macro.
tutto quello che scrivete o realizzate è di grande utilità, anche se non direttamente interessato al momento.
vi auguro una buona giornata.
grazie ciao
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: macro lenta causa formula

Postdi Anthony47 » 18/06/13 11:06

Quindi hai l' errore sulla riga myCnt(mysum) = myCnt(mysum) + 1
Piu' che il valore di J potrebbe interessare il valore di I e soprattutto di mysum. Quell' errore infatti fa pensare che nella riga di dati "7+I" la somma dei 6 numeri sia superiore a 600 o inferiore a 1, cosa impossibile con numeri compresi tra 1 e 90, ma possibile in presenza di righe vuote...
Per rimediare a questa possibilita', aggiungi questa istruzione nella macro:
Codice: Seleziona tutto
    Next J
    If mysum < 1 then mysum = 530      '<<< QUESTA
    myCnt(mysum) = myCnt(mysum) + 1

Fai sapere se cosi' e' ok.

Quanto all' help on line (sia quello di excel che quello del vba) sono delle vere miniere di informazioni e di esempi.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro lenta causa formula

Postdi miko » 18/06/13 20:00

ciao,
ho testato nuovamente la prima macro , quella che produce errore;
a titolo di informazione, nel momento in cui si ha errore il valore di I = 1, mysum = 0, J = 7;
se I rappresenta il numero di riga, quando I = 1 effettivamente la prina riga C8-H8 è vuota.
ho provato allora a modificare il range partendo da una riga tale che fra inizio e fine non vi siano celle o righe vuote;
la macro procede velocemente senza errore.
ciò avvalora la tua ipotesi di errore in presenza di righe vuote.
successivamente ho inserito la modifca che hai indicato considerando tutto il range, comprese le righe vuote;
la macro è velocissima, per elaborare circa 8000 righe impiega appena 0,02 sec, naturalmente senza errori e fornendo
gli stessi risultati che ottenevo con il foglio pieno di formule.
grazie.
provo ad interpretare la macro:
nella matrice myVArr viene inserito tutto il range da esaminare dalla prima all'ultima riga;
successivamente con il primo ciclo, I, si considerano le righe, mentre con il secondo, J, le colonne;
in mysum si introducono tutte le varie somme
ed infine in myCnt(mysum) si inseriscono i conteggi delle somme.
con transpose mettiamo in colonna i valori di myCnt(mysum);
se transpose manca, non ho fatto prove è una ipotesi pensata al momento in cui scrivo,
i valori saranno disposti su una riga.
ancora grazie e buona serata
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: macro lenta causa formula

Postdi Anthony47 » 19/06/13 14:38

la macro è velocissima, per elaborare circa 8000 righe impiega appena 0,02 sec, naturalmente senza errori e fornendo gli stessi risultati che ottenevo con il foglio pieno di formule.
grazie.

Prego.
Se e' troppo veloce posso rallentarla... :lol:

Quanto all' interpretazione della macro, direi che e' sostanzialmente corretta; senza la Transpose l' intervallo determinato da Range("B2").Resize(525, 1) sarebbe ricoperto dal contenuto di myCnt(1).


Alla prossima.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro lenta causa formula

Postdi miko » 19/06/13 19:53

buona sera,
non desisero impegnarti ulteriormente su questo aspetto,
mi "accontento" ;) della velocità che sei riuscito ad ottenere,
a meno che tu non conosca un altro metodo per ridurre
ulteriomente i tempi dal momento che l'archivio è destinato ad aumentare.
ti chiedo inceve 2 informazioni:
1) la macro conta le varie somme da 1 a 525;
poichè la somma varia tra un min=21 ed un max=525,
forse è superfluo considerare i valori da 1 a 20.
penso che devo modificare queste due linee:
Codice: Seleziona tutto
Dim  myCnt(1 To 600) As Long
.Range("B2").Resize(525, 1).Value =Application.......

in
Codice: Seleziona tutto
]Dim  myCnt(21 To 600) As Long
.Range("B2").Resize(525, 21).Value =Application......

non ho fatto prove, questi giorni mi sono concentrato sulla macro dell'altro topic.
2) invece di avere due colonne con 525 righe, al fine di avere una visione più ristretta e compatta dei valori,
sto pensando di modificare il tuo risultato per ottenere il foglio come nel file che ho inviato,
il foglio con tutte le formule.
in questo momento riesco ad immaginare solo questo elaborazione:
eseguire prima la tua macro usando delle colonne di appoggio non visibili,
successivamente eseguire un'altra macro che trasferisce i valori dalle colonne
di appoggio al range definitivo disposto come nel mio file.
a meno che non si possa ottenere questo risultato direttamente dalla tua macro.
vedrò cosa riesco a realizzare.
per intanto grazie ancora e buona serata.
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: macro lenta causa formula

Postdi Anthony47 » 20/06/13 11:51

Per "evitare di sciupare" 20 celle sara' sufficiente definire myCnt come
Codice: Seleziona tutto
Dim  myCnt(21 To 600) As Long

Per ulteriore sicurezza modifichiamo l' istruzione If mysum < 1 then mysum = 530 in If mysum < 21 then mysum = 530

Sara' anche opportuno che la legenda che avevamo messo in colonna A di FoglioS (da 1 a 525) venga modificata (da 21 a 525).
Teoricamente non e' necessario modificare la riga che contiene .Range("B2").Resize(525, 1); comunque e' meglio modificarla in .Range("B2").Resize(510, 1) per non avere il report sulle linee vuote.

Visto pero' che la tua intenzione e' modificare la visualizzazione finale mi chiedo quale sia il vantaggio di questo risparmio.

Volendo visualizzare i risultati nella tabella in stile SOMMA, tanto vale farlo direttamente con la macro senza passare per le colonne intermedie.
Io ho creato una copia del tuo foglie SOMME chiamandolo SOMME2 (per non distrggere le formule che sono presenti in SOMME) e ho generato su questo secondo foglio il contenuto di myCnt.
La macro finale e':
Codice: Seleziona tutto
Sub newNCountr()
'calcola mySum di ogni riga e lo mette in myCnt(nn)
'   poi myCnt e' usato per popolare direttamente la tabella in stile "Somma"
' tip:  0.06 sec
Dim myVArr, Urs As Long, myCnt(21 To 600) As Long
Dim I As Long, J As Long, myTim As Single, mySum As Long
Dim myRoot As String, myWidth As Long, myStep As Long, JJ As Long, KK As Long, LL As Long

myTim = Timer
With Sheets("ENALOTTO")
    Urs = .Cells(Rows.Count, 3).End(xlUp).Row
    myVArr = .Range("C8:H" & Urs).Value
End With
For I = LBound(myVArr, 1) To UBound(myVArr, 1)
    mySum = 0
    For J = LBound(myVArr, 2) To UBound(myVArr, 2)
        mySum = mySum + myVArr(I, J)
    Next J
    If mySum < 21 Then mySum = 530
    myCnt(mySum) = myCnt(mySum) + 1
Next I
'
'popola SOMME2:
myRoot = "C7"
myWidth = 13
myStep = 3
I = 0
With Sheets("SOMME2")
For JJ = LBound(myCnt, 1) To UBound(myCnt, 1)
KK = I Mod myWidth
LL = Int(I / myWidth)
        .Range(myRoot).Offset(LL * myStep, KK).Value = myCnt(JJ)
    I = I + 1
    If JJ = 525 Then Exit For
Next JJ
End With
MsgBox ("Completato in " & Format(Timer - myTim, "0.##") & "sec")
End Sub


Arrivati comunque in fondo, metto un "punto interrogativo" su tutta la discussione:
miko, a inizio discussione, ha scritto:in colonna N di foglio 1 inserisco,tramite macro, le somme delle righe
Ebbene se tu usi una macro per popolare la colonna N, quello che la mia ultima macro fa in qualche centesimo di sec viene fatto complessivamente in meno di 2 sec per 8000 linee. Ad esempio
Codice: Seleziona tutto
Sub newLCountr()
'calcola mySum di ogni riga e lo mette direttamente in colonna N
'   Le somme su foglio SOMME rimangono fatte con formule
' tip: 1.39 sec
Dim Urs As Long, myTim As Single
Dim I As Long, J As Long, mySum As Long

myTim = Timer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

With Sheets("ENALOTTO")
    Urs = .Cells(Rows.Count, 3).End(xlUp).Row
    For I = 8 To Urs
        mySum = 0
        For J = 1 To 6
            mySum = mySum + .Cells(I, 2 + J).Value
        Next J
        Cells(I, "N") = mySum
    Next I
End With
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Calculate

MsgBox ("Completato in " & Format(Timer - myTim, "0.##") & "sec")
End Sub

Questa andrebbe a sostituire la tua macro SOMMA (associata al pulsante pesente in foglio Enalotto ma non presente nel file che hai pubblicato), e i totali vengono calcolati nel foglio SOMMA con le formule gia' presenti.

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro lenta causa formula

Postdi miko » 22/06/13 20:17

buon sabato a tutti,
con
..mi "accontento" della velocità che sei riuscito ad ottenere..

intendevo proseguire la tua precedente ludica affermazione
Se e' troppo veloce posso rallentarla

il senso di evitare di "sciupare 20 celle" non era da me inteso in un vantaggio in termini di tempo;
con una macro che elabora 8000 righe in 0,02 sec non si sarebbe avvertita la differenza, con + o - 20 celle, ne si potrebbe
richiedere una ulteriore riduzione del tempo.
intendevo solo esprimere la possibilità di "eliminare il superfluo" in termini di praticità e/o utilità.
grazie anche per la macro che calcola le somme.
quella che ho usato fino ad ora è:
Codice: Seleziona tutto
Sub SOMMA()
 Dim myTim As Single
   myTim = Timer

 Application.ScreenUpdating = False
 Application.Calculation = xlManual
 
 With Worksheets("ENALOTTO")
    UREini = .Range("C" & Rows.Count).End(xlUp).Row
         
      For NRow = 8 To UREini
           
        If Application.WorksheetFunction. _
           CountBlank(.Range("C" & NRow & ":H" & NRow)) = 0 Then
           .Cells(NRow, "N") = Application.WorksheetFunction. _
                           Sum(.Range("C" & NRow & ":H" & NRow))
        Else: .Cells(NRow, "N").Value = ""
        End If
             
      Next NRow
     
 End With
 Application.Calculation = xlCalculationAutomatic
 Application.ScreenUpdating = True
  MsgBox ("Completato in " & Format(Timer - myTim, "0.##") & "sec")
   
End Sub

non mi permetto di esprimere giudizi sulle macro, non essendone in grado;
posso solo valutare i tempi di calcolo che in entrambe le routine, la tua versione e la mia,
sono identici.
grazie per il contributo che hai fornito in questo mio topic.
buon weekend, ciao
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: macro lenta causa formula

Postdi Anthony47 » 23/06/13 10:47

Il fatto che la tua SOMMA() impieghi lo stesso tempo della mia newLCountr() mi rafforza il "punto interrogativo": abbiamo cioe' discusso di come fare in 0,02 sec una cosa che precedentemente era fatta in 1,2 sec. Se e' una cosa che si fa meno spesso di una volta ogni 5 minuti secondo me il gioco non vale la candela.
Alla prossima...
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro lenta causa formula

Postdi miko » 23/06/13 20:42

buona domenica a tutti,
dal tuo ultimo post evinco che probabilmente ed involontariamente
vi ho indotto ad equivocare la mia richiesta.
per amore della precisione, l'argomento del topic verteva sulla lentezza di una elaborazione,
che come avete evidenziato tu e ricky, dipendeva dal foglio SOMMA contenente
centinaia di formule identiche, per il conteggio dei vari valori presenti in colonna N.
Ne è nata quindi la tua prima versione newCountr, poi leggermente modificata,
e successivamente la newNCountr diffrente dalla prima per la diversa disposizione del risultato finale.
entrambe, contano i valori di colonna N, con tempi notevolmente
inferiori alle formule di foglio SOMMA, e quindi risolvono il mio problema.
la macro che invece calcola le somme delle righe e pone il risultato
in colonna N non era in discussione, non facendo parte del "problema lentezza";
perciò ho evitato di inserirla nel file anche per alleggerire quest'ultimo.
poichè hai evidenziato
..associata al pulsante pesente in foglio Enalotto ma non presente nel file che hai pubblicato...

onde evitare che si pensasse ad una mia "gelosia", e poichè hai poi realizzato,
grazie alla prodigalità che vi distingue, anche la macro somma,
ho pensato di publicare la mia versione di macro somma
e di far notare la tempistica delle 2 versioni.
a mio modo di vedere, ma forse mi sfugge qualcosa tra i vari passaggi,
non ritengo che il tuo lavoro ed impegno sia stato inutile
..abbiamo cioe' discusso di come fare in 0,02 sec una cosa che precedentemente era fatta in 1,2 sec..

se ci ricordiamo che avevamo evidenziato:
..se copio in ENALOTTO i dati verso il basso per circa 8000 righe i tempi di ricalcolo cominciano a divenire significativi...

grazie per esserti impegnato a risolvere questo mio problema;
ringrazio anche ricky per la sua partecipazione
ciao
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: macro lenta causa formula

Postdi ricky53 » 24/06/13 12:15

Ciao,
il mio contributo è stato minimo, comunque mi ha fatto piacere l'essere citato.

Buon proseguimento e ... alla prossima.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: macro lenta causa formula

Postdi miko » 30/06/13 21:11

buona sera,
usando le tue macro, newCountr con le modifiche successive, e la newNCountr
ho notato che ad ogni esecuzione viene effettuato il calcolo dalla prima riga utile, cella N8
fino all'ultima ad ogni aggiornamento dell'archivio.
ho pensato allora, al solo scopo di una diversa logica di affrontare il problema
e non al fine di ridurre la velocità di esecuzione già ottima, di procedere in questo modo;
supponiamo che inizialmente in archivio ci siano 100 righe, da N8 ad N108,
ed abbiamo già effettuato il calcolo delle somme ed effetuato i conteggi con newCountr o la newNCountr
di queste prime righe;
se ora aggiorniamo l'archivio le righe passeranno da 100 a 110, ad esempio,
e quindi l'ultima riga passerà da N108 ad N118;
poichè il calcolo da N8 ad N108 è già stato effettuato in precedenza, è "inutile" ripetere il calcolo
per queste righe, ma è sufficiente eseguire il calcolo per le righe successive da N101 ad N118
ed aggiornare i fogli solo per quei valori delle somme che sono variati in seguito all'aggiornamento.
se cioè prima la somma 249 aveva come conteggio 5 e dopo l'aggiornamento si ha una somma ancora 249
devo aggiornare solo questa somma, passando al valore 6, mentre le altre non essendo variate rimangono con i valori precedenti.
E' inutile dire che ho provato a modificare le macro, newCountr o la newNCountr,
ma ottengo risultati completamente errati.
vorrei ribadire che la finalità della mia richesta non è quella di impegnarti a realizzare una macro più spedita
ma è solo la mia "curiosità didattica".
saluti e grazie
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: macro lenta causa formula

Postdi Anthony47 » 01/07/13 01:18

Dipende da quale e' il tuo modo di lavorare.
Se aggiungi una riga per volta allora e' possibile calcolare la somma della riga inserita e fare +1 sulla cella che conteggia quella somma.
Tutto puo' essere ottenuto con una macro autoregistrata e piccole modifiche:
-calcola la somma dell' ultima riga (s)
-vai sul foglio dei risultati (r)
-cerca la cella contenente ad esempio "S(21)" e modificala perche' cerchi "S(" & Somma & ")"(r+m)
-seleziona la cella sottostante (ActiveCell.Offset(1, 0).Select)
-imposta il contenuto della cella attiva al suo valore +1 (s)
-torna sul foglio iniziale posizionandosi sull' ultima riga (r)
"s" significa "scrivere le istruzioni"; "r" significa "Registrare"; r+m significa registrare e poi modificare il codice.
Visto quello che fai normalmente mi sembra tutto alla tua portata (e se ti "incagli" siamo qui).

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "macro lenta causa formula":


Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti