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

[Excel] Macro per importazione dati DDE

Postdi luca2002for » 15/06/06 16:57

Di nuovo ciao a tutti.

Ho visto che nel forum si è parlato del far partire una macro all'avveramento di una certa condizione.

Io sto sbattendo la testa per qualcosa di più specifico. Ottengo in tempo reale dalla borsa dei dati in formato DDE che sono incollati ad un foglio di excel.

Qualcuno sa se esiste la possibilità di associare una macro al semplice variare del valora contenuto in una cella (esempio la cella A1)?

Ho anche un dubbio a proposito. So bene che excel è terribilmente veloce. Ma è possibile che se il valore cambia per esempio 1 o 2 volte al secondo il sistema non si "incarti" dovendo continuamente rincorrere il cambiamento di valore per far partire la macro.

Un grazie anticipato a chi volesse darmi la sua opinione

:-) ciao ciao
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Sponsor
 

Postdi Alexsandra » 15/06/06 17:05

entra in VB e cliccando sul foglio che ti interessa scegli Worksheets e ti appare
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
......opportuno codice
End Sub

Così ad ogni cambiamento del valore nel foglio puoi eseguire le istruzioni che metti,inoltre le puoi vincolare anche ad una cella o ad un intervallo di celle
Codice: Seleziona tutto
IF range("A1") <> "" then
solo se la cella A1 non è vuota esegui delle operazioni altrimenti (ELSE) END IF
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale.

Win7 + Office 2003 Ita
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Che velocità :-)

Postdi luca2002for » 15/06/06 17:15

Grazie Ale! :-)

Temo però di non aver capito.

Soprattutto "opportuno codice"...cioè...opss in che senso?

Supponendo che io voglia che ad ogni cambiamento di valore della cella A1 parta la macro "miamacro", devo scrivere questo codice?
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
IF range("A1") <> "" then miamacro
End Sub
Grazie ancora e scusami per la carenza di neuroni. (Ti piace il mio avatar?)

d...luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Postdi Alexsandra » 15/06/06 20:28

Esatto,puoi mettere la macro in un nuovo modulo oppure dopo il Then metti le istruzioni e chiudi con END IF
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
IF Range("A1") <> "" Then
Msgbox "Il codice e le tabelle racchiudile entro i Tag [ ] usando i tasti Code o Quote"
Else
End If
End Sub
Puoi usare Else per eseguire un'altra istruzione
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
IF Range("A1") = "A" Then
Msgbox "L'Avatar che avevo prima era più bello"
Elseif Range("A1") = "B" Then
Msgbox "Ma ho voluto cambiarlo"
End If
End Sub
Attenzione però che con il codice che ti ho messo ti parte sempre la macro (A1 ha sempre valore A) per cui prendi spunto e adattalo al tuo foglio
Ciao
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale.

Win7 + Office 2003 Ita
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Grazie Ale..ma

Postdi luca2002for » 15/06/06 21:50

Grazie, anche per la versione personalizzata dei msgbox che mi ha fatto sorridere :-)

Però con il codice
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("A1") <> "" Then
MsgBox "Il codice e le tabelle racchiudile entro i Tag [ ] usando i tasti Code o Quote"
Else
End If
End Sub
accade questo:

il msgbox (quindi, l'eventuale qualsiasi macro che posso collegare) parte anche se cambiano i valori delle altre celle (e addirittura parte anche se solamente attivo col mouse una qualsiasi altra cella).

E invece io vorrei che la macro partisse solo se nella cella A1 (e solo in quella, indipendentemente dalle altre) avvenisse un cambiamento di valore.

Dove ho sbagliato secondo te? (Oltre nel fatto di aver cambiato avatar? :D )

Grazie

dluca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Postdi Anthony47 » 15/06/06 23:53

Dico la mia:
usiamo l’ event Worksheet_Change, non Worksheet_SelectionChange; non dimentichiamo subito un Application.EnableEvents = False per non andare in palla per interrupt annidati.

Se non vuoi guardare solo i cambi in A1, sul foglio dati ti calcoli in una cella libera la somma dei valori di tutte le quotazioni che ricevi, e chiami questa cella flagnow; la cella accanto, o una qualsiasi cella libera, la chiami flagold.

Scrivere poi sotto l’ oggetto “Foglio n” (il foglio che contiene i dati da monitorare), una macro come la seguente che partira’ a ogni cambiamento del contenuto delle celle; ma se i cambiamenti riguardano celle che non hanno modificato il flagnow viene subito chiusa.

Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False

If Range("flagnow").Value = Range("flagold").Value Then GoTo skippa
Range("flagold").Value = Range("flagnow").Value

'METTERE QUI LE ISTRUZIONI DA ESEGUIRE....
'METTERE QUI LE ISTRUZIONI DA ESEGUIRE....

skippa:
Application.EnableEvents = True
End Sub


Se vuoi tenere sotto controllo solo A1, usa A1 al posto di flagnow.

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

Postdi Alexsandra » 16/06/06 07:04

Non sapendo cosa dovevi fare ti ho fatto degli esempi per quello che chiedi usa questo codice
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then Alex
End Sub
e lo metti nel foglio della cella A1 da controllare.
Poi in un modulo metti la macro
Codice: Seleziona tutto
Sub Alex()
MsgBox ("Grazie, anche per la versione personalizzata dei msgbox che mi ha fatto sorridere")
End Sub
così ogni volta che cambia il valore nella cella A1 (e solo in quella cella)parte la macro
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale.

Win7 + Office 2003 Ita
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Grandioso, però....

Postdi luca2002for » 16/06/06 11:05

Grazie Ale e Anthony.

In effetti con il codice proposto da Alexandra (su quello di Anthony ci sto un pò studiando) le cose funzionano, ma solo se il cambiamento di valore della cella dipende da una mia immissione manuale.

(Cioè, per esempio metto 2 al posto di 3 nella cella A1 e la macro parte regolarmente).

Se però invece la cella varia non per mia immissione manuale ma perchè è collegata DDE ad un dato che varia (quindi senza che io la tocchi) non parte niente :-(

Ho provato ad aggiungere un "+0" alla fine della formula DDE (per far credere ad excel che si tratti di un numero e non di una formula), ma niente.

Ho anche provato a tenere nella A1 non la casella col DDE ma semplicemente un incolla-collegamento....niente :-(

Non capisco cosa potrebbe essere, se non il fatto che excel, quando la cella cambia diciamo "per motivi esterni", non capisce che cambia.

Come potrei farglielo capire?

Grazie mille, anche per i msgbox.
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Postdi Anthony47 » 16/06/06 13:55

In effetti avevo il dubbio che Worksheet_Change potesse non rilevare i cambiamenti introdotti con DDE.
A questo punto, suggerisco di usare Application.OnTime per far partire la tua procedura ogni xxx secondi; esempio
Codice: Seleziona tutto
Application.OnTime Now + TimeValue("00:00:30"), " Procedura"

fara’ partire la macro Procedura dopo 30 secondi.
Quindi:
-all’ apertura del worksheet fai partire una macro che scheduli lo start della tua procedura dopo 30 secondi (il codice dato sopra).
-in testa alla tua Procedura metti il controllo (con flagnow e flagold, o A1 e flagold) per verificare se il codice deve continuare (ci sono stati dei cambiamenti da gestire) o puo’ terminare.
-in uscita dalla Procedura rimetti Application.OnTime Now + TimeValue("00:00:30"), in modo che la procedura si autoscheduli.

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

Postdi Anthony47 » 16/06/06 14:04

Ancora un suggerimento:
sempre in test alla Procedura, controlla che il worksheet attivo sia quello che contiene i tuoi dati (dagli un nome univoco..); ad esempio con
Curr_WS = Range("A1").Worksheet.Name
la variabile Curr_WS conterra' il nome del foglio, cosi' puoi controllare se ci sei ancora o hai cambiato foglio; se non sei piu' sul foglio, termina Procedura SENZA rischedulazione (ricorda che la macro che avvia lo schedule dovrebbe aprtire all' apertura del foglio; cosi' se ne esci la pianificazione si interrompe, e se ci ritorni riparte).

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

Postdi Anthony47 » 16/06/06 14:06

Ahaaaaaghhhh
corrige ->
Ancora un suggerimento:
sempre in TESTA alla Procedura, controlla etc etc
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Grazie Anthony

Postdi luca2002for » 16/06/06 14:40

Grazie mille per il tuo interessamento, veramente cortese.

Proverò, anche se, se non ho capito male, con ontime effettuo in pratica una verifica ogni tot tempo sull'eventuale cambiamento del valore della cella,

per cui se è cambiata, parte la macro e invece se non è cambiata non succede niente.

E' una strada intelligente e creativa, ma, al contempo mi dà di più e di meno rispetto a quello che vorrei ottenere.

Di più perchè effettua dei controli anche quando la cella non è cambiata (con spreco di risorse...pensa che dovrei fargli fare questo lavoro in contemporanea su 40 celle e che dovrei, vista la velocità delle contrattazioni, dare un ontime terrificamte, tipo 1 secondo o meno, rischiando - penso - di far andare in palla il processore).

Di meno perchè, a meno che non configuri un ontime "strettissimo", rischierei di perdere tutte le contrattazioni che si sono svolte nell'arco di quel tempo.

(Cioè, se supponiamo che in 10 secondi si siano avute 4 variazioni...Se l'ontime funziona a 10 secondi, mi ritroverei a ragionare su dati sbagliati, in quanto excel registererebbe una sola variazione - quella tra il cambiamento numero 1 e il cambiamento numero 4).

Spero che ci sia un'altra strada....cercherò ancora sulla rete.

Grazie ancora per la gentile risposta.

;) Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Forse ho trovato....

Postdi luca2002for » 16/06/06 15:30

Ho trovato, su

http://support.microsoft.com/default.as ... t%3B172832

(il sito della microsoft) questo codice.
Codice: Seleziona tutto
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
Codice: Seleziona tutto
Sub LinkChange()
   MsgBox "linked"
End Sub


Capendoci poco o nulla e l'ho incollato. E .... incredibile, qualcosa si muove

:P

Il problema è che si muove troppo !! Cioè, è come se "scattasse" a qualsiasi cambiamento di qualsiasi DDE....uhmm

Chi me lo potrebbe spiegare? :undecided:

Sento di essere vicino alla soluzione ma...ancora parecchio lontano....

a dopo :-)
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Postdi Alexsandra » 16/06/06 15:38

Io una mezza idea l'avrei mi dovresti dire

1) i dati che incolli da DDE in che formato lasciano la cella (testo?)
2) tu non sei nel foglio in cui vengono incollati i dati,cioè il foglio non è attivo
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale.

Win7 + Office 2003 Ita
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi Anthony47 » 16/06/06 19:48

Sono curioso di vedere come excel si comporta come transaction handler.

Ma le modifiche sei sicuro di doverle elaborare in real time, non e’ sufficiente elaborarle di tanto in tanto?
E poi: che elaborazione devi fare; non e’ che possiamo sfruttare una User Defined Function che inseriamo in una formula excel?

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

Sì, Anthony

Postdi luca2002for » 17/06/06 09:59

Sì effettivamente mi occorre tutto in real time...ed usando ontime, ottengo qualcosa di simile a quello che vorrei, ma non proprio la stessa cosa.

Su http://www.ozgrid.com/forum/showthread.php?t=18225

ho trovato questo codice
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim VRange As Range
Set Vrange =Range("InputRange")
For Each cell In Target
If Union(cell, Vrange).Address = Vrange.Address Then
Msgbox "The changed cell is in the input range."
End if
Next cell
End Sub

che però non riesco a far funzionare. Pensi che possa andare bene per me?

A dopo

:-)
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Postdi Alexsandra » 17/06/06 10:55

Luca apprezzo la buona volontà (ho visto i Tag [ ) ma non ti riesce proprio di inserire il codice ehh :lol: :lol:

Guarda quì che ci sono le Istruzioni per inserire Codice,Immagine etc...

Ciao :D
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale.

Win7 + Office 2003 Ita
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

A un centimetro dalla soluzione

Postdi luca2002for » 19/06/06 09:54

Ragazzi, ho notato che con la macro del sito microsoft (Sub linklist, vedi codice postato qualche messaggio sopra da me) riesco a far "sentire" a excel il cambiamento di valore della cella DDE e a collegare a questo cambiamento l'esecuzione di un'altra macro (per convenzione chiamiamola macro1).

L'unico problema (per me insolubile, visto che non riesco sinceramente a capire il significato in soldoni della macro sub linklist, e quindi non posso modificarla a mio uso e consumo) è che l'esecuzione della macro collegata (macro1) avviene tante volte quanti sono i cambiamenti di tutte le celle DDE su quel foglio di lavoro.

Troppo, per le mie necessità, perchè a me basterebbe che il cambiamento in una sola cella (supponiamo "A1") facesse partire la seconda macro.

Stando così le cose sono costretto a incollare una sola cella DDE (e non me ne faccio nulla) e se ne incollo di più, excel ripete la macro per tutti i cambiamenti di tutte le celle DDE (con risultati disastrosi).

Per chi riuscisse a capire il significato della sub Linklist, esiste forse un modo per indicare al suo interno che dovrebbe funzionare solo al cambiamento di una specifica cella (esempio "A1")?

Per me è impossibile perchè non riesco ad entrare nel marchingegno dei comandi, ma per chi ne sa di VBA come voi potrebbe essere fattibile.

Thank you in advance per chi risce ad aiutarmi, è frustrante sentirsi vicini alla soluzione ma non riuscire a proseguire.

Saluti a tutti :-)
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Postdi Alexsandra » 19/06/06 11:05

Codice: Seleziona tutto
If Not IsEmpty(Links) Then
così cerca tutte quelle non vuote e ti lancia la macro in continuazione.
Devi mettere una condizione unica (A1)
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale.

Win7 + Office 2003 Ita
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Cioè..uhmm?

Postdi luca2002for » 19/06/06 12:35

Devo scrivere nella sub Linklist questo?

Codice: Seleziona tutto
If Not is Empty ("A1")


...ho provato ma c'è qualcosa che mi sfugge :-(

grazie per ora

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Prossimo

Torna a Applicazioni Office Windows


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


Chi c’è in linea

Visitano il forum: Nessuno e 117 ospiti