Condividi:        

[Excel]Scaricare dati titoli di borsa tramite DDE

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

[Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Joker77 » 15/01/11 21:01

Salve a tutti, sono nuovo del forum e ho un problema con un foglio di excel che scarica dati tramite DDE.
I dati che mi arrivano tramite DDE sono i volumi scambiati su un titolo quotato in borsa. Questi dati sono progressivi e cumulativi, ad esempio 1, 10, 15, 16, 20, 30, 31, ecc.
In realtà a me servirebbero solo i parziali in modo da avere le quantità in acquiso e quelle in vendita, quindi solo 1, 9, 5, 1, 4, 10, 1, ecc.

..... questo è il codice che ho scritto e che non funziona
Codice: Seleziona tutto
Public Sub Connessione()
ActiveWorkbook.SetLinkOnData "DDESrv|TLINK!EU_SHH1_CV", "Foglio1.LinkChangeSC"
Primo_SC = True
 End Sub

Public Sub LinkChangeSC()
If Primo_SC = True Then
    A_SC = 0 'sono le quantità in acquisto
    V_SC = 0 'sono le quantità in acquisto
    Tot_SC = Range("G2").Value 'sono le quantità totali. In G2 c'è il link DDE
    U_SC = Range("F2").Value 'è l'ultimo prezzo scambiato. In F2 c'è il link DDE
    Primo_SC = False
    Exit Sub
Else
' Range("G2").Value = "=Excel|Cartel1.xlsx!'R2C4'"
    If Range("F2").Value <> U_SC Then
        If Range("F2").Value > U_SC Then 'se il prezzo  è > del precedente è un acquisto
            A_SC = A_SC + (Range("G2").Value - Tot_SC)
            Range("H2") = A_SC
        Else 'se il prezzo  è < del precedente è una vendite
            V_SC = V_SC + (Range("G2").Value - Tot_SC)
            Range("I2") = V_SC
        End If
    Else 'se il prezzo  è = al precedente verifico il book
        If Range("F2") >= Range("D2") Then 'ho un acquisto. In D2 c'è il relativo link DDE
            A_SC = A_SC + (Range("G2").Value - Tot_SC)
            Range("H2") = A_SC
        Else 'ho una vendita
            V_SC = V_SC + (Range("G2").Value - Tot_SC)
            Range("I2") = V_SC
        End If
    End If
    Tot_SC = Range("G2").Value
    U_SC = Range("F2").Value
End If
End Sub
Purtroppo non funziona, e i problemi sono due.
Ho provato a simulare il DDE con l'invio dei valori da un altro foglio di excel, in modo da provare il debug step by step con F8, ed problemi individuati sono:

1) le quantità in acuisto e vendita (variabili V_SC e A_SC) sono sempre = 0. Praticamente vede sempre G2 e Tot_SC dello stesso valore!!!!!! stranissimo. il problema l'ho risolto con quest'itruzione - Range("G2").Value = "=Excel|Cartel1.xlsx!'R2C4'" - dopo il primo else (quella che nel codice è commentata.
E' come se allo scaturire dell'evento OnData excel leggesse il valore di G2 precedente al cambiamento dovuto dal DDE. Come mai' sapete qualcosa in più in merito?

2) l'if - If Range("F2").Value <> U_SC Then - viene completamente ignorato!!!! o meglio, se faccio il debug con F8 funziona tutto perfettamente, mentre nell'esecuzione automatica no e va direttamente all'else di verifica dal book.
lo capisco perchè:
ask bid ultimo volumi
Codice: Seleziona tutto
D2       E2       F2          G2
6         5        5           100
se i valori cambiano inquesto modo
Codice: Seleziona tutto
D2       E2       F2          G2
6          5        7           110
e successivamente in
Codice: Seleziona tutto
D2       E2       F2          G2
6          5        6           120
mi vedo aumentare le quantità in acquisto (A_SC) mentre dovrebbero aumentare quelle in vendita (V_SC)

Grazie a tutti per il supporto.
Joker77
Newbie
 
Post: 9
Iscritto il: 14/01/11 23:03

Sponsor
 

Postdi Anthony47 » 16/01/11 03:09

Ciao e benvenuto nel forum.
Per cominciare metti la Sub LinkChangeSC() in un "Modulo" (non nel modulo di codice di Foglio1).
Poi dovresti chiarire in quali celle hai le formule dde e a quali dati queste celle si riferiscono; un paio di queste formule potrebbero anche aiutare..
Per ora non sto' a mettere in discussione la logica secondo cui se il prezzo e' aumentato allora e' un acquisto.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

[Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Joker77 » 16/01/11 12:59

Ciao Anthony e grazie, innanzitutto.
Nel codice che ho postato c'è un errore di copia incolla, l'istruzione commentata
- ' Range("G2").Value = "=Excel|Cartel1.xlsx!'R2C4'" - in realtà è - 'Range("G2").Value = "=DDESrv|TLINK!EU_SHH1_CV" - la prima riportata è il riferimento al foglio excel che utilizzo per simulare il DDE.

Ho provato a mettere la Sub LinkChangeSC() in un Modulo ma le cose non cambiano :cry:
magari c'è qualcosa che sbaglio:
- la sub deve rimanere sempre come Public sub?
- le variabili, che fino ad ora erano dichiarate come public nel foglio 1 possono continuare a rimanere in questo modo?

Per le formule avevo provato a commentarle nel codice, ma dopo postato sono è stata eliminata tutta la struttura ed infatti così è più difficile individuarle. Provo ed essere più chiaro.
In D2 c'è il link DDE dell'ask (sarebbe il prezzo in acquisto del book)
In E2 c'è il link DDE della bid (sarebbe il prezzo in vendita del book, ma che comunque non è utilizzato nella macro)
In F2 c'è il link DDE dell'ultimo prezzo scambiato
In G2 c'è il link DDE dei volumi totali
Per il resto non ho formule, la macro mi scrive direttamente le quantità totali in acquisto e vendita:
In H2 gli acquisti (variabile A_SC)
in I2 le vendite (variabile V_SC)

Se posso farlo, posso inviarti i file di excel, sia quello con il codice che qello già settato per simulare il DDE.
Ancora grazie
Joker77
Newbie
 
Post: 9
Iscritto il: 14/01/11 23:03

[Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Anthony47 » 17/01/11 00:00

Ti ho fatto spostare la macro in un modulo perche’ secondo Microsoft nei “moduli di foglio” ci stanno solo le macro di evento, il resto e’ meglio che stia su un Modulo.
Se hai anche delle variabili dichiarate in Foglio1 vanno spostate anche quelle righe di dichiarazione. E se il problema era che le variabili (es V_SC e A_SC) non mantengono il loro valore da una esecuzione all’ altra della macro credo sia proprio perche’ ora quelle variabili non sono dichiarate correttamente. Quindi questa e’ LA PRIMA NUOVA COSA da fare.

"Public" dichiara l’ area di validità della Sub o delle variabili; Public (se inserito in un Modulo...) indica che quell’ item e’ visibile da tutti i Moduli presenti in memoria.
Non so quanti Moduli di software hai nel tuo progetto da giustificare l’ uso di Public; il rischio comunque e’ solo di conflitto con altri progetti di altri file excel, ma dovrebbe uscire un messaggio di variabile (o macro) non univoca.

Se vuoi inviare un file va bene, purche’ siano a complemento di una buona descrizione del problema; trovi le istruzioni qui: viewtopic.php?f=26&t=80395
Ad esempio non ho capito quale e’ l’ obiettivo finale della macro, e ragionare su una singola riga senza avere in mente il complessivo in genere non porta a buone idee
E nel caso specifico c' e' anche da considerare che solo tu hai l' abiente effettivo di lavoro in cui fare prove esaustive.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Joker77 » 17/01/11 18:58

Ciao, purtroppo il risultato non cambia. Comunque l'obiettivo finale della macro è quella di avere i volumi totali in acquisto e quelli totali in vendita, visto che purtroppo i dati forniti dal sever sono dei cumulativi totali, senza nessuna distinzione.
Joker77
Newbie
 
Post: 9
Iscritto il: 14/01/11 23:03

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Joker77 » 17/01/11 18:59

Questi sono i files, l'unica cosa devi aprirli in due istanze di excel separate altrimenti ti da errore:
http://rapidshare.com/files/443087738/Volumi.xlsm il file vero e proprio collegao al DDE e contenente la macro.
http://rapidshare.com/files/443087782/ServerDDE.xlsx il file che utilizzo per simulare il server DDE.
Joker77
Newbie
 
Post: 9
Iscritto il: 14/01/11 23:03

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Anthony47 » 18/01/11 02:11

Allora, ho guardato i file che hai pubblicato e ricreato l’ ambiente di test.
Quello che vedo e’ che quando cambio un valore all’ interno del file diciamo “simulante dde” i valori vengono replicati all’ interno del file “Volumi”, e la macro LinkChangeSC di Modulo1 parte (c’ e’ una seconda LinkChangeSC su Foglio2, con codice diverso; va eliminata o spostata con altro nome su un Modulo)

Ora la tua prima lamentela era che “le variabili V_SC e A_SC sono sempre = 0. Praticamente vede sempre G2 e Tot_SC dello stesso valore. [. . . .] E’ come se allo scaturire dell’ evento OnData excel leggesse il valore di G2 precedente al cambiamento dovuto dal DDE”.
Effettivamente quando comincia la macro, G2 (stiamo ipotizzando quindi che sia variato D2 nel file ServerDDE) ha ancora il valore non variato, valore che poi si aggiorna nel corso dell’ esecuzione della macro.
Non ho una spiegazione, bisognerebbe chiedere agli amici di Bill; pero’ e' evidente che “l’ evento modifica” viene processato in parallelo da excel e dal vba, e il vba e’ piu’ rapido di excel (nel caso specifico).
Inserendo in testa alla macro un delay di 0.1 sec il problema non si presenta (sulla mia macchina).
L’ ho fatto inserendo queste istruzioni in testa alla macro:
Codice: Seleziona tutto
Sub LinkChangeSC()
attesa:
DoEvents
If abc + 0.1 > Timer Then GoTo attesa


Sul secondo problema, credo che qui ci sia un errore di logica: tu non avrai due cambiamenti contemporanei, ma prima uno e poi l’ altro; il risultato e’ che quando cambia la cella F2 non e’ ancora cambiata la cella G2; ergo quando vai a calcolare V_SC = V_SC + (Range("G2").Value - Tot_SC), essendo stato posto Tot_SC = G2 il risultato non puo’ che essere “zero”.
Se eseguendolo passo passo il risultato e’ diverso, cioe’ ottieni quello che desideri, probabilmente e’ perche’ esegui la macro solo dopo che hai cambiato sia F2 che G2.

Devi realizzare una logica “a stati”, per cui il cambiamento di un parametro ti porta in uno stato il cui significato dipendera’ dal successivo cambiamento; senza ignorare la possibilita’ che i due cambiamenti possano avvenire contestualmente o in ordine inverso.

Sono purtroppo ignorante sui processi di gestione dati di borsa, quindi piu’ di tanto non posso dire.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Joker77 » 18/01/11 19:04

Ciao Anthony, sì la macro nel foglio2 è un refuso di vari tentativi che va completamente eliminata.
Ho provato ad inserire il ritardo ma mi da sempre un messaggio di errore. In ogni caso, purtroppo, questa non sarebbe comunque la soluzione perchè sui titoli liquidi quel ritardo farebbe perdere diversi scambi.
Ho provato a fare delle simulazioni a mercato aperto, cercando di capire qualcosina di più che con l'ausilio di excel come sorgente DDE.

Credo che il problema maggiore sia, come appunto hai individuato, nell'esecuzione contemporanea di VBA ed excel che hanno due velocità diverse, quindi anche se cambio un valore alla fine della macro in realtà per il VBA è ancora lo stesso valore perchè lo legge dalla cella.
Per ovviare a questo problema potrei evitare di far scrivere il DDE in excel per poi leggerlo con VBA, ma memorizzare il valore direttamente in una variabile del VBA. Ho provato in diversi modi ma non ci riesco. Conosci un'istruzione che mi permette questo?

Poi un'altra cosa molto strana e relativa all'istruzione subito dopo il primo else, ovvero
If Range("F2").Value <> U_SC Then
Per il VBA è sempre vera, anche quando ho decine di scambi con lo stesso prezzo, quindi a prescindere dai diversi tempi di esecuzione tra excel e VBA, U_SC (la variabile relativa all'ultimo prezzo scambiato) è ormai la stessa da diversi secondi...

Come dicevo prima, comunque, penso che tutti i problemi si potrebbero risolvere a questo punto non passando per excel, ma memorizzando il valore direttamente in una variabile. Sapresti come fare?
Joker77
Newbie
 
Post: 9
Iscritto il: 14/01/11 23:03

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Joker77 » 18/01/11 19:10

Per quanto riguarda il problema delle variabili V_SC e A_SC che erano sempre = 0, non è un problema di logica delle istruzioni, o almeno non penso dai vari tentativi fatti.
Infatti il problema viene eliminato semplicemente aggiungendo l'istruzione
Range("G2").Value = "=Excel|Cartel1.xlsx!'R2C4'"
dopo il primo else (quella che nel mio primo messaggio è commentata ma che nel codice del file è scritta senza ' e quindi corrente. Volevo semplicemente capire come mai, se per caso ti era capitato altre volte. Del resto quest'istruzione non fa altro che riscrivere in una cella quello che già c'è :o
Joker77
Newbie
 
Post: 9
Iscritto il: 14/01/11 23:03

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Anthony47 » 18/01/11 23:47

Varie considerazioni, a caso…
a) se pensi che un delay di 0.1 sec mandi in crisi il modello allora dovresti ripensare al modello: ne’ windows ne’ excel sono strumenti di realtime processing, ma fanno del loro meglio senza particolare garanzia sulla rapidita’ di reazione
b) devi tenere in mente che la macro LinkChangeSC (parlo della simulazione con Server.DDE.xls) scatta su eventi che possono essere legati a D2, E2, F2, o G2 (o una combinazione casuale di questi dati); quindi la macro per prima cosa deve identificare che cosa deve gestire e poi deve essere consequenziale
c) o congelerei a inizio macro i dati visibili nelle celle in N variabili, e poi tutte le elaborazioni saranno fatte non sul valore delle celle ma sul valore delle variabili; questa ti slega anche dall’ eventuale ritardo con cui i dati si propagano verso la cella, al massimo processi il precedente cambiamento al successivo tick. Questo metodo e’ alternativo all’ ipotesi di reinserire nelle celle la formula dde (che funziona in quanto costringe il vba a fermarsi fino a quando excel non ha completato il ciclo di calcolo della formula)
d) se vuoi leggere da macro i valori sul file di origine devi usare i metodi DDEInitiate, per aprire un canale con l’ applicazione target, quindi DDERequest per prelevare il dato e DDETerminate per chiudere la comunicazione; ad esempio
Codice: Seleziona tutto
Sessione = Application.DDEInitiate(app:="Excel", _
  topic:="DDETEST.xls")
VarVal = Application.DDERequest(Sessione, "R2C1:R2C4")
QTot = VarVal(4)   ‘solo esemplificativa
Application.DDETerminate Sessione


Questa preleva le celle A2:D2 dal file DDETEST.xls (e’ l’ equivalente del tuo ServerDDE.xlsx) e le mette nella variant VarVal; da qui poi estrai i valori delle singole celle.
Ma io opterei per il suggerimento c), cioe’ congelare i dati in variabili e ragionare su questi dati.

Spero che trovi qualche spunto utile…
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Joker77 » 20/01/11 23:30

Ciao Anthony, grazie del supporto. Ci sono quasi.
Alla fine il fatto che mi sembrava considerasse quest'istruzione sempre vera
If Range("F2").Value <> U_SC Then
era semplicemente la tipologia di dati dichiarati. Era As long, mentre i dati contengono due decimali e quindi li apporssimava. Ovviamente l'if era sempre vero :D :D :D
Un'ultima cosa. Qusto è il mio collegamento reale al DDE
=DDESrv|TLINK!EU_SHH1_CV
il link che ho nella cella di Excel per intenderci, ed è il valore che vorrei memorizzare nella variabile.
Qual'è il codice corretto per la sessione DDE? mi da sempre errore :undecided: :undecided:
Sessione = Application.DDEInitiate
....
Application.DDETerminate Sessione
Grazie
Joker77
Newbie
 
Post: 9
Iscritto il: 14/01/11 23:03

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Anthony47 » 21/01/11 11:46

Ma una variabile Long sopporta ben piu’ di due decimali di precisione…

Sulla base di quanto scrivi mi vien da dire che le istruzioni che ti avevo dato dovrebbero diventare:
Codice: Seleziona tutto
Sessione = Application.DDEInitiate(app:=" DDESrv ", _
  topic:="TLINK")
VarVal = Application.DDERequest(Sessione, "EU_SHH1_CV")
PrimoDato = VarVal(0)   ' solo esemplificativa, vedi testo
Application.DDETerminate Sessione

La gestione completa del contenuto di VarVal, che e’ una matrice, la farai sapendo che cosa restituisce quella richiesta e, tecnicamente, leggendo tramite UBound quanti dati sono stati restituiti al vba

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Joker77 » 23/01/11 20:22

Ciao Anthony, per quanto riguarda la variabile dichiarata come long è strano stando a quello che mi dici, eppure dichiarandola come double il problema è stato risolto.
Per quanto riguarda invece la sessione DDE, purtroppo continua a darmi errore: praticamente nel debug alla prima riga
Sessione = Application.DDEInitiate(app:=" DDESrv ", topic:="TLINK")
mi dice che è impossibile accedere ai dati remoti, quindi mi chiede di avviare l'applicazione DDESRV.exe, applicazione in realtà già avviata. Ho provato anche a non avviare precedente DDESRV e quindi a dargli ok a questo messaggio, ma mi da sempre errore di run-time 13, tipo non corrispondente.
Comunque per ora ho risolto con il tuo consiglio c) quello di memorizzare in n variabili i dati all'inizio della macro. La sto testando con risultati tutto sommato soddisfacenti.
Grazie mille del supporto.
Joker77
Newbie
 
Post: 9
Iscritto il: 14/01/11 23:03

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Anthony47 » 23/01/11 22:02

Per la Long vs Double ho sbagliato: long supporta solo dati Interi.

Non dici quale istruzione ti da' Run time 13; se fosse sulla VarVal = Application.DDERequest(etc etc allora tieni presente che VarVal, nel caso tu la dichiari, deve essere Variant, mentre aver parlato di matrice nel post precedente potrebbe averti ingannato: si tratta di una Variant che l' istruzione riempira' con una matrice.

Comunque il metodo di congelare i dati in variabili credo sia piu' affidabile e anche piu' veloce.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Scaricare dati titoli di borsa tramite DDE

Postdi Joker77 » 23/01/11 23:42

L'errore lo dà proprio sulla prima riga

Sessione = Application.DDEInitiate(app:=" DDESrv ", topic:="TLINK")
Joker77
Newbie
 
Post: 9
Iscritto il: 14/01/11 23:03


Torna a Applicazioni Office Windows


Topic correlati a "[Excel]Scaricare dati titoli di borsa tramite DDE":


Chi c’è in linea

Visitano il forum: Nessuno e 45 ospiti