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