Riguardando il tuo file mi vengono da fare ulteriori considerazioni.
1. Intanto non capisco perche' ogni secondo leggi i dati e non usi invece il metodo SetLinkOnData per leggere invece solo al cambiamento dei dati in input. Per discussioni simili fai Cerca nel forum Applicativi Office con la parola SetLinkOnData, dovresti vedere numerose altre discussioni che ti potranno aiutare a capire di cosa parlo.
2. La tua macro gia' accoda ogni secondo i dati che ti interessano (lo do' per scontato, non ho fatto nessuna verifica in merito). Ora forse tu vuoi accantonare su altro foglio un tot di informazioni che si riferiscono agli ultimi 60 secondi di dati accantonati?
Se SI, allora il modo piu' semplice secondo me potrebbe essere questo:
-ti crei N "range dinamici" che fanno riferimento alle ultime 60 celle della colonna dati che ti interessa. Per questo devi creare degli "intervalli nominati" (Menu /Inserisci /Nome /Definisci) che nell' area "Riferito A" contengono una definizione come questa:
- Codice: Seleziona tutto
=scarto(DDEInput!$A$1;conta.valori(DDEInput!$A:$A)-60;2;60;1)
Questa definisce un intervallo che comprende le ultime 60 celle della colonna C; "60" deriva dei valori scritti in formula, "C" deriva dall' offset di colonna pari a "2" nella formula. Cosi' sai anche come definire intervalli riferiti ad altre colonne.
Se l' intervallo di sopra e' stato chiamato DColC allora, ad esempio, potrai usare una formula tipo
=Media(DColC) e otterrai la media degli ultimi 60 valori (quindi degli ultimi 60 second)i dei dati raccolti.
Fai questo per tutti i valori di DDEInput che vuoi storicizzare su Foglio2, e metti in I1:L1 dello stesso DDEInput le formule per calcolare i valori che vuoi storicizzare (media BID, Dev std, media ASK , Dev Std); fa eccezione a questo ragionamento il campo Data/Ora perche' quello che tu raccogli e' un campo testo; il mio suggerimento e' che riporti in H1 l' ultimo campo raccolto; per questo il range dinamico di col A non avra' altezza=60 e larghezza=1 (vedi "60;1" nella formula suggerita e l' help on line della funzione Scarto), ma altezza=larghezza=1 (quindi "1;1", oppure valori omessi, nella formula del range dinamico).
Finora quindi abbiamo detto come puoi preparare in DDEInput in H1:L1 i 5 valori che vuoi riportare in Foglio2.
A questo punto prepari una macro che si rischeduli ogni 60 secondi, che copia i valori di H1:L1 e li "Incolla-speciale /Valori" in coda a Foglio2.
Il cuore di questa macro sara'
- Codice: Seleziona tutto
Sheets("DDEInput").Range("H1:L1").Copy
Sheets("Foglio2").Cells(Rows.count,1).End(xlUp).Offset(1,0).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Per chiarezza Foglio1 e' diventato inutile, essendo stato sostituito dai Range dinamici e dalle formule in DDEInput; come pure e' stata superata la proposta che ti avevo fatto nel mio messaggio iniziale.
Ti faccio notare che la tecnica di programmazione che hai adottata e' molto barocca, cioe' inutilmente arzigogolata. Per vedere altri esempi di macro eseguite periodicamente fai Cerca nel forum Applicativi Office con la parola "Ontime", autore "Anthony47", mostra Topic (non Messaggi).
In tutto questo non ho ancora capito il tuo livello di esperienza sul vba; comunque se hai difficolta' a realizzare quanto proposto allora scrivi ancora precisando su cosa ti sei arenato.
Se invece quanto descritto non corrisponde a quanto devi realizzare allora evidentemente devi raccontare nuovamente le cose...
In ogni caso fai sapere.
Ciao