Condividi:        

Lavorare celle DDE rispetto al variare del loro valore

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

Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 30/06/11 15:55

Per prima cosa un caldo saluto a tutti perché questo è il mio topic ; infatti mi sono iscritto oggi 30/06/11
Premesso che ho letto sull'argomento molto dei topic scritti nel 2006 e seguenti ed alla fine ho visto una certa terza soluzione, chiamata antony, ma il cui topic a forza di link seguiti purtroppo non trovo più, che mi sembra tanto interessante quanto altrettanto semplice.
Ho inserito le tre macro nella mia cartella ma non succede niente.
Vorrei inviarvi sia la cartella (composta di 5 fogli) che le macro sia copiati dal suddetto topic che una mia già preesistente e funzionante ma che non riguarda l'argomento in oggetto.
La domanda è come faccio, e se posso spedire il tutto, o debbo e posso inserire degli screenshoot nei topic?
Grazie e cordiali saluti.
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Sponsor
 

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi Flash30005 » 30/06/11 23:15

Ciao Giamoros e benvenuto nel Forum
Per inviare un file devi seguire la procedura indicata Qui
ma devi aver effettuato almeno tre post (regole dettate dal Forum per evitare intrusioni non desiderate)

Come da te espresso Anthony ti darà sicuramente una mano ;)

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 01/07/11 06:36

Scusate per post intendete aver aperto almeno tre discussioni o rispondere ad almeno tre topic aperti da altri utenti?
Grazie.
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi ricky53 » 01/07/11 10:43

Ciao,
in sintesi significa che il tuo contatore messaggi deve essere arrivato almeno a "TRE" e poi potrai operare inserendo dei file.


P.S.: benvenuto nel nostro forum.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 01/07/11 12:36

La mia cartella Myprova1 contiene 6 fogli (vedi ScreenShot001).
Il primo foglio di nome “Formule” (vedi ScreenShot002 e 3) esemplifica come usare le formule DDE nelle varie celle per ottenere diverse informazioni quali il nome dell’azione, la sua quotazione o l’ora oppure il volume degli scambi e così via dicendo.
Il secondo foglio di nome “Ordinario” (vedi ScreenShot004) è il foglio in cui mi interessa variare il colore ed eventualmente far flippare per 5 secondi all’arrivo di un nuovo dato ed in base al valore precedente.
Le celle da controllare sono e soltanto quelle che vanno da J8 a J18 anche se nel foglio arrivano altri dati DDE.
Attivando contemporaneamente Alt e F11 si ottiene lo ScreenShot005 dove sono evidenziate le tre macro ricavate ed inserite relative alla terza soluzione di cui parlavo all’inizio di questo topic ma che non mi funzionano.
Nello ScreenShot006 si vede cosa contiene la cella J8 e nella barra il codice che permette di avere il valore del titolo.
Gli altri 4 fogli “Leva Long” “Short Selling” “ Calcolo Stop-Loss” e “ Movimenti azioni” non sono coinvolti in questo problema anche se ricevono più o meno gli stessi dati DDE del foglio “Ordinario” ; un esempio per tutti si veda lo ScreenShot007.
Lo ScreenShot008 mostra le tre marco automaticamente generate dal sistema quando ho inserito la famosa terza soluzione tramite la funzione “Visualizza codice” della linguetta del foglio “Ordinario”
Di seguito i link degli 8 screenshot rispettivamente dal primo all’ottavo.

http://www.mediafire.com/?dwcz3pryyc8bdap
http://www.mediafire.com/?cty5dbskvu8y8s7
http://www.mediafire.com/?hpz0hi36k6svu45
http://www.mediafire.com/?xwl7p5zljlbszli
http://www.mediafire.com/?q4272ujfe2rpf1q
http://www.mediafire.com/?i6o42awzhhz9hbz
http://www.mediafire.com/?1c90hmuah6eq5bc
http://www.mediafire.com/?l1dj3a4u2id2ad0

Rimango in attesa di qualsiasi chiarimento che si dovesse rendere necessario e/o di eventuali suggerimenti per risolvere il problema
Grazie e saluti a tutti.
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi Anthony47 » 01/07/11 23:37

Ciao giamoros, benvenuto anche da parte mia.

Sul foglio macro vedo che all' apertura del file imposti Macro2 ad ogni variazione sui canali dde che immagino siano attivati in J8:J18; questa Macro2 si limita a dare un messaggio "la cella e' cambiata".
Immagino che dovresti mettere qualcosa di piu' produttivo; "che cosa" dipende dalle cose che vorresti eseguire quando la cella cambia.
Quindi: che cosa?
Intanto, rispetto ad es a screenshot8, c' e' una qualche colonna che rappresenta l' orario a cui il dato di col J e' stato ricevuto?

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

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 02/07/11 08:02

All’apertura del file io non attivo manualmente nessuna Macro in quanto il DDE inizia a scaricare automaticamente il dati.
La Macro2 attualmente dovrebbe dare il messaggio solo per verificare il suo funzionamento che attualmente non fa ; in seguito dovrebbe cambiare colore rosso (valore inferiore al precedente) verde (maggiore) e giallo (uguale) e flippare per 5 secondi per attirare la mia attenzione in modo che possa decidere se comprare o vendere l’azione.
Nello screenshot8 la colonna N (“Time Last” altro dato DDE) aggiorna l’orario in cui arrivano i dati delle varie azioni che poi in realtà aggiornano i valore di ogni singola riga.
Spero di essere stato chiaro.
Ciao e grazie del tuo interessamento.
Giamoros
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 15/07/11 18:10

Mi sono fato un migliaio di giri su vari siti e sono arrivato alla conclusione che l'unico sistema per intercettare automaticamente se una cella DDE sia cambiata è usare il sistema setlinkondata (per me emerito sconosciuto).
Comunque ho preparato qualcosa per verificare se ciò sia possibile ma ho subito un errore che non riesco a capire.
Nello screenshot14 come si presente la cartella Excel quando la lancio. http://www.mediafire.com/?ipmtprciui954qi
Nello screenshot15 l'errore che ho all'inizio dell'arrivo degli stessi. http://www.mediafire.com/?hlhkzz4ewftgg1z
Nello screenshot16 le istruzioni del foglio2 sezione generale. http://www.mediafire.com/?vm28e13forxxj97
Nello screenshot17 le istruzioni della sezione worksheet. http://www.mediafire.com/?wou8esw44o2ojbl
Qualcuno sa darmi una mano a correggere tale errore?
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi Anthony47 » 16/07/11 15:33

Hai fatto bene a riportare a galla il quesito, che era rimasto abbandonato...

Si, SetLinkOnData e' il metodo giusto per agganciarsi al cambiamento di una cella associata a un link dde; l' unica alternativa e' una macro "On Time" che (mettiamo) ogni 10 secondi va a controllare se ci sono dati cambiati e li gestisce di conseguenza.
Vista la tua intenzione di far flippare il colore della cella per evidenziare i cambiamenti, io non escluderei che ti possa tornare utile l' approcco "on time", che intrinsecamente tiene congelati i dati per N secondi, stabilizzando l' indicazione per quei secondi. Con SetLinkOnData invece non puoi escludere, partendo da un valore iniziale, che al primo cambiamento registri un piu', due secondi dopo registri un meno, e il risultato e' un verde seguito subito da un rosso anche se magari il secondo cambiamento e' per un valore superiore al valore iniziale.

Penso che sia utile fare una scelta adesso in funzione della tua abilita' con le macro, considerando che l' On Time e' alquanto piu' semplice da programmare.

Veniamo ai commenti alle immagini pubblicate:
-lo screenshot14 dice che il tuo foglio ha dei "collegamenti" ad altri file excel e chiede se vuoi aggiornare quei dati. Puoi vedere l' origine di questi collegamenti con Menu /Modifica /Collegamenti; qui puoi anche impostare cosa fare all' apertura, se ti da fastidio il messaggio.
- screenshot15 dice che non trova in quel file la macro LinkChange; in che momento esce quel messaggio?
-il perche' non trova LinkChange e' spiegato nello screenshot16: solo la macro di Worksheet_Activate va nel modulo di Foglio2, le altre macro vanno in un "Modulox"; quindi fai Menu /Inserisci /Modulo, poi taglia il codice da Foglio2 e spostato nel Modulo creato.

Rimango in attesa della tua decisione sulla strada da imboccare.

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

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 16/07/11 17:05

Ciao Antony47 sei sempre chiaro e diretto nelle tue spiegazioni.
Sono d'accordo che la macro ON Time sia più semplice ma la vorrei affrontare eventualmente se la SetLinkOndata non riesca a sortire gli effetti desiderati.
Inoltre considera che la LinkChange al momento non è che un esempio.
Mi serve solo per verificare che il sistema funzioni; dopo in quella routine ci sarà la determinazione di capire quale cella del range ha avuto una variazione e quindi tale cella sarà colorata in rosso,verde o gialla in base al precedente valore arrivato, quindi flipperà per 3 secondi ed emetterà un suono gaio se verde o triste se rosso.
La parte più difficile credo che sia l'individuazione delle cella variata.
Purtroppo fino a lunedì prossimo non posso fare prove in quanto la borsa è chiusa e quindi non possono arrivare dati; a meno che tu non possa darmi una dritta per simulare ciò.
Infine ti chiedo se ho ben capito che a fronte di ogni cella avente una formula DDE si apre come un canale e questo vale per tutti i fogli della cartella Excel anche se gli stessi dati sono ridondanti in più fogli.
In pratica nel mio foglio2 ci sono 10 celle per l'ultimo valore + 10 per il time + 10 per le denominazioni quindi in totale 30
In un altro foglio ci sono 8 per l'ultimo valore (di cui 5 gli stessi del foglio2) + 10 per le denominazioni ( come nel foglio2) + 10 per la sigla per un totale di 28.
Totale generale quindi 30 + 28 = 58 e con un appesantimento del sistema che dovrei cercare di ridurre.
In altre parole ogni tipo di dato dovrà essere ricevuto una sola volta con il DDE e poi copiato negli altri fogli interessati al dato.
Si avranno quindi 43 canali.
Giusto?
Saluti .

La situazione attuale è :

A- nel foglio2 quello interessato c'è
Codice: Seleziona tutto
Private Sub Worksheet_Activate()
Call LinkList
End Sub

B- nel modulo1 ci sono

Codice: Seleziona tutto
Public Sub LinkChange()
If MsgBox("Proseguire nel controllo dei dati", vbYesNo) = vbNo Then AnnullaLinkList
End Sub

Public Sub AnnullaLinkList()
Dim Links As Variant

Links = ActiveWorkbook.LinkSources(xlOLELinks)

If Not IsEmpty(Links) Then

For i = 1 To UBound(Links)
ActiveWorkbook.SetLinkOnData Links(i), ""
Next i

End If

End Sub
Public 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

In tutti gli altri fogli, userform , moduli e classi non c'è nulla.
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi Anthony47 » 18/07/11 00:13

Se vuoi procedere con SetLinkOnData dovresti impostare l' esecuzione di 13 macro diverse, una per ognuno dei 13 dati che ti interessa intercettare (il "valore", immagino); per questo leggerai la descrizione del link nella cella e inserirai quella descrizione nell' istruzione SetLinkOnData.
"Immagino" che puoi anche calcolare quella descrizione partendo dal simbolo del titolo; quindi, se ad esempio sulla riga 1 stai guardando il titolo ASR.MI, dovresti poter fare
Codice: Seleziona tutto
ActiveWorkbook.SetLinkOnData “FDF|Q!'” & "ASR.MI" &";ask'", "Macro1"   

(Macro1 e' la macro che manipolera' i dati del primo titolo, qualsiasi esso sia)
Attenzione, ho detto "immagino": non avendo una piattaforma dde su cui lavorare non ho testato la bonta' di questa "immaginazione", sara' una delle prime cose che dovrai fare tu.

Ho detto che hai bisogno di 13 macro diverse, perche'
-ho capito che hai in tutto 13 diversi dde link che vuoi tenere sotto controllo, 10 su un foglio e 3 su un altro foglio.
-la logica di SetLinkOnData presuppone una gestione diversa informazione per informazione

Cosa fa ognuna di queste macro:
-confronta il timer di sistema col timer memorizzato in una "tabella ombra" (vedi righe successive); se il timer non e' superiore almeno di N secondi a quanto memorizzato non viene fatto altro.
-confronta il dato modificato con l' equivalente dato memorizzato nella "tabella ombra" al cambiamento precedente; se piu' alto colora verde, se piu' basso colora rosso
-copia il nuovo dato nella tabella ombra; nella colonna adiacente scrive il nuovo timer corrente
Supponiamo che la tabella ombra sia sul foglio "Ombra", col A (valore) e col B (timer) mentre il dato col dde link e' in Foglio1, da J8 verso il basso, potresti quindi lavorare su un codice del tipo
Codice: Seleziona tutto
Sub Macro1
ddecambio 1
End Sub

Sub Macro2
ddecambio 2
End Sub
 etc


Codice: Seleziona tutto
Sub ddecambio(titolo)
If Timer < Sheets("Ombra").Range("B1").Offset(titolo, 0) + 5 Then Exit Sub
If Sheets("Foglio1").Range("J7").Offset(titolo, 0) < Sheets("Ombra").Range("A1").Offset(titolo, 0) Then
    Sheets("Foglio1").Range("J7").Offset(titolo, 0).Interior.ColorIndex = 3
Else: If Sheets("Foglio1").Range("J7").Offset(titolo, 0) > _
        Sheets("Ombra").Range("A1").Offset(titolo, 0).Value Then _
        Sheets("Foglio1").Range("J7").Offset(titolo, 0).Interior.ColorIndex = 4
End If
Sheets("Ombra").Range("A1").Offset(titolo, 0) = Sheets("Foglio1").Range("J7").Offset(titolo, 0)
Sheets("Ombra").Range("B1").Offset(titolo, 0) = Timer
End Sub


Ti anticipo un probabile problema: e' quasi sicuro che la macro impostata tramite SetLinkOnData sia innescata "ben prima" che il dato sia presente nella cella. Quindi l' effetto dei colorIndex introdotti con la macro ddecambio potrebbe essere ritardato di un ciclo; te ne accorgi soprattutto in situazioni di instabilita', dove il + e il - si alternano: in questi casi potresti vedere un inspiegabile colore rosso se il prezzo sale e viceversa un verde se scende.
Questo varia da pc a pc, ambiente ad ambiente.
L' unica alternativa per avere almeno i colori attendibili e' usare la formattazione condizionale su tutta la colonna dei dati in input, usando il colore Verde se questo valore e' superiore al valore nella tabella ombra e Rosso se inferiore; allora dalla ddecambio toglierai tutte le righe dalla seconda If alla End If, lasciando in pratica 3 righe piu' Titolo ed End Sub.

Infine ti chiedo se ho ben capito che a fronte di ogni cella avente una formula DDE si apre come un canale e questo vale per tutti i fogli della cartella Excel anche se gli stessi dati sono ridondanti in più fogli.
Si, e' vero; eviterai quindi accuratamente di impostare lo stesso dde link su piu' celle; se lo stesso dato serve in altra posizione lo replicherai con una formula del tipo =Foglio1!J11

Spero che questi spunti ti siano di qualche utilita'.

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

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 18/07/11 09:29

Spero che questi spunti ti siano di qualche utilita'.

Come al solito i tuoi non sono spunti ma soluzioni finali.
Se riuscissi a capire ,come da te enunciato, quale dei 13 DDE è arrivato, l'ennesima macro innescata mi darebbe l'indice della riga del titolo variato e quindi passerei questo dato ad una routine comune che farebbe poi tutto il lavoro.
Ci lavorerò e ti farò sapere.
Saluti.
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 18/07/11 11:12

Scusa vorrei un tuo aiuto se possibile per risolvere questo problema.
Codice: Seleziona tutto
If Not IsEmpty(Links) Then
    For i = 1 To UBound(Links)
      If InStr(Right(Links(i), 2), sDDE) > 0 Then
        wb.SetLinkOnData Links(i), "Foglio2.LinkChange"
        bDDE = True
      End If
    Next i
  End If

Al posto della routine che viene chiamata
"Foglio2.LinkChange" sempre fra doppi apici

vorrei lanciare la routine "Foglio2.MacroX" dove x = all'indice i del loop.
Esempio i = 1 diventa "Foglio2.Macro1"
Esempio i = 2 diventa "Foglio2.Macro2" e cosi via dicendo.

e' vero che potrei fare 11 if per quanti sono i valori dell'indice i ma non mi soddisfa tecnicamente.

L'ideale sarebbe chiamare una solo routine passando il valore dell'indice i.
Grazie e saluti.
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi Anthony47 » 18/07/11 15:28

A tua scelta:
a) l' ottimo e' nemico del bene
b) non e' cio' che non so fare che puo' risolve il mio problema

Comunque quello che chiedi io non lo so fare, che assolutamente non significa che non si puo' fare (ti sarai gia' accorto che "Foglio2.macro" & I non funziona).

In piu', con quella tecnica attivi una macro per ogni canale dde; quindi 58 macro, secondo il tuo post del 16-7.

Quindi il mio rinnovato suggerimento e' di inserire 13 istruzioni (se 13 e' il numero giusto) di tipo ActiveWorkbook.SetLinkOnData, dove il link e' "calcolato" e la macro e' impostata; 13 MacroN tutte simili a parte il valore assegnato a "titolo" nella call ddecambio; una ddecambio(titolo).

Comunque, non per nulla avevo detto che l' On Time era piu' semplice da programmare...

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

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 18/07/11 16:37

Ho provato l'istruzione
wb.SetLinkOnData Links(i) "Foglio2.Macro" &
ma non funziona.
La routine Linklist che attualmente é
Codice: Seleziona tutto
Public Sub LinkList()
  Dim wb As Workbook
  Dim Links As Variant
  Dim i As Long
  Dim bDDE As Boolean
  Const sDDE As String = ";2"
  Set wb = ThisWorkbook
  ' Obtain an array for the links to Excel workbooks
  ' in the active workbook.
  Links = wb.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)
      If InStr(Right(Links(i), 2), sDDE) > 0 Then
         wb.SetLinkOnData Links(i), "Foglio2.LinkChange"
         bDDE = True
      End If
    Next i
  End If
  If Not bDDE Then
    MsgBox "NON CI SONO I LINK DDE RICHIESTI" & "(*" & sDDE & ")", vbCritical
  End If
  Set wb = Nothing
  Foglio2.InizializzaMatrice
End

in quanto ho notato che nell'inseme del loop
If Not IsEmpty(Links) Then
For i = 1 To UBound(Links)
If InStr(Right(Links(i), 2), sDDE) > 0 Then
wb.SetLinkOnData Links(i), "Foglio2.Macro" & i
bDDE = True
End If
Next i
End If

l'istruzione
wb.SetLinkOnData Links(i), "Foglio2.Macro" & i
viene attivato N^ volta ; infatti la i mi ha dato valori tipo 15, 27 ,85 ecc, ecc mentre pensavo che il sistema ci passasse una sola volta cioè alla open del WorKbook.

Quindi è giusto verificare il tuo suggerimento:

ActiveWorkbook.SetLinkOnData “FDF|Q!'” & "ASR.MI" &";ask'", "Macro1"

che tradotto in pratica andrebbe a sostituire la routine linklist in questo modo considerando che la formula nelle celle è questa
=FDF|Q!'XXX.MI;2'
dove xxx é la sigla del titolo
Public Sub LinkList()
Dim wb As Workbook
Dim Links As Variant
Dim i As Long
Dim bDDE As Boolean
Const sDDE As String = ";2"
Set wb = ThisWorkbook
' Obtain an array for the links to Excel workbooks
' in the active workbook.
Links = wb.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
ActiveWorkbook.SetLinkOnData “FDF|Q!'ASR.MI;2'", "Macro1"
ActiveWorkbook.SetLinkOnData “FDF|Q!'UCG.MI;2'", "Macro2"
..................................
ActiveWorkbook.SetLinkOnData “FDF|Q!'ENEL.MI;2'", "Macro11"
bDDE = True
f Not bDDE Then
MsgBox "NON CI SONO I LINK DDE RICHIESTI" & "(*" & sDDE & ")", vbCritical
End If
Set wb = Nothing
Foglio2.InizializzaMatrice
End


Che ne dici?
Saluti.
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi Anthony47 » 18/07/11 22:52

Ti serve qualcosa come
Codice: Seleziona tutto
Public Sub LinkList()
ActiveWorkbook.SetLinkOnData "FDF|Q!'ASR.MI;2'", "Macro1"
ActiveWorkbook.SetLinkOnData "FDF|Q!'UCG.MI;2'", "Macro2"
'..................................
ActiveWorkbook.SetLinkOnData "FDF|Q!'ENEL.MI;2'", "Macro11"
Foglio2.InizializzaMatrice   '<< QUESTA NON SO SE SERVE
End Sub

Tutto il resto sono fronzoli inutili, anzi fronzoli pericolosi.

Pero' la macro ddecambio lavora ricevendo il numero del titolo dalla macroN che la chiama; sarebbe quindi opportuno che la sequenza dei SetLinkOnData fosse la stessa dei titoli presenti in elenco (da uno dei vecchi screenshot, la sequenza sembra ASR, C40, BP, BNG, etc).

Hai provato la formula ActiveWorkbook.SetLinkOnData “FDF|Q!'” & "ASR.MI" &";ask'", "Macro1" ? Se NO, fallo in fretta, cosi' magari invece di "ASR.MI" usi Range("C8").value in modo da non dover rivedere la macro LinkList ogni volta che cambi i titoli nel paniere e, con un po' di fantasia, riesci anche a fare una LinkList che inizializza "tutti" i titoli che si trovano da C8 in giu' senza editare il codice.

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

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 19/07/11 11:44

Mi sembra giusto ciò che suggerisci nelle tua ultima che ho cercato di mettere in atto cercando anche di capire quello che succede ed anche quello che faccio.
Al dunque ora la Linklist è:
Codice: Seleziona tutto
Public Sub LinkList()
Const sDDE As String = ";2"
Const fDDE As String = "FDF|Q!'"

ActiveWorkbook.SetLinkOnData "fDDE & Range(C8).Value & sDDE", "Macro1"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C9).Value & sDDE", "Macro2"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C10.Value & sDDE", "Macro3"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C11).Value & sDDE", "Macro4"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C12).Value & sDDE", "Macro5"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C13).Value & sDDE", "Macro6"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C14).Value & sDDE", "Macro7"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C15).Value & sDDE", "Macro8"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C16).Value & sDDE", "Macro9"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C17).Value & sDDE", "Macro10"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C18).Value & sDDE", "Macro11"

End Sub

e fin qui tutto ok infatti dopo l'avvio nel foglio2 arrivano i dati dde in continuazione.
Il problema nasce da qui in poi, considerando che ciò che vedi l'ho messo al solo scopo di capire il funzionamento del sistema e non solo di copiarlo senza capirci nulla.
Le macro che indico sono solo le prime due ma ci sono tutte e undici:
Codice: Seleziona tutto
Public Sub Macro1()
Dim nRiga As Long
nRiga = 8
MsgBox nRiga
Call LinkChange(8)
End Sub


Codice: Seleziona tutto
Public Sub Macro2()
Dim nRiga As Long
nRiga = 9
MsgBox nRiga
Call LinkChange(9)
End Sub


i msg che vedi dovrebbero servirmi come traccia per capire la sequenza in cui vengono eseguite le istruzioni
invece non ne esce nessuno.
La routine LinKChange che è:
Codice: Seleziona tutto
Public Sub LinkChange(nRiga)
Dim lRiga As Long, sTitolo As String, vPrezzo As Double, bChanged As Boolean, vOra As Double
MsgBox Cells(nRiga, 4)          ' dovrebbe segnalare il titolo che si è mosso
GoTo finejob
' .............
'Qui ci sono istruzioni che al momento voglio bypassare
' ............
finejob:
End Sub

però anch'essa non emette nessun msgbox.
Mi puoi spiegare perché e dove sbaglio.
Saluti.
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 19/07/11 15:32

In relazione al mio post » 19/07/11 12:44 ti voglio ragguagliare sulle prove fatte.
In relazione a queste istruzioni
ActiveWorkbook.SetLinkOnData "fDDE & Range(C8).Value & sDDE", "Macro1"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C9).Value & sDDE", "Macro2"


le cui macro non emettevano i msgbox ho pensato che forse andavano scritte:

ActiveWorkbook.SetLinkOnData "fDDE & Range(C8).Value & sDDE", "Foglio2.Macro1"
ActiveWorkbook.SetLinkOnData "fDDE & Range(C9).Value & sDDE", "Foglio2.Macro2"


ma il risultato è sempre stato negativo anche nella successiva LinKChange

Codice: Seleziona tutto
[quote]Public Sub LinkChange()
Dim lRiga As Long, sTitolo As String, vPrezzo As Double, bChanged As Boolean, vOra As Variant

For lRiga = 8 To 18
    vPrezzo = Range("J" & lRiga).Value
    vOra = Range("N" & lRiga).Value
   
    Range("Q" & lRiga) = vPrezzo
    Range("R" & lRiga) = vOra     
Next lRiga
End Sub[/quote]


in cui peraltro non solo non viene emessa la msgbox (qui eliminata) ma pur arrivando i dati sul foglio2
le istruzioni di salvataggio dei dati dde sulle colonne ombra Q ed R non funzionavano.
In realtà a me sembra che il ragionamento teorico dovrebbe funzionare e non so spiegarmi perché ciò non avviene.
Allora ho pensato di tornare ad una vecchia prova precedente in cui la LinkList è la classica:

Codice: Seleziona tutto
Public Sub LinkList()
  Dim wb As Workbook
  Dim Links As Variant
  Dim i As Long
  Dim bDDE As Boolean
  Const sDDE As String = ";2"
 
  Set wb = ThisWorkbook
  ' Obtain an array for the links to Excel workbooks
  ' in the active workbook.
  Links = wb.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)
      If InStr(Right(Links(i), 2), sDDE) > 0 Then
        wb.SetLinkOnData Links(i), "Foglio2.LinkChange"
        bDDE = True
      End If
    Next i
  End If
  If Not bDDE Then
    MsgBox "NON CI SONO I LINK DDE RICHIESTI" & "(*" & sDDE & ")", vbCritical
  End If
  Set wb = Nothing
End Sub


e con questo sistema arrivano sia i dati dde sia il loro salvataggio nelle colonne ombra.
E' vero che si perde l'indicazione immediata di quale riga è variata ma con un loop da 8 a 18 confrontando le celle J con la ombra Q e la N con la ombra R si determina se il titolo è variato o no.
Al momento quindi anche se non tecnicamente bello questo è l'unico sistema che sembrerebbe funzionare.
Naturalmente non poteva mancare un inconveniente perché quando si attiva il dde le 11 colonne J ed N contengono la dicitura
#N/A
e per 11 volte viene emessa una segnalazione di
"Tipo non corrispondente"
ma poi tutto sembra funzionare tranquillamente.
Al momento quindi sto lavorando all'eliminazione di tale anomalia.
Fammi sapere se hai novità sul precedente sistema cioè le 11 macro e/o darmi un dritta per eliminare la segnalazione di tipo non corrispondente senza inviare 11 volte il tasto andare avanti.
Saluti.
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi Anthony47 » 19/07/11 16:23

Quindi tu non eri mai riuscito ad attivare una macro qualsiasi al cambiamento di una cella dde!?

Ricorda che il processo e':
-inserire le macro di cui parliamo in un "Modulo di codice" (tipo Modulo1), non in un "Modulo di foglio"
-eseguire una volta la macro LinkList
-aspettare una modifica nelle celle dde e controllare se la MacroN viene eseguita
-e' opportuno anche avere una macro "LinkUnlist" che ha la stessa struttura della LinkList solo che annulla i comandi dati; la sintassi di ogni riga e' SetLinkOnData “FDF|Q!'ASR.MI;2'", "" (cioe' lasciando vuoto il campo "macro da eseguire"), da lanciare prima di chiudere il file; questo perche' non so che effetto ha la chiusura del file sulle impostazioni date, e non sono in grado di controllarlo).

Se questo processo finora ti ha dato esito negativo, allora mi avrebbe interessato sapere cosa succedeva mettendo nella macro LinkList le stringhe del link e non il loro calcolo; cioe' col link scritto nella formula (es SetLinkOnData “FDF|Q!'ASR.MI;2'", "Macro1"), e non calcolato (es SetLinkOnData "fDDE & Range(C8).Value & sDDE", "Macro1")
Inoltre avresti dovuto controllare se il risultato della formula dava esattamente la stringa richiesta; a me sembra che la formula adottata manca dell' ultimo "apostrofo" dopo ";2".
Oltre al dubbio sull' apostrofo mancante, dalla macro ultima postata mi pare che tu abbia messo le macro nel modulo Foglio2; in questi moduli e' opportuno metterci solo le macro di evento(Change, SelectionChane, Activate, etc etc).

Per quanto riguarda l' errore "Tipo non corrispondente" non ho capito in che fase ti compare e su quale istruzione.

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

Re: Lavorare celle DDE rispetto al variare del loro valore

Postdi giamoros » 19/07/11 17:12

Quindi tu non eri mai riuscito ad attivare una macro qualsiasi al cambiamento di una cella dde!?

Evidentemente no, anche se i dati DDE arrivavano.
Inserire le macro di cui parliamo in un "Modulo di codice" (tipo Modulo1), non in un "Modulo di foglio"

Le macroN come anche la LinkChanghe sono tutte su Modulo foglio
Le sposterò tutto su modulo.
Domamda "E' ininfluente se vanno tutte su un modulo compresa la LinkList o è opportuno smistarle fra più moduli?

Se questo processo finora ti ha dato esito negativo, allora mi avrebbe interessato sapere cosa succedeva mettendo nella macro LinkList le stringhe del link e non il loro calcolo; cioe' col link scritto nella formula (es SetLinkOnData “FDF|Q!'ASR.MI;2'", "Macro1"), e non calcolato (es SetLinkOnData "fDDE & Range(C8).Value & sDDE", "Macro1")

Oltre a questi due modi ne ho provati altri per la creazione delle stringhe e non ho mai avuto errore
né nella compilazione né in esecuzione in quanto i dati DDE sono sempre arrivati ma il loro salvataggio non ha mai avuto successo.
Ti rifarò tutte le prove tenendo conto di quanto suggeritomi e ti farò sapere.
Saluti
Windows 8.1 Excel 2007
giamoros
Utente Junior
 
Post: 48
Iscritto il: 30/06/11 15:22

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Lavorare celle DDE rispetto al variare del loro valore":

BTp Valore
Autore: MarioLombardi
Forum: Forum off-topic
Risposte: 2

Chi c’è in linea

Visitano il forum: Nessuno e 53 ospiti