Entra

View Full Version : [VBA] DDE+Excel


Kimiko
11-03-2008, 18:28
Ciao a tutti, spero che l'argomento non sia già stato affrontato, se così è mi scuso per il search superficiale... :)

Ho una cella con un datafeed realtime che cambia ogni secondo.
Vorrei in un intervallo delta_t (ad esempio 3 min) registrare il valore a t=0 e a t=3 ed il valore minimo e massimo.
Ho provato con le semplici formule di excel, ma riesco esclusivamente a ricopiare il valore della formula, che quindi continua a variare nel tempo.

In poche parole vorrei una storicizzazione del valori suddetti.

Sapete darmi qualche suggerimento o darmi qualche link utile?

Grazie e buona serata.

MarcoGG
11-03-2008, 20:48
Ho una cella con un datafeed realtime che cambia ogni secondo.
Vorrei in un intervallo delta_t (ad esempio 3 min) registrare il valore a t=0 e a t=3 ed il valore minimo e massimo.
Ho provato con le semplici formule di excel, ma riesco esclusivamente a ricopiare il valore della formula, che quindi continua a variare nel tempo.

In poche parole vorrei una storicizzazione del valori suddetti.


Interessante.
Anzitutto un consiglio : rinomina il thread con un bel [ Excel VBA ] iniziale. Non vorrei che ti chiudessero la discussione. ;)

Una precisazione : oltre al valore iniziale/finale/max/min lo storico prevede la registrazione dei valori ad ogni secondo sullo stesso Foglio in cui è presente la cella DDE ?

Kimiko
11-03-2008, 22:52
Mi scuso per la niubbaggine e per non aver letto le regole del forum, ma non riesco a modificare il titolo, prego i moderatori di farlo per me.

Lo storico che voglio creare non richiede la memorizzazione dato per dato ma esclusivamente i valori di min, max, iniziale e finale con timeframe definito.

cella DDE
x [cambia continuamente]

time t=iniz. min max t=finale
3 X0 Xmin Xmax X3-
6 X3+ Xmin Xmax X6-
9 ....................................................
12 .....................................................

MarcoGG
12-03-2008, 08:46
Lo storico che voglio creare non richiede la memorizzazione dato per dato ma esclusivamente i valori di min, max, iniziale e finale con timeframe definito.

cella DDE
x [cambia continuamente]

time t=iniz. min max t=finale
3 X0 Xmin Xmax X3-
6 X3+ Xmin Xmax X6-
9 ....................................................
12 .....................................................


Ok. Quindi mettiamo che DDE stia in A1 su Foglio1.
Il programma deve generare una tabella, sempre su Foglio1, e ogni 3 minuti riportare i 4 valori [ inizio / min / max / fine ] rilevati sui 180 ( 3x60 ) secondi di ogni intervallo. Corretto ?

Kimiko
12-03-2008, 08:52
Corretto!

Sto cercando nelle funzioni "importazione dati" ma mi sa che non ci cavo nulla di buono...

Kimiko
12-03-2008, 13:21
Dopo svariati tentativi sono arrivato a questa macro, dal sito di Microsoft

Sub LinkList()
Dim Links As Variant
' Obtain an array for the links to Excel workbooks
' in the active workbook.
Links = ActiveWorkbook.LinkSources(xlOLELinks)
' If the Links array is not empty, then open each
' linked workbook. If the array is empty, then
' display an error message.
If Not IsEmpty(Links) Then
For I = 1 To UBound(Links)
ActiveWorkbook.SetLinkOnData Links(I), "LinkChange"
Next I
Else
MsgBox "This workbook does not contain any links " & _
"to other workbooks"
End If
End Sub

Quello che fa è rilevare il cambiamento della cella DDE e, in corrispondenza di tale cambiamento, fa partire la macro "LinkChange".

Ora si tratta dunque di strutturare la macro LinkChange in modo da ricopiare i dati che intercetta nella colonna di fianco.
Da lì poi con le formule normali si riesce a rispondere alle esigenze che ho citato nel primo post (min,max,iniziale,finale)

Qualcuno è in grado di aiutarmi a scrivere questa macro di copia valori?

MarcoGG
13-03-2008, 17:30
Sei riuscito con quel metodo ?

Io invece sono riuscito a risolvere il tuo quesito con qualche chiamata alle API ( ho chiamato da Excel il Timer di sistema... ), un paio di Sub ,e un bell'Array per i valori... :)

Kimiko
13-03-2008, 20:23
Fra 30 minuti ti posto tutto :D

Edit: prima del previsto

Dim bRunNow As Boolean
Sub Test1()
With ActiveWorkbook
bRunNow = .Worksheets("Foglio1").Range("C1").Value
If bRunNow Then .SetLinkOnData "FDF|Q!'F.MI;Last'", "Test2" Else .SetLinkOnData "FDF|Q!'F.MI;Last'", ""
End With
End Sub
Sub Test2()
ddedati = "C3:C3"
TWS = "Foglio1"
SWS = ActiveSheet.Name
Range(ddedati).Copy
Sheets(TWS).Select
If Range("C3").Value < Range("F2").Value Or Range("F2").Value = 0 Then Range("F2").Value = Range("C3").Value 'Calcolo Min
If Range("C3").Value > Range("E2").Value Or Range("E2").Value = 0 Then Range("E2").Value = Range("C3").Value 'Calcolo Max
Range("G2").Value = Range("C3").Value 'Calcolo Current
Sheets(SWS).Select
End Sub
Sub ButtonTest()
Test1
End Sub
Sub Restarta()
DeltaT = "00:03:00"
CellaFlag = "N1"
dati = "E2:G2"
DWS = "Foglio1"
CWS = ActiveSheet.Name
Range(dati).Copy
Sheets(DWS).Select
Range("J65536:L65536").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("G2").Copy
Range("I65536").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range(dati).Select
Selection.ClearContents
Sheets(CWS).Select
If Range(CellaFlag).Value = 0 Then
Range(CellaFlag).Interior.ColorIndex = xlNone
Exit Sub
End If
Application.OnTime Now + TimeValue(DeltaT), "Restarta"
Range(CellaFlag).Interior.ColorIndex = 3
End Sub

http://img152.imageshack.us/img152/2655/imgim9.th.jpg (http://img152.imageshack.us/my.php?image=imgim9.jpg)

Se hai qualche domanda specifica fai pure...

Mi piacerebbe sapere anche la tua soluzione, visto che cmq questa non mi soddisfa appieno.
Ciao e buona serata!

MarcoGG
13-03-2008, 22:25
Mi piacerebbe sapere anche la tua soluzione, visto che cmq questa non mi soddisfa appieno.
Ciao e buona serata!


Al momento sono abbastanza fuso, perciò niente preamboli, ti metto giù una breve introduzione e relativo codice completo della soluzione :D :

1. Ho un file Excel, che può contenere anche solo un foglio, Foglio1.

2. Foglio1 è organizzato come segue :
- Cella A1 : contiene i valori DDE.
- Colonne da B a F : Tabella valori ( 1 nuova riga ogni intervallo -> 180 sec. ).
- 2 CommandButton : Start e Stop registrazione valori.

Vedi figura :

http://www.freeimagehosting.net/uploads/th.8da35b8089.jpg (http://www.freeimagehosting.net/image.php?8da35b8089.jpg)

3. Codice che esegue il CommandButton START :

Private Sub CommandButton1_Click()

Sheets("Foglio1").Range("C2:F4").ClearContents
Sheets("Foglio1").Range("C2").FormulaR1C1 = Sheets("Foglio1").Range("A1").Value

intervallo = 180 'SECONDI
contaSecondi = 0
contaIntervalli = 2
CommandButton1.Enabled = False

ReDim arrayValori(0)

StartTimer

End Sub

4. Codice che esegue il CommandButton STOP :

Private Sub CommandButton2_Click()

EndTimer
CommandButton1.Enabled = True

End Sub

5. Codice da inserire in un MODULO :

Public intervallo As Integer
Public contaIntervalli As Integer
Public contaSecondi As Integer
Public arrayValori() As Double
Public TimerID As Long
Public TimerSeconds As Single

Public Declare Function SetTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long

Public Declare Function KillTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long) As Long

Public Sub StartTimer()
TimerSeconds = 1 'Intervallo di Intervento Timer in Secondi.
TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc)
End Sub

Public Sub EndTimer()
On Error Resume Next
KillTimer 0&, TimerID
End Sub

Public Sub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, _
ByVal nIDEvent As Long, ByVal dwTimer As Long)

AGG_ARRAY_VALORI (Sheets("Foglio1").Range("A1").Value)
If contaSecondi = intervallo Then
Sheets("Foglio1").Range("F" & contaIntervalli).FormulaR1C1 = Sheets("Foglio1").Range("A1").Value
Sheets("Foglio1").Range("D" & contaIntervalli).FormulaR1C1 = arrayValori(1)
Sheets("Foglio1").Range("E" & contaIntervalli).FormulaR1C1 = arrayValori(UBound(arrayValori))
ReDim arrayValori(0)
contaIntervalli = contaIntervalli + 1
contaSecondi = 0
End If
If (contaSecondi - 1) Mod intervallo = 0 And contaIntervalli > 2 Then
Sheets("Foglio1").Range("C" & contaIntervalli).FormulaR1C1 = Sheets("Foglio1").Range("A1").Value
End If
contaSecondi = contaSecondi + 1

End Sub

Public Sub AGG_ARRAY_VALORI(valore As Double)

Dim valRedim As Long
valRedim = UBound(arrayValori) + 1
ReDim Preserve arrayValori(valRedim)
arrayValori(valRedim) = valore
Dim Temp As Double
Dim i As Long
Dim j As Long
For j = 2 To UBound(arrayValori)
Temp = arrayValori(j)
For i = j - 1 To 1 Step -1
If (arrayValori(i) <= Temp) Then GoTo 10
arrayValori(i + 1) = arrayValori(i)
Next i
i = 0
10 arrayValori(i + 1) = Temp
Next j

End Sub

6. Provare... ;)

Kimiko
13-03-2008, 22:31
L'aspetto è professionale, più tardi (o domani, meglio :D) lo provo.

Grazie comunque.

MarcoGG
12-01-2009, 08:28
Ciao MarcoGG

Mi sono iscritto da poco e volevo ringraziarti :ave: x la macro (http://www.hwupgrade.it/forum/showthread.php?t=1698904) che hai messo a disposizione. Ai miei livelli trovo incredibile vedere comparire i dati ogni 3 minuti senza che questi vengano scritti prima da qualche parte :eek:
Ci ho messo un po’ per poterla utilizzare perché prima ho dovuto imparare da zero un po di VBA in quanto non sapevo quasi cosa era :rolleyes:
Ma non voglio farti perdere troppo tempo, volevo chiederti alcune cose e dei consigli :help: :


Ok, quoto qui da tuo pvt :


A volte succede che il DDE per qualche istante si resetta a zero e poi riparte con i dati precedenti : è possibile NON far rilevare lo ZERO alla macro ?


Questo è un comportamento che non è normale. Dipende da come hai implementato tu il DDE. Non è normale che la cella DDE si auto-resetti da sola senza motivo. Almeno, se ho capito ciò che intendi...


Vorrei utilizzarla su 3 titoli : x ottenere una cosa “non troppo pesante x il pc” conviene ampliare la macro o aprire x 3 volte il programma excel e usarne una singolarmente x ogni titolo ? (ho visto che se tenti di aprire un file mentre la macro è in funzione va in Debug ed excel si chiude, è normale ?)


Non so cosa intendi per "titoli", ma immagino tu voglia usare contemporaneamente 3 celle DDE nello stesso Workbook. Sì, lo puoi fare, a patto che la mole di lavoro da svolgere ad ogni intervallo non sia troppo onerosa. Se tenti di aprire un file nuovo dalla stessa istanza di Excel che sta eseguendo il tuo progetto DDE, è possibile che Excel causi un errore, dovuto al fatto che comunque l'uso dei timer in VBA viene ottenuto per "vie traverse", e non direttamente con oggetti dedicati come il Timer di VB6 o VB NET. Perciò ogni esecuzione di ulteriori operazioni manuali o macro su Workbook che hanno un timer DDE attivo potenzialmente porta ad errori, errori che si possono cmq intercettare ( istruzioni "On Error" )...
Chiaramente, se devi costruire un'applicazione complessa che fa pesante uso dei Timer, il mio consiglio è di utilizzare VB6 o VB NET, che offrono un ottimo supporto all'interazione con Excel.


Ho provato a far partire la macro ad una determinata ora ma non sono riuscito, è possibile ? (ho provato con la funzione Application.OnTime TimeValue("22:00:00"), "mia_Sub" ma senza successo).


Questa mi riservo di provarla, appena ho tempo. ;)

Pupic
12-01-2009, 12:40
Ciao marco,

Per quanto riguarda il DDE non l'ho implementato io ma è un collegamento alla banca dati tramite un programma da loro foirnito. L'azzeramento è dovuto al loro collegamento e non è 1 problema specifico dell'utenza (succede raramente, è solo un istante e non c'e perdita di dati..... solo che mi sballa il grafico:( )

Le celle DDE sono già 2 (ne ho aggiunta una io alla tua macro) e diventerebbero 6 :eek: ....... con tutti gli annessi ....... Magari provo a costruire il tutto e mi dai un tuo parere ......... anche perchè oltre al VBA conosco solo .... TVB o similari ..... ma li uso x gli sms col cellulare :D :D

MarcoGG
12-01-2009, 13:45
Ciao marco,

Per quanto riguarda il DDE non l'ho implementato io ma è un collegamento alla banca dati tramite un programma da loro foirnito. L'azzeramento è dovuto al loro collegamento e non è 1 problema specifico dell'utenza (succede raramente, è solo un istante e non c'e perdita di dati..... solo che mi sballa il grafico:( )


Beh, se usi il mio esempio pecedente, in cui inserisco i valori in un array, basterà intercettare i valori "0" ed evitare il loro inserimento. ;)

Per quanto riguarda l'ultimo problema, ossia la temporizzazione di una Macro ( Sub o Function ) si può risolvere semplicemente con le stesse chiamate API del mio esempio precedente.
In questo caso il codice necessario sarà qualcosa di simile a questo :

> In un Modulo :
Public TimerID As Long
Public TimerSeconds As Single

Public Declare Function SetTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long

Public Declare Function KillTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long) As Long

Public Sub StartTimer()
TimerSeconds = 1 'Intervallo di Intervento Timer in Secondi.
TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc)
End Sub

Public Sub EndTimer()
On Error Resume Next
KillTimer 0&, TimerID
End Sub

Public Sub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, _
ByVal nIDEvent As Long, ByVal dwTimer As Long)

Dim adesso As String
adesso = Format(Now, "yyyy/mm/dd hh:mm:ss")

Sheets("Foglio1").Range("A1").FormulaR1C1 = adesso

If CDate(adesso) = "2009/01/12 14:40:00" Then
'Lancio la macro desiderata :
MACRO
End If

End Sub

Public Sub MACRO()

MsgBox "MACRO Lanciata."

End Sub

> Pulsante per Start Timer :
Private Sub cmd_start_Click()

cmd_start.Enabled = False
StartTimer

End Sub

> Pusante per Stop Timer :
Private Sub cmd_stop_Click()

EndTimer
cmd_start.Enabled = True

End Sub

In questo caso, esattamente alle 14:40:00 della data specificata, la MACRO viene eseguita ! :cool:

Pupic
12-01-2009, 18:55
Grazie, sempre molto gentile:)

ora provo a mettere in pratica i tuoi suggerimenti ......... se per un po non mi senti non preoccuparti, sto sbattendo la testa :muro: sull'array :rolleyes:

ciao
pupic

Ps: ora ho capito che l' API non è l' "Associazione Programmatori Italiani" :eek: e non si usa il telefono x chiamarla :D :D

Pupic
18-01-2009, 19:02
Ciao Marco, ...... ancora io :)

volevo allegare il file del foglio completo dei 3 titoli x un tuo consiglio ma anche zippato supera la dimensione consentita:cry: (è di 1,44MB) ...... non so se sono possibili altre strade x l'invio.

Volevo chiederti informazioni sugli array (faccio riferimento al range "D" = arrayValori(1)) : nella tua macro, dove sono specificate le variabili dell'array ? E dove è specificato che sono relative alla cella A1 ?

Se ho fatto una domanda stupida:rolleyes: rimandami pure a settembre :(

MarcoGG
19-01-2009, 08:41
nella tua macro, dove sono specificate le variabili dell'array ?


Le "variabili dell'array" ? L'Array è pubblico, lo trovi nelle dichiarazioni ad inizio Modulo.

Public arrayValori() As Double

Non ho bisogno di altre variabili per contenere gli elementi dell'array, se è questo che intendevi, perchè con la Redim Preserve lo ridimensiono e gli passo sempre l'ultimo valore della cella DDE, e inoltre in questo modo gli elementi contenuti sono già ordinati... ;)


E dove è specificato che sono relative alla cella A1 ?


Qui :

AGG_ARRAY_VALORI (Sheets("Foglio1").Range("A1").Value)

Tutto il lavoro poi lo fa la Function...

Pupic
19-01-2009, 18:51
Grazie per i chiarimenti :)

ciao:cool:

aabye
23-01-2009, 18:18
ciao,

ho letto il tuo post "Dati real time x excel " ma sopratutto questo "[VBA] DDE+Excel "
un paio di anni fa ci ho perso un tot di tempo, dovendo poi rinunciare, per mancanza risultati,
per fare sostanzialmente la stessa cosa che cercavi di far tu...
e mi pare che avete in qualche modo risolto

io ho in una cella di excel i dati che arrivano in realtime, ( pz, o, h, l, c, ) tutti in una riga
quello che non sono mai riuscito a fare, e che mi servirebbe e che ogni minuto quella riga si "fissasse" con tutti i suoi valori e riprendesse il flusso di dati alla riga sotto, e cosi via per tutta la giornata
( il problema di recuperare dati persi o storici per ora non mi serve, mi basta il realtime della giornata strutturato nel modo che ho cercato di spiegarti )

mi potete aiutare? qualcuno e' riuscito a costruire un foglio excel che fa una roba simile?
mi fareste un enorme favore,,, sono zero a programmare, e non saprei neanche costruire una macro copiando il codice postato da MarcoGG

intanto grazie cmq
ciao
marco

MarcoGG
24-01-2009, 11:50
io ho in una cella di excel i dati che arrivano in realtime, ( pz, o, h, l, c, ) tutti in una riga
quello che non sono mai riuscito a fare, e che mi servirebbe e che ogni minuto quella riga si "fissasse" con tutti i suoi valori e riprendesse il flusso di dati alla riga sotto, e cosi via per tutta la giornata
( il problema di recuperare dati persi o storici per ora non mi serve, mi basta il realtime della giornata strutturato nel modo che ho cercato di spiegarti )


Magari potresti essere più preciso. I dati stanno tutti in una cella, o su più celle nella stessa riga ?
Da quello che ho capito, ogni minuto vorresti registrare i valori sulla stessa riga in cui sta la cella DDE ( o le celle DDE ), e poi spstare la riga-DDE verso il basso. Poco pratico, forse. Non sarebbe meglio copiare i valori su una nuova riga ad ogni scatto di clock, e mantenere la DDE sempre al suo posto ?

Pupic
24-01-2009, 15:59
Ciao Marco&Marco …… tutti Marco:D qui

La prima macro di Marco funziona egregiamente, devi solo partire da due soli dati DDE e cioè il “prezzo ultimo” e il volume, il resto lo fa la macro.
Capisco la tua necessità e la difficoltà di applicare la macro, anche se basta copiarla; ci ho lavorato anch’io parecchio partendo a studiare il VBA da zero (adesso non sono tanto più in là …… forse a 0,5:rolleyes: ). Se mi mandi l’indirizzo mail in MP te la giro e te la spiego. Ti avviso però che ancora non ho risolto i due problemi sopra : intercettare gli zeri, il più importante, e l’ora di partenza …… Marco(GG) lo so che hai scritto tutto ma ……. “so un po de coccio”:muro: ! Perdonami ;)
con gli array sono ancora in pieno oceano Atlantico su una barca a remi :sofico: e per l’orario le ho provate tutte ma :

Dim adesso As String
adesso = Format(Now, "yyyy/mm/dd hh:mm:ss")

Sheets("Foglio1").Range("A1").FormulaR1C1 = adesso
If CDate(adesso) = "2009/01/12 14:40:00" Then....


L’ho posizionato ovunque nella tua prima macro ma senza risolvere :mc: ….. in compenso sono riuscito a far fare alla macro cose turche :D

Buona domenica a tutti
Pupic

MarcoGG
25-01-2009, 10:28
Ti avviso però che ancora non ho risolto i due problemi sopra : intercettare gli zeri, il più importante, e l’ora di partenza …… Marco(GG) lo so che hai scritto tutto ma ……. “so un po de coccio”:muro: ! Perdonami ;)
con gli array sono ancora in pieno oceano Atlantico su una barca a remi :sofico: e per l’orario le ho provate tutte ma :

Dim adesso As String
adesso = Format(Now, "yyyy/mm/dd hh:mm:ss")

Sheets("Foglio1").Range("A1").FormulaR1C1 = adesso
If CDate(adesso) = "2009/01/12 14:40:00" Then....


L’ho posizionato ovunque nella tua prima macro ma senza risolvere :mc: …..

Intercettare gli zeri non è un problema, bastava una cosa del genere :

'Valori 0 non ammessi :
Dim V As Long
V = Sheets("Foglio1").Range("A1").Value
If V <> 0 Then AGG_ARRAY_VALORI (V)

Per la temporizzazione della Macro, anzitutto la riga :
Sheets("Foglio1").Range("A1").FormulaR1C1 = adesso
è ovviamente facoltativa ( serviva solo di debug ). Se la usi nella mio primo codice va ad interferire con la cella A1, la DDE, perciò crea solo casino.

Cmq, quel codice deve stare nella procedura TimerProc, non "ovunque", e adattato alle proprie esigenze... ;)

Pupic
25-01-2009, 19:33
Hai sbagliato nikname : al posto di MarcoGG dovevi sciegliere : :D MagoG :D

grazie:)

crzybear
10-06-2009, 08:49
ciao
ho trovato uesto post molto utile , in quanto volevo importare dati tramite dde e ho trovato la soluzione :)

volevo chiedervi se e' possibile implementare uno script vbs dove assegno i collegamenti DDE a delle variabili , che poi vengono restituite ad altre variabili di un altro programma.

leggendo la guida mi sembra di capire che devo chiamare un metodo ma non capisco quale sia di excel che esporta dati e li assegna ad una variabile di un programma esterno

MarcoGG
10-06-2009, 11:28
ciao
ho trovato uesto post molto utile , in quanto volevo importare dati tramite dde e ho trovato la soluzione :)

volevo chiedervi se e' possibile implementare uno script vbs dove assegno i collegamenti DDE a delle variabili , che poi vengono restituite ad altre variabili di un altro programma.

leggendo la guida mi sembra di capire che devo chiamare un metodo ma non capisco quale sia di excel che esporta dati e li assegna ad una variabile di un programma esterno

Con un semplice VBScript non ho mai provato. Tieni conto che per me anche lo stesso DDE di Excel è un po' una "forzatura", una tecnica praticabile, ma forse non tanto consigliabile. Il supporto VBA alle operazioni temporizzate non è certo al livello di VB6, e meno ancora a VB.NET...

In pratica vuoi realizzare un vbs che faccia da "ponte", leggendo dati e passandoli a variabili di un'altra applicazione ? E quest'altra applicazione cos'è ? Un'applicazione che hai sviluppato tu o... cosa ?

crzybear
10-06-2009, 13:56
ciao
l'applicazione a cui vorrei passare i dati e' questa : http://www.amibroker.com/

qui ce' un po di esempi di come usare gli script con ami :

quello che vorrei fare e' leggere i dati direttamente dalla stringa dde senza passare x excel , ma non so se e' possibile ?

oppure leggere i dati da 1 o + caselle che scelgo io sul foglio excel, dove sono presenti i collegamenti DDe e passarli all' altro programma

MarcoGG
10-06-2009, 16:08
Non conosco amibroker. Esattamente che fa ?
Perchè se produce una sorta di grafici in tempo reale sulla base di un database interno, le strade ipotetiche sono 3 :

1. Lasciar perdere amibroker e creare/aggiornare i grafici direttamente in Excel, facendo in modo che i range associati ai grafici siano calcolati direttamente dai campi DDE.

2. Se questo amibroker ha un file tipo-db da cui pesca i dati, trovare un modo tramite VBA di aggiornare tale database, magari via ODBC...

3. ( forse la più difficile ) Far dialogare direttamente VBA con amibroker.

In ogni caso, ripeto, sono pure teorie. Non ho letto alcuna documentazione su questo applicativo, e penso ci sia cmq da lavorare . Non credo sia così lineare come crearsi dei grafici dinamici su Excel, nè tanto immediata, come soluzione...

crzybear
10-06-2009, 23:09
ciao grazie mille x interessamento :)
si amibroker e' un programma che riceve dati in real time e costruisce grafici su un database interno .

ho letto che si puo' far dialogare il programma con altri programmi , come x es. excel ,tramite vbs o jscript , ho cercato sulla loro documentazione ma non ho trovato molto di piu' di qualche esempio base , forse se provo a mandargli un email al supporto mi danno qualche dritta in piu' ,(speriamo :rolleyes: )

ho trovato un esempio in rete di interfacciamento ma quando provo a farlo io creando collegamento e usando DDe mi si blocca :(

http://www.amibroker.com/library/detail.php?id=218&hilite=EnableScript

MarcoGG
11-06-2009, 11:15
si amibroker e' un programma che riceve dati in real time e costruisce grafici su un database interno .


E fa cose tanto speciali che non si possono rifare usando solo Excel ?
Potresti provare ad usare i grafici Excel, e ipotizzare per un momento di farti tutto da solo, se non è una via impraticabile...

Questo "database interno" di amibroker sta su un file separato ? Vedi se tramite documentazione o altro puoi risalire al formato e alla struttura di questo database...

crzybear
11-06-2009, 15:51
ciao marco
hai proprio ragione devo provare ad usare excel con i grafici ,su quei dati che ricavo dal dde vorrei farci qualche calcolo di tipo statistico, ese media var sqm ecc e qualche altro calcolo ,mi pare che excel offra tutto ciò in piu' ho trovato anche altro materiali utile gia' su excel.
ci provo da solo anche se non sono molto capace ,sopratutto sui grafici ,vorrei che si aggiornino ogni volta che si aggiunge un dato nuovo, ti potro' chiedere un aiuto , sempre se puoi ?

MarcoGG
11-06-2009, 20:05
ciao marco
hai proprio ragione devo provare ad usare excel con i grafici ,su quei dati che ricavo dal dde vorrei farci qualche calcolo di tipo statistico, ese media var sqm ecc e qualche altro calcolo ,mi pare che excel offra tutto ciò in piu' ho trovato anche altro materiali utile gia' su excel.
ci provo da solo anche se non sono molto capace ,sopratutto sui grafici ,vorrei che si aggiornino ogni volta che si aggiunge un dato nuovo, ti potro' chiedere un aiuto , sempre se puoi ?

Tu provaci. ;)
In linea di massima Excel è un ottimo strumento anche per analisi di tipo statistico. Se incontri difficoltà puoi sempre continuare a postare qui e vedremo di risolvere...
Non immaginavo che questo thread arrivasse a durare tanto, evidentemente le DDE sono più gettonate di quanto pensassi. :D

berni120
18-06-2009, 19:04
E' la prima volta che posto e scusatemi per le domande a cui , per chi conosce il problema , sembrano sceme.
a me servirebbe poter far memorizzare un dato da una cella che riceve i dati in DDE, diciamo A1, in qualche posto in modo da avere un dato al secondo diciamo per 10 o 20 secondi; sono valori intorno a 0,5 e possono essere superiori o inferiori a 0,5. Il passo successivo è quello di valutare se ci sono più valori > di 0,5 o più valori inferiori dei 10 disponibili. se nei 10 valori ci sono 6 con valore> di 0,5 allora è VERO altrimenti é FALSO. Naturalmente ad ogni nuovo valore ( all'undicesimo ) il primo viene eliminato dal conteggio. Grazie a chi vorrà gentilmente rispondermi
berni

MarcoGG
19-06-2009, 12:40
E' la prima volta che posto e scusatemi per le domande a cui , per chi conosce il problema , sembrano sceme.
a me servirebbe poter far memorizzare un dato da una cella che riceve i dati in DDE, diciamo A1, in qualche posto in modo da avere un dato al secondo diciamo per 10 o 20 secondi; sono valori intorno a 0,5 e possono essere superiori o inferiori a 0,5. Il passo successivo è quello di valutare se ci sono più valori > di 0,5 o più valori inferiori dei 10 disponibili. se nei 10 valori ci sono 6 con valore> di 0,5 allora è VERO altrimenti é FALSO. Naturalmente ad ogni nuovo valore ( all'undicesimo ) il primo viene eliminato dal conteggio. Grazie a chi vorrà gentilmente rispondermi
berni

E' una soluzione analoga a quella che avevo postato per Kimiko, mio post #9. Cerca di adattarlo al tuo caso... Ad es. potresti mettere i 10 valori da B2 a B11, poi, per ogni nuovo valore dall'11esimo in poi, shiftare in alto ( eliminando la riga 2 ). Il controllo così lo fai sempre su B2:B11 ( dovresti cavartela con un CONTA.SE()... ), e in B1 metti Vero o Falso...

monterino
11-12-2009, 15:41
Ciao Marco, approfitto della tua disponibilità per sottoporti il mio problema:
2) vista la mia totale ignoranza in tematiche di programmazione (non saprei nemmeno ricopiare i codici che hai suggerito nei precedenti post), ho cercato e trovato un file già impostato in rete che però ogni tanto mi da questo errore: "Run time error 9: subscript out of range"
3) azionando il debug mi da questa cosa illegibile (per me, spero non per te!) mostrando evidenziata in giallo la riga che io ti posto in bold e sottolineata:

On Error Resume Next
Cells(1, 1) = "STOP Timer"
FERMA = True
Application.OnTime DateAdd("n", INTERVALLO, Now), "RoutineOnTime", , False
End Sub

Public Sub RoutineOnTime() 'da eseguirsi ad ogni "INTERVALLO"
Dim R As Long, v As Double
If FERMA Then Exit Sub
With Sheets("input dde") ' si DEVE specificare il foglio su cui agire
'incrementa il numero di dati/riga
R = Val(.Range("Ndati").Value) + 1
.Range("Ndati").Value = R
R = R + 16
'------- copia i dati ---------------
.Cells(R, 2) = .Cells(6, 4) 'High
.Cells(R, 3) = .Cells(6, 5) 'Low
.Cells(R, 4) = .Cells(6, 6) 'Prezzo
.Cells(R, 5) = .Cells(6, 3) 'Open
.Cells(R, 6) = Now
.Cells(R, 7) = Now
'--------------- re-imposta la temporizzazione:
.Cells(1, 1) = "Prossima rilevazione: " & DateAdd("n", INTERVALLO, Now)
End With
If INTERVALLO > 0 Then Application.OnTime DateAdd("n", INTERVALLO, Now), "RoutineOnTime"
End Sub

Riesce a dirmi come risolvere questo problema, o eventualmente a dirmi come fare per crearmi un file che risponda alle mie esigenze ex-novo (in quest'ultimo caso, ti prego, considera la mia totale ignoranza informatica!!!)?

grazie mille a te o a chi altri vorrà aiutarmi
ciao

monterino
13-12-2009, 12:13
per favore, qualcuno mi aiuti!

MarcoGG
14-12-2009, 11:54
vista la mia totale ignoranza in tematiche di programmazione (non saprei nemmeno ricopiare i codici che hai suggerito nei precedenti post)



ti prego, considera la mia totale ignoranza informatica!!!


E' proprio questo il problema principale. Difficile aiutare chi non sa la lingua e nemmeno sa con precisione cosa-vuole-dire...


ho cercato e trovato un file già impostato in rete che però ogni tanto mi da questo errore: "Run time error 9: subscript out of range"


Personalmente ti consiglio di colmare le tue lacune e impararti quel po' di Excel VBA che ti serve. Molto più utile, anche se richiede più tempo, che scaricare soluzioni malfunzionanti e cercare di metterle a posto ( e anche qui, di tempo spesso ne va via parecchio... ) ;) .

In conclusione aggiungo una mia considerazione personale, perchè spesso vengo contattato anche in Pvt da utenti che chiedono aiuto su soluzioni Excel basate ( a volte pesantemente basate ) sul DDE. Nonostante abbia contribuito a questa discussione in modo direi abbastanza decisivo e approfondito, vorrei fosse chiaro che io il DDE non lo consiglio a nessuno. Voglio dire, a me personalmente il DDE non piace e preferirei di gran lunga un'applicazione VB.NET che gestisce tempi ed eventi e che legge/scrive file Excel, nella stragrande maggioranza dei casi in cui gli utenti pensano che il DDE sia la strada principale ( o addirittura l'unica ) da percorrere.

Sinda
15-03-2010, 00:26
Intercettare gli zeri non è un problema, bastava una cosa del genere :

'Valori 0 non ammessi :
Dim V As Long
V = Sheets("Foglio1").Range("A1").Value
If V <> 0 Then AGG_ARRAY_VALORI (V)

Per la temporizzazione della Macro, anzitutto la riga :
Sheets("Foglio1").Range("A1").FormulaR1C1 = adesso
è ovviamente facoltativa ( serviva solo di debug ). Se la usi nella mio primo codice va ad interferire con la cella A1, la DDE, perciò crea solo casino.

Cmq, quel codice deve stare nella procedura TimerProc, non "ovunque", e adattato alle proprie esigenze... ;)

:help:
Anch'io mi sto scornando con questo problema, ma purtroppo per me parlate arabo. :(
Non sareste così gentili da condividere il risultato ottenuto in modo da poter aiutare anche me? Sono troppo vecchio per capire queste cose, ho imparato molte funzioni di excel e come registrare una macro semplice semplice (tipo copia e incolla), ma questo da solo non ce la farò mai.

zuper
15-03-2010, 08:13
:help:
Anch'io mi sto scornando con questo problema, ma purtroppo per me parlate arabo. :(
Non sareste così gentili da condividere il risultato ottenuto in modo da poter aiutare anche me? Sono troppo vecchio per capire queste cose, ho imparato molte funzioni di excel e come registrare una macro semplice semplice (tipo copia e incolla), ma questo da solo non ce la farò mai.

spiega un pochino meglio cosa ti serve :)

e cmq...nessuno è mai troppo vecchio :D:D

MarcoGG
15-03-2010, 17:59
:help:
Anch'io mi sto scornando con questo problema, ma purtroppo per me parlate arabo. :(
Non sareste così gentili da condividere il risultato ottenuto in modo da poter aiutare anche me? Sono troppo vecchio per capire queste cose, ho imparato molte funzioni di excel e come registrare una macro semplice semplice (tipo copia e incolla), ma questo da solo non ce la farò mai.

D'accordo con zuper per il discorso età ( ho conosciuto 60enni ben più svegli ed elastici della maggior parte dei 20enni che ho incontrato ).

Vedo che DDE appassiona molti utenti, e francamente la cosa mi stupisce non poco. Si tratta di una tecnica non solo datata, ma anche ufficialmente sconsigliata da Microsoft dal punto di vista della sicurezza. Tanto per dire, realizzare una semplice coppia server-DDE / client-DDE in VB6 è più immediato che in VB.NET, dato che in quest'ultimo è una pratica deprecata fin dalle prime versioni.

La cosa buffa è che io non ho mai fatto uso di DDE in vita mia, e mi trovo qui a spiegare a questo e a quello come si fa, o si dovrebbe fare. :D

A questo punto sarebbe interessante proporre un esempio, come da te chiesto, magari da postare direttamente qui.
Gli esempi che ho postato più sopra non fanno uso di reali celle DDE. In realtà li ho realizzati "simulando" celle DDE con procedure timer.

Se sei/siete d'accordo inizierei con un WorkBook di base, che contiene una cella ( tipo A1 su Foglio1 ) DDE funzionante. Se hai/avete esempi validi, poi posso procedere a reinserire quel codice completo in un WorkBook di esempio da mettere qui per chiunque voglia visionarlo e/o migliorarlo. ;)

Sinda
16-03-2010, 07:02
D'accordo con zuper per il discorso età ( ho conosciuto 60enni ben più svegli ed elastici della maggior parte dei 20enni che ho incontrato ).

Vedo che DDE appassiona molti utenti, e francamente la cosa mi stupisce non poco. Si tratta di una tecnica non solo datata, ma anche ufficialmente sconsigliata da Microsoft dal punto di vista della sicurezza. Tanto per dire, realizzare una semplice coppia server-DDE / client-DDE in VB6 è più immediato che in VB.NET, dato che in quest'ultimo è una pratica deprecata fin dalle prime versioni.

La cosa buffa è che io non ho mai fatto uso di DDE in vita mia, e mi trovo qui a spiegare a questo e a quello come si fa, o si dovrebbe fare. :D

A questo punto sarebbe interessante proporre un esempio, come da te chiesto, magari da postare direttamente qui.
Gli esempi che ho postato più sopra non fanno uso di reali celle DDE. In realtà li ho realizzati "simulando" celle DDE con procedure timer.

Se sei/siete d'accordo inizierei con un WorkBook di base, che contiene una cella ( tipo A1 su Foglio1 ) DDE funzionante. Se hai/avete esempi validi, poi posso procedere a reinserire quel codice completo in un WorkBook di esempio da mettere qui per chiunque voglia visionarlo e/o migliorarlo. ;)

Penso che la cosa appassioni molto perchè quasi tutte le banche forniscono questi dati gratuitamente. Grazie a questo è possibile fare elaborazioni dati a proprio piacimento. Purtroppo le banche forniscono questi dati che funzionano solo dopo aver fatto il login nel proprio account ed avviato il relativo programma per ricevere i dati dde, ma questo funziona solo per il possessore del conto corrente, non saprei prorio dove ricevere dati dde gratis.
La tua idea farebbe felici davvero moltissimi utenti!
Ora provo a cercare un servizio dde in real time gratis, ce ne sono molti, ma sono eod (end of day) cioè forniscono i dati di borsa a fine giornata, andrebbe bene ugualmente per il test?

MarcoGG
16-03-2010, 08:32
La tua idea farebbe felici davvero moltissimi utenti!
Ora provo a cercare un servizio dde in real time gratis, ce ne sono molti, ma sono eod (end of day) cioè forniscono i dati di borsa a fine giornata, andrebbe bene ugualmente per il test?

Quindi avremmo un refresh al giorno ? :mbe:
Io pensavo ad un DDE che mi fornisce anche solo un dato, ma ovviamente con una certa frequenza, tipo un refresh al secondo, o comunque ogni tot secondi... Non c'è proprio nulla al di là del discorso banche ?

zuper
16-03-2010, 08:46
Penso che la cosa appassioni molto perchè quasi tutte le banche forniscono questi dati gratuitamente. Grazie a questo è possibile fare elaborazioni dati a proprio piacimento. Purtroppo le banche forniscono questi dati che funzionano solo dopo aver fatto il login nel proprio account ed avviato il relativo programma per ricevere i dati dde, ma questo funziona solo per il possessore del conto corrente, non saprei prorio dove ricevere dati dde gratis.
La tua idea farebbe felici davvero moltissimi utenti!
Ora provo a cercare un servizio dde in real time gratis, ce ne sono molti, ma sono eod (end of day) cioè forniscono i dati di borsa a fine giornata, andrebbe bene ugualmente per il test?

boh a sto punto preferisco farmi una query web su qualche sito che "regala" questi dati, tanto piuttosto che avere un solo refresh al giorno, anche se ritardato, mi basta refreshare la query ;)

Sinda
16-03-2010, 09:13
Quindi avremmo un refresh al giorno ? :mbe:
Io pensavo ad un DDE che mi fornisce anche solo un dato, ma ovviamente con una certa frequenza, tipo un refresh al secondo, o comunque ogni tot secondi... Non c'è proprio nulla al di là del discorso banche ?

Mi sembra di capire che c'è chi scarica dati dde gratis da televideo, ma non capisco se tramite un'apposita scheda hardware o direttamente su excel. Altri dde non ne conosco ora provo a cercare qlc flusso continuo magari ritardato dei classici 20 minuti, andrebbe più che bene.

Sinda
18-03-2010, 19:14
Purtroppo non sono riuscito a trovare nulla come dde free anche ritardato, ho trovato solo questi consigli in "arabo":
Fare query (tipo ogni 60 secondi) su tabelle internet da yahoo altri ...."fornitori free" della rete.
Da excel 2003 in poi riesci a catturare anche delle singole tabelle di
pagine www
Possono essere di aiuto?

zuper
18-03-2010, 20:20
Purtroppo non sono riuscito a trovare nulla come dde free anche ritardato, ho trovato solo questi consigli in "arabo":
Fare query (tipo ogni 60 secondi) su tabelle internet da yahoo altri ...."fornitori free" della rete.
Da excel 2003 in poi riesci a catturare anche delle singole tabelle di
pagine www
Possono essere di aiuto?

:read:

boh a sto punto preferisco farmi una query web su qualche sito che "regala" questi dati, tanto piuttosto che avere un solo refresh al giorno, anche se ritardato, mi basta refreshare la query ;)

MarcoGG
18-03-2010, 23:03
Purtroppo non sono riuscito a trovare nulla come dde free anche ritardato, ho trovato solo questi consigli in "arabo":
Fare query (tipo ogni 60 secondi) su tabelle internet da yahoo altri ...."fornitori free" della rete.
Da excel 2003 in poi riesci a catturare anche delle singole tabelle di
pagine www
Possono essere di aiuto?

Ma fare query significherebbe non fare più uso di celle DDE. O sbaglio ?
Se dobbiamo creare un esempio DDE, che DDE sia.

Io lascerei perdere a questo punto i servizi online, e cercherei di creare una simulazione DDE con una piccola applicazione in locale, scritta in VB6 ( che a quanto pare ha un supporto nativo al DDE ) che genera ad esempio alcuni numeri. A questo punto si crea il WorkBook Excel destinato a ricevere i dati DDE, su cui poi costruire l'esempio.
A prova di quanto dico vi linko questo thread, creato da me su MSDN in cui chiedo lumi su un esempio funzionante che ho già realizzato :
http://social.msdn.microsoft.com/Forums/en/isvvba/thread/ae4bec23-bcbb-475b-90cf-81c98c7c1f99

I problemi non da poco di questa soluzione sono essenzialmente 3 :

1. E' l'applicazione VB6 che indirizza il file Excel, mentre in una situazione realistica dovrebbe essere il contrario, ossia apro il WorkBook, do il via alla "registrazione" ed è Excel che "sente" se l'applicazione è pronta e se sta inviando dati o meno.

2. A quanto pare non c'è modo di intercettare gli eventi DDE in Excel, dato che anche l'evento Change non sembra accorgersi dell'arrivo di dati DDE sulla cella.

3. Non c'è modo, nell'applicazione VB6, di specificare, oltre al nome del file Excel, anche il nome del Foglio.

E' quel po' che sono riuscito a fare per ora, visto lo scarsissimo tempo a disposizione, oltre al fatto che non è certo una mia priorità ( molto sinceramente spero di non aver mai a che fare con il DDE in vita mia :D - pessima tecnologia, non mi stupisce che MS l'abbia cestinata ).

Chiunque abbia sotto mano qualcosa di pratico su come realizzare un piccolo "generatore" di numeri DDE in VB6, e su come gestire gli eventi dei dati DDE in arrivo in Excel, si faccia vivo. Io intanto continuo la ricerca...

MarcoGG
21-03-2010, 14:55
Ok, ce l'ho fatta. :D
Visto che dal Forum di MSDN non arrivano soluzioni, come si dice, chi fa da sè fa per tre.

Posto qui questi files per chiunque fosse interessato.

1. GeneratoreValori_DDE.exe : l'applicazione VB6 che genera, in questo caso, una semplice serie di valori numerici crescenti.
L'esempio è banale, a questo livello, ma ho preferito mantenermi sull'essenziale. Ovvio che potrei avere un Generatore VB6 con N controlli che generano N valori, anche su tempi diversi e che il WorkBook-Listener potrebbe avere le corrispondenti N Celle che li ricevono...

2. Listener_DDE.xls : WorkBook Excel con il codice VBA essenziale per ricevere i dati DDE e inoltre per accorgersi se e quando i dati arrivano effettivamente.

75410

Come far girare l'esempio :

1. Lanciare in esecuzione GeneratoreValori_DDE.exe e Listener_DDE.xls.

2. Selezionare sul Generatore l'intervallo in secondi desiderato tra un invio dati DDE e il successivo, e poi Click su "Attiva Invio Dati DDE".

3. Sul WorkBook Click su "Attiva Ascolto DDE".

A questo punto c'è tutto l'essenziale per studiarci su, e ovviamente per completarlo e complicarlo a piacere.
Buon Divertimento ! :cool:

enz
11-08-2010, 19:56
Salve a tutti,
il DDE della fineco trasferisce i dati relavitivi ai volumi esclusivamente quelli cumulati. Esempio:
alle 11:00 sono stati scambiate (dall'apertura fino alle 11.00) 10.000 azioni del titolo X.
Alle 11.01 (il secondo successivo), sono state scambiate 200 azioni...il DDE mi fornisce il dato cumulato, ossia 11.200.
A me interessebbe, invece, il trade volume ossia che in una cella mi mostrasse 200. In altri termini, mi servirebbe sapere ad ogni cambiamento del volume, di quanto e' cambiato il volume rispetto al volume precedente.
Credo che la cosa si possa fare con una macro vba...qualcuno mi puo' aiutare? Grazie in anticipo

magnetex
22-08-2010, 20:58
X MarcoGG

Dato la tua preparazione e conoscenza di excel e DDE Fineco (e dato che io non ci capisco una mazza di excel)
A me servirebbe solo catturare i dati intraday (solo chiusura ,niente volumi min. o max. solo la chiusura) FTSE MIB a 15minuti e 30 minuti e che rimangano memorizzati rispettivamente su una colonna di excel in modo da poterli copiare quando ho tempo su un ts ciclico.
Ci ho provato per giorni ma dato la mia incomprensione delle + basilari formule di excel .......ho perso solo tempo:muro:

jumbo78
06-06-2011, 08:46
Al momento sono abbastanza fuso, perciò niente preamboli, ti metto giù una breve introduzione e relativo codice completo della soluzione :D :

1. Ho un file Excel, che può contenere anche solo un foglio, Foglio1.

2. Foglio1 è organizzato come segue :
- Cella A1 : contiene i valori DDE.
- Colonne da B a F : Tabella valori ( 1 nuova riga ogni intervallo -> 180 sec. ).
- 2 CommandButton : Start e Stop registrazione valori.

Vedi figura :

http://www.freeimagehosting.net/uploads/th.8da35b8089.jpg (http://www.freeimagehosting.net/image.php?8da35b8089.jpg)

3. Codice che esegue il CommandButton START :

Private Sub CommandButton1_Click()

Sheets("Foglio1").Range("C2:F4").ClearContents
Sheets("Foglio1").Range("C2").FormulaR1C1 = Sheets("Foglio1").Range("A1").Value

intervallo = 180 'SECONDI
contaSecondi = 0
contaIntervalli = 2
CommandButton1.Enabled = False

ReDim arrayValori(0)

StartTimer

End Sub

4. Codice che esegue il CommandButton STOP :

Private Sub CommandButton2_Click()

EndTimer
CommandButton1.Enabled = True

End Sub

5. Codice da inserire in un MODULO :

Public intervallo As Integer
Public contaIntervalli As Integer
Public contaSecondi As Integer
Public arrayValori() As Double
Public TimerID As Long
Public TimerSeconds As Single

Public Declare Function SetTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long

Public Declare Function KillTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long) As Long

Public Sub StartTimer()
TimerSeconds = 1 'Intervallo di Intervento Timer in Secondi.
TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc)
End Sub

Public Sub EndTimer()
On Error Resume Next
KillTimer 0&, TimerID
End Sub

Public Sub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, _
ByVal nIDEvent As Long, ByVal dwTimer As Long)

AGG_ARRAY_VALORI (Sheets("Foglio1").Range("A1").Value)
If contaSecondi = intervallo Then
Sheets("Foglio1").Range("F" & contaIntervalli).FormulaR1C1 = Sheets("Foglio1").Range("A1").Value
Sheets("Foglio1").Range("D" & contaIntervalli).FormulaR1C1 = arrayValori(1)
Sheets("Foglio1").Range("E" & contaIntervalli).FormulaR1C1 = arrayValori(UBound(arrayValori))
ReDim arrayValori(0)
contaIntervalli = contaIntervalli + 1
contaSecondi = 0
End If
If (contaSecondi - 1) Mod intervallo = 0 And contaIntervalli > 2 Then
Sheets("Foglio1").Range("C" & contaIntervalli).FormulaR1C1 = Sheets("Foglio1").Range("A1").Value
End If
contaSecondi = contaSecondi + 1

End Sub

Public Sub AGG_ARRAY_VALORI(valore As Double)

Dim valRedim As Long
valRedim = UBound(arrayValori) + 1
ReDim Preserve arrayValori(valRedim)
arrayValori(valRedim) = valore
Dim Temp As Double
Dim i As Long
Dim j As Long
For j = 2 To UBound(arrayValori)
Temp = arrayValori(j)
For i = j - 1 To 1 Step -1
If (arrayValori(i) <= Temp) Then GoTo 10
arrayValori(i + 1) = arrayValori(i)
Next i
i = 0
10 arrayValori(i + 1) = Temp
Next j

End Sub

6. Provare... ;)



Ciao a tutti,
ho trovato questo vecchio messaggio che mi e' stato molto utile.
Solo che i dati vengono aggiunti uno sotto l'altro...
e' possibile fare in modo che i nuovi dati stiano in cima e man mano scalino quelli vecchi ???

Vi ringrazio in anticipo!!

;)

jumbo78
15-06-2011, 18:46
Proprio nessuno ??
Neanche un suggerimento, un link, un keyword da cercare nell'help ??
Grazie ancora in anticipo :-)

tosca
13-06-2013, 14:04
Up..!

Anch'io ho trovato questo messaggio per caso e mi è stato di grande aiuto.
Un ringraziamento a MarcoGG per il lavoro svolto. E una supplica: poiché la routine utilizza le api, suppongo entri in conflitto con altri fogli excel su cui girano delle macro chiudendo addirittura Excel. E' possibile inserire una sorta di controllo degli errori per impedirlo?
Naturalmente la richiesta non è indirizzata solo a MarcoGG ma a chiunque sia in grado di darmi una mano.
Ringrazio anticipatamente.

tosca