Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel] Macro per importazione dati 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

Postdi Alexsandra » 15/07/06 13:01

Vero quello che dici,ma si può ottenere lo stesso risultato agendo in altro modo. E' possibile sfruttare l'evento Change anche in campo calcolato con formula : per esempio
puntiamo ad una cella
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then Alex
End Sub
mettiamo la formula
Codice: Seleziona tutto
 Private Sub Alex()
 [B5].Select
  ActiveCell.FormulaR1C1 = "=R[-4]C[-1]"
IncVal ' incolliamo il valore
MsgBox "ciao" ' e lanciamo la macro
End Sub
sub per incollare solo il valore senza formula
Codice: Seleziona tutto
Private Sub IncVal()
  Selection.Copy
  Selection.PasteSpecial Paste:=xlValues
  Application.CutCopyMode = False
  If ActiveCell.Text = "#N/D" Then ActiveCell = ""
End Sub
Se provi questo codice vedrai che la macro viene lanciata, era il sistema che avevo suggerito a lucafor ,a questo puoi associare l'evento Timer (che hai suggerito tu) e puoi aggiornare il tuo foglio ogni x secondi/minuti che imposti nel timer.

Secondo mè è fattibile (tralasciando la formula col DDE che io non posso provare) ma sfruttare il cambiamento di una cella per lanciare una macro è fattibile
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Sponsor
 

Postdi Anthony47 » 16/07/06 00:30

Ciao Alex,
ho provato quanto suggerisci, ma i risultai sono questi:
1) Se non faccio nessuna variazione sul foglio, non succede niente (..ovvio).
2) Se cambio una cella diversa da A1, l’ evento Worksheet_Change scatta, poi la relativa macro si accorge che il target adr non e’ A1 ed esce senza ulteriore azione.
3) Se cambio il contenuto di A1:
a)scatta l’ evento e la relativa macro (1° lancio);
b)parte la macro Alex che mette =A1 in cella B5;
c)questo cambiamento fa riscattare l’ evento Worksheet_Change (2° lancio), la cui macro esce perche’ target adr diverso da A1;
d)riprende la macro Alex, che lancia la macro IncVal;
e)IncVal incolla in B5 il suo valore;
f)questo fa riscattare l’ evento Worksheet_Change(3° lancio), la cui macro esce perche’ target adr diverso da A1; riprende la macro IncVal, che si completa;
g)riprende Alex che fa uscire il message box e poi si conclude;
h)riprende la macro di Worksheet_Change (1° lancio) che si conclude.

4) Se provoco una variazione da ricalcolo, non succede niente (metodo: A1 =ADESSO(); premo F9, vedo il contenuto dei secondi che cambia ma la macro di evento non scatta).
5) Idem se ho messo in altra cella =A1*100 (esempio): anche questa cella cambia contenuto con F9 ma nessun evento scatta.


Insomma, mi pare che questo confermi che l’ evento Worksheet_Change scatta solo se c’ e’ un input in una cella qualsiasi del foglio (senza necessariamente cambiare il contenuto della cella); nella sequenza di sopra scatta quando faccio un input in A1, quando la macro Alex mette in B5 =A1, quando la macro IncVal mette in B5 il suo valore. Mentre non scatta se una cella cambia per effetto di un ricalcalo (o per una variazione introdotta tramite DDE, come aveva sperimentato luca).

Questo conferma anche l’ utilita’ di un Application.EnableEvents = False all’ inizio della macro di gestione di un evento, senza dimenticare un Application.EnableEvents = True subito prima dell’ End Sub; questo evita il pericoloso lancio ricorsivo delle macro.
A risentirci,
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: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi Alexsandra » 16/07/06 13:45

Non hai postato niente di nuovo,le cose che citi sono cose note agli "addetti ai lavori" il mio pensiero è ben diverso, cosa succede quando una cella contiene una formula DDE???
Codice: Seleziona tutto
=IWDDE|STOCK_PRICE!'10?contractQuantity'
oppure
Codice: Seleziona tutto
=IWDDE|STOCK_PRICE!'10?contractPrice'*1
Con quella formula posta in una cella mi connetto ad un canale ma dopo cosa succede importando i dati in Excel?

Si tratta solo di instaurare una discussione su questo e non un esame sul codice che posto io,il mio codice è solo un input all'utente stà a Lui svilupparlo,chiedere chiarimenti e portare avanti il progetto in base alle sue esigenze.
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi Anthony47 » 17/07/06 00:08

Evidentemente avevo interpretato male il tuo messaggio del 15-7 14:01 in risposta al mio delle 11:32.

Per quanto riguarda la domanda “……… ma dopo cosa succede importando i dati in Excel?” la mia personale risposta e’ che certamente succedono molte cose, ma non scatta nessun evento classico che possa attivare una macro; tant’ e’ che Microsoft da’ come workaround l’ uso del metodo SetLinkOnData per individuare gli aggiornamenti introdotti tramite link DDE (info ritrovata da luca2002for nel knowledge base di Microsoft).

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: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi Alexsandra » 17/07/06 13:26

No problem
Non erano domande ma affermazioni o pensieri miei a voce alta

Sono curiosa e vorrei approfondire questo processo.

1) Cella con formula DDE crea un nuovo foglio?
2) Se non crea un nuovo foglio sovrascrive i dati in un foglio qualsiasi?
3) Oppure cosa succede quando vengono importati i dati con DDE?

Avanti con le idee :D

PS. 10 a 1 che riusciamo importando dati in DDE a far partire una macro con l'evento Change.
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Complimenti

Postdi ENRIDINTI » 23/08/06 18:58

Ciao a tutti,
sono nuovo del forum ed esordisco subito facendovi tantissimi complimenti per la soluzione al problema proposto da Luca2000 sulla gestione dei dati in DDE per applicazioni in campo borsistico. Non sapete che favore mi avete fatto. Grazie ancora. Vengo ora al dunque: anch'io utilizzo excel a supporto dell'attività di trading in tempo reale e per adesso ho messo in pratica la prima soluzione, ovvero quella che prevede l'avvio di una macro ad ogni cambiamento di una qualsiasi cella. La macro che utilizzo io mi fa uscire delle caselle Msgbox al verificarsi di certe condizioni. Così com'è funziona tutto solo che ogni volta che si verifica la mia condizione ed esce la casella, il fogli rimane in stand-by fino a quando io non premo l'ok della casella, imedendo di fatto di rilevare il verificarsi di altre condizioni. Io avrei bisogno di far continuare a lavorare excel normalmente anche dopo che è uscita la casella di messagggio. Come devo fare? Grazie e complimenti ancora.
ENRIDINTI
Newbie
 
Post: 5
Iscritto il: 22/08/06 17:50

Postdi Alexsandra » 23/08/06 19:49

Beh... Intanto ciao e benvenuto nel forum, e grazie per i complimenti, fanno sempre piacere quando si ricevono.
Per il tuo problema puoi fare una form invece del msgbox.
Quando si verifica la condizione lanci la macro e invece di usare il msgbox fai una form e la richiami es.
Codice: Seleziona tutto
If (tua condizione) Then
  form_msgbox.Show
End If
questa la puoi personalizzare come vuoi e nella form metti questo codice
Codice: Seleziona tutto
Private Sub UserForm_Activate()
    Application.OnTime Now + TimeValue("00:00:03"), "Killa_la_Form"
End Sub
così ti appare la form e dopo 3 secondi si chiude basta che metti in un modulo questo codice
Codice: Seleziona tutto
Private Sub Killa_la_Form()
    Unload form_msgbox
End Sub

Prova così

Ciao
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi ENRIDINTI » 23/08/06 20:38

Ti ringrazio per l'aiuto. Da quello che ho capito però la form è unica mentre io devo far eseguire nella mia macro più di un centinaio di cicli if then else if al verificarsi di ognuno dei quali devo avere a monitor un messaggio diverso. In un libro su vba ho letto della proprietà VbApplicationModal dell'oggetto MsgBox. Ha qualcosa a che fare con quello che serve a me?
ENRIDINTI
Newbie
 
Post: 5
Iscritto il: 22/08/06 17:50

Postdi Alexsandra » 23/08/06 21:17

La puoi personalizzare.
Codice: Seleziona tutto
With tua_form
.Label1.Visible = True
.Label2.Caption = Sheets(1).Cells(1, 1).Value
.Label3.Visible = False
.Show
End With
A te interessa il .Caption della label che puoi associare al valore della variabile o del testo che mandi in msgbox.
Puoi anche nascondere o rendere visibili delle label.
Comunque non so come fai lavorare il tuo file,potrebbe essere un'idea.

VbApplicationModal è usato in VB6, non è supportato in VBA
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi ENRIDINTI » 25/08/06 16:32

OK FATTO!!!!!!!
FUNZIONA :lol: :lol: :lol:
Ci ho lavorato due giorni per trovare la soluzione ottimale ma dovrei averla trovata. Ragazzi io vi devo davvero ringraziare perchè sono mesi che tento di trovare la soluzione a questo problema. Ne ho provate di tutti i colori ed ho interpellato svariate persone compresi due ingegneri informatici senza cavare un ragno dal buco. Può darsi che in futuro vi interpelli ancora per qualche altro consiglio. Grazie e complimenti ancora.
ENRIDINTI
Newbie
 
Post: 5
Iscritto il: 22/08/06 17:50

Postdi Alexsandra » 25/08/06 16:42

bel post. :D
fossero tutti come il tuo :D
Torna quando vuoi
ciao
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

aiuto

Postdi d_cirrotti » 27/07/07 22:21

allora,
mi ricollego a questo argomento, prche' credo che merita di essere completato:
insomma ho lo stesso problema di chi si e' inserito alla fine:

non ci ho capito molto.

per semplificare:

la mia macro si chiama "prima"

cosa dovrei fare affinche' sia lanciata ogni tre minuti?
ho seguito il consiglio di Anthony, ma non funziona, sicuramente non sono stato capace. qualcuno potrebbe inserire il codice per intero?

ora la cella A1 contiene una formula: vorrei che la macro"prima" venga lanciata ogni qualvolta il valore di A1 eguaglia 2. ci ho provato con quanto scritto sopra, ma niente: qualcuno potrebbe scrivere il codice che lancia la mia macro "prima" ogni qualvolta A1 egualglia 2?

ci sono tante informazioni sopra, ma nessuna e' cosi' chiara: considerate che sono poco intelligente: almeno a giudicare dai risultati dopo aver letto tutti i post sopra...

grazie a chi vorra' aiutarmi.
ciao
d_cirrotti
d_cirrotti
Utente Junior
 
Post: 41
Iscritto il: 27/07/07 11:50

Re: [Excel] Macro per importazione dati DDE

Postdi uoller » 01/03/09 20:37

anzitutto i miei complimenti per la soluzione di questo problema.
ho anch'io un problema simile ma non uguale e non so se è giusto rispondere oppure aprire una nuova discussione, qualcuno mi dirà qualcosa o mi sposterà da un'altra parte.
non so se è risolvibile con excell oppure se serve Visual Basic.

ho un foglio excell con un collegamento dati web (http://localhost:12366/?methodName=g...=titolo&arg=5m) che si aggiornano automaticamente ogni minuto (è una mia scelta) e che tramite formule genera dei segnali di acquisto o vendita.
la domanda è questa: è possibile con excell fare il confronto tra due celle della penultima riga e se sono maggiori di zero ed uguali tra loro far partire un ordine di acquisto (il confronto di altre due genera la vendita) tramite una stringa come quella sopra?

ciao e grazie
Valter
uoller
Newbie
 
Post: 8
Iscritto il: 01/03/09 11:30

Re: [Excel] Macro per importazione dati DDE

Postdi Anthony47 » 02/03/09 00:04

Ciao Valter e benvenuto nel forum.
Sarebbe stato certamente meglio aprire una nuova discussione, visto che la precedente e' vecchia di quasi tre anni; ma il tuo post mi ha fatto scoprire il messaggio di d_cirrotti rimasto senza nessuna risposta: se sono in tempo me ne scuso con l' autore; il fatto e' che una volta non arrivava la notifica ad ogni nuovo messaggio.

Veniamo al quesito posto: Si, puoi confrontare due celle alla penultima riga; se per esempio fossero in colonna B e C, puoi usare la formula
Codice: Seleziona tutto
=SE(E(SCARTO(B1;CONTA.VALORI(B:B)-2;0)=SCARTO(C1;CONTA.VALORI(B:B)-2;0);SCARTO(B1;CONTA.VALORI(B:B)-2;0)>0);vero;falso)
presuppone che tutte le righe contengano un valore in col B, se non e' cosi' devi capire se puoi usare un' altra colonna (basta cambiare il parametro di conta.valori).
Una volta che hai vero/falso lo devi processare, ma come inviare ordini di vendita o di acquisto dipende dalla sim con cui hai il contratto.
Tieni anche presente che il link che hai allegato e' inutile, trattandosi di un link locale al tuo pc.

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: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro per importazione dati DDE

Postdi uoller » 02/03/09 20:03

Grazie Antony per la risposta anche se non mi è molto chiaro:
la formula che inserisco in una cella mi ritorna vero o falso, giusto? e poi?
non è possibile se il confronto è vero inviare l'ordine? (è vero quando le due celle sono maggiori di zero ed uguali).

il link corretto per l'invio ordine è cosi http://localhost:12366/?methodName=inse ... TITY&arg=P
RICE&arg=TRIGGERPRICE&arg=DATEVALIDILITY&arg=STOPLOSS&arg=TAKEPROFIT&arg=PFID

è sul mio PC perchè l'ordine viene inviato tramite una piattaforma installata sul PC e collegata al mercato.

Ho visto che alexandra aveva mostrato dei collegamenti DDE di IWBank che è la banca che utilizzo io, forse lei saprà spiegare meglio il funzionamento.

ciao Valter
uoller
Newbie
 
Post: 8
Iscritto il: 01/03/09 11:30

Re: [Excel] Macro per importazione dati DDE

Postdi uoller » 02/03/09 20:45

Long Corto Eseguiti Invio
0 1922 -1 0 0 FALSO
0 1922 -1 0 0 FALSO
0 1922 -1 0 0 FALSO
0 1922 -1 0 0 FALSO
0 1922 -1 0 0 FALSO
0 1922 -1 0 0 FALSO
1915 0 1 1915 6 FALSO
1915 0 1 0 0 FALSO
1915 0 1 0 0 FALSO
0 1915 -1 1915 -1 FALSO

Ho provato ad inserire la formula ma mi ritorna sempre falso.
ho postato un esempio per chiarezza in una colonna io devo confrontare la colonna eseguiti con la colonna long
e in un altra colonna io devo confrontare la colonna eseguiti con la colonna corto.

nel caso che i due dati siano uguali devo far partire l'ordine corrispondente.
Grazie ancora
Valter

ciao grazie
uoller
Newbie
 
Post: 8
Iscritto il: 01/03/09 11:30

Re: [Excel] Macro per importazione dati DDE

Postdi Anthony47 » 02/03/09 22:27

La formula che ho postato e' personalizzata per colonne B e C; come detto, " presuppone che tutte le righe contengano un valore in col B, se non e' cosi' devi capire se puoi usare un' altra colonna (basta cambiare il parametro di conta.valori).", ma preciso che intendo dire che i dati devono essere contigui dalla riga 1 alla riga "ultima usata" (senza vuoti), ma anche senza formule dopo l' ultimo valore usato). Quale e' la tua situazione?
Per quanto riguarda l' emissione dell' ordine non so aiutarti; in linea di massima devi usare le api del tuo applicativo e richiamarle con la loro sintassi tramite una macro che o inserisci in coda a quanto gia' usi per raccogliere le informazioni oppure aggiungi come macro a se stante e che avvii ogni tot di tempo (es ogni minuto) con il metodo "OnTime".

Spero che altri leggano il tuo post e possano aggiungere qualcosa di piu' preciso.

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: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro per importazione dati DDE

Postdi uoller » 02/03/09 23:12

Grazie per la risposta.
le colonne contengono un valore oppure zero.

comunque il mio problema è l'invio dell'ordine quando nella penultima riga c'è la condizione.

non so come si costruisca una macro per inviare l'ordine.

comunque grazie
Valter
uoller
Newbie
 
Post: 8
Iscritto il: 01/03/09 11:30

Re: [Excel] Macro per importazione dati DDE

Postdi uoller » 03/03/09 11:13

nessuno che mi possa aiutare?

che mi alleghi un pezzo di codice o una macro per risolvere il problema?

grazie a tutti
Valter
uoller
Newbie
 
Post: 8
Iscritto il: 01/03/09 11:30

Re: [Excel] Macro per importazione dati DDE

Postdi Anthony47 » 03/03/09 21:45

Per la formula che testa le condizioni >0 e valori uguali, mi pare che non ti produce il risultato che doveva...
Vediamo di approfondire:
-quale formula hai usato?
-in quale riga sono i dati che devi controllare?
-se in una cella libera scrivi la formula
Codice: Seleziona tutto
=CONTA.VALORI(B:B)
(al posto di B:B metti la colonna che contiene il primo valore, sempre con la stessa sintassi) che risultato ti da?

Per la macro, purtroppo noi possiamo suggerire solo dei semilavorati, per di piu' non collaudati (perche' no ho il tuo ambiente...), che poi devi comporre nella tua situazione.

Hai detto che il link per inviare l' ordine e':
"http://localhost:12366/?methodName=insertOrderAdvanced&arg=SYMBOL&arg=SIGN&arg=QUANTITY&arg=PRICE&arg=TRIGGERPRICE&arg=DATEVALIDILITY&arg=STOPLOSS&arg=TAKEPROFIT&arg=PFID"

In vba puoi attivare un link a un indirizzo ad esempio con una istruzione tipo
ActiveWorkbook.FollowHyperlink Address:=LinkUrl, NewWindow:=True

Devi quindi concatenare in una unica stringa i vari pezzi che compongono il link che devi attivare; ad esempio metti le parti in "maiuscolo" in celle da A1 ad A9 e poi concateni con l' istruzione
LinkUrl=" http://localhost:12366/?methodName=inse ... d&arg=" & _
Range("A1") & "&arg=" & Range("A2") & "&arg=" & Range("A3") & _
"&arg=" & Range("A4") & "&arg=" & Range("A5") & "&arg=" & Range("A6") & _
"&arg=" & Range("A7") & "&arg=" & Range("A9") & "&arg=" & Range("A9")

e dopo di questa userai l' istruzione ActiveWorkbook.FollowHyperlink che ho dato prima.

Direi che la prima cosa e' crearsi una macro che possa emettere l' ordine quando viene lanciata; con quanto detto sopra somiglierebbe a questa:
Codice: Seleziona tutto
Sub SendOrder()
LinkUrl = "http://localhost:12366/?methodName=insertOrderAdvanced&arg=" & _
 Range("A1") & "&arg=" & Range("A2") & "&arg=" & Range("A3") & _
 "&arg=" & Range("A4") & "&arg=" & Range("A5") & "&arg=" & Range("A6") & _
 "&arg=" & Range("A7") & "&arg=" & Range("A8") & "&arg=" & Range("A9")
ActiveWorkbook.FollowHyperlink Address:=LinkUrl, NewWindow:=True
End Sub

Quando la macro produce l' esito richiesto si potra' vedere come inserirla in coda alla macro che riceve i dati tramite i link dde o tramite una macro che scatta ogni minuto e, trovando "vero" un flag, attiva il codice per emettere l' ordine.

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: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

PrecedenteProssimo

Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Macro per importazione dati DDE":


Chi c’è in linea

Visitano il forum: Nessuno e 22 ospiti