Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel VBA/DDE] Problema macro

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 VBA/DDE] Problema macro

Postdi ale24 » 12/03/08 18:06

Ciao a tutti, sono giunto in questo forum grazie ad una ricerca su google, che mi ha portato a questo risultato:

viewtopic.php?f=26&t=46965&st=0&sk=t&sd=a

Grazie ai suggerimenti di quel thread sono riesco a "sentire" le variazioni della cella DDE.
Premessa: purtroppo non mastico il linguaggio VBA, anche se imparo in fretta :D .

La situazione attuale è questa:
Ho in A1 una cella su cui è copiata una formula DDE [quotazione realtime], vorrei creare una macro che mi registra ogni tre minuti il valore di apertura, il valore di chiusura, il minimo ed il massimo compresi in quei tre minuti.

Mi spiego meglio attraverso un esempio della storicizzazione che vorrei ottenere:
t=0 (istante in cui viene avviata la macro)
Il titolo quota 5 ----> è il valore di apertura dei tre minuti, memorizzalo in B1

In un qualsiasi istante tra t=0 e t=3 (ad esempio t=1:27)
in titolo quota 4.9 -----> memorizza in C1 come minimo

in t=1:59
il titolo quota 4.8 ------> è un nuovo minimo, sostiuisci il valore a C1

in t=2.23
il titolo quota 5.1 ------> è un massimo, copia il valore in D1

in t=3-
il titolo quota 5.05 -----> è il valore di chiusura dei 3 minuti, memorizzalo in E1

in t=3+
il titolo quota 5.05 ----> è il valore di apertura dei 'nuovi' tre minuti, memorizzalo in B2

in t=3.25
il titolo quota 4,98 ----> non è il minimo assoluto, ma è comunque il minimo registrato nei 'secondi' tre minuti, memorizzalo in C2

.... e così via.

Otterrei dunque:

Nella cella A1 = data feed
Nella colonna B: tutte le aperture in ordine cronologico degli intervalli di tre minuti;
Nella colonna C: tutti i minimi registrati all'interno degli intervalli stessi;
Nella colonna D: tutti i massimi;
Nella colonna E: tutte le chiusure;

Vi chiedo dunque se gentilmente mi deste un input in questa direzione, o mi indicaste qualche risorsa da cui prendere spunto, perchè purtroppo non so dove sbattere la testa.

Grazie a tutti e buona serata. ;)
ale24
Newbie
 
Post: 6
Iscritto il: 12/03/08 17:23

Sponsor
 

Re: [Excel VBA/DDE] Problema macro

Postdi Anthony47 » 12/03/08 23:50

Ciao Ale e benvenuto nel forum.

Seguendo la discussione da te linkata hai imparato a far partire una macro quando il dato importato tramite dde subisce un cambiamento. In quella macro dovrai ora mettere le istruzioni che ti portano ad accumulare nelle varie celle il minimo, il massimo, il "corrente" (che copia banalmente il valore in A1).
In parallelo dovrai attivare una macro che si rischedula con il metodo "On Time" ogni 3 minuti, e che userai per accantonare in uno storico le celle che ti interessano.
Guarda questi topics che affrontano argomenti simili:http://www.pc-facile.com/forum/viewtopic.php?t=52172 e viewtopic.php?f=26&t=57999

E se non trovi lo spunto, o per aiuti piu' precisi, posta ancora.

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

Re: [Excel VBA/DDE] Problema macro

Postdi ale24 » 13/03/08 08:06

Avevo visto entrambe le discussioni, ora provo a lavorarci un po' sopra.

Ciao!
ale24
Newbie
 
Post: 6
Iscritto il: 12/03/08 17:23

Re: [Excel VBA/DDE] Problema macro

Postdi ale24 » 13/03/08 08:21

Scusate ma non trovo il tasto edit, quindi posto un altro messaggio.

Le macro che sto utilizzando sono queste due:

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 "FDF|Q!F.MI;Last'", "LinkChange"
           Next I
       Else
           MsgBox "This workbook does not contain any links " & _
           "to other workbooks"
       End If
    End Sub


Che intercetta le variazioni della cella dde, in questo caso rappresentata dall'ultimo prezzo battuto per l'azione fiat e...

Codice: Seleziona tutto
Sub LinkChange()
    ddedati = "A1:A1"   '<<< Area da copiare
    TWS = "Foglio2"     '<<< Foglio su cui storicizzare
    SWS = ActiveSheet.Name
    Range(ddedati).Copy
    Sheets(TWS).Select
    Range("A65536").End(xlUp).Offset(1, 0).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Application.CutCopyMode = False
    Sheets(SWS).Select
End Sub


... che prende il valore di A1 e lo incolla [speciale,valori] nella colonna A del foglio2.

Sulla carta, ad ogni variazione della cella dde, dovrebbe lanciare la macro di copia incolla.
In realtà non funziona, o meglio, credo che mi copi solo ed esclusivamente il primo valore determinato dal cambiamento della cella dde subito dopo aver lanciato la macro.

Why?
:?:
ale24
Newbie
 
Post: 6
Iscritto il: 12/03/08 17:23

Re: [Excel VBA/DDE] Problema macro

Postdi ale24 » 13/03/08 09:46

Ok, c'era un errore nella trascrizione del codice dde, mancava il primo apice :D

Ho cambiato un pochino strada, ora ho un bottone che fa partire la macro [come da istruzioni: http://www.willowsolutions.com/talk/view_msg.asp?id=61 e da thread linkato in precedenza]

Codice: Seleziona tutto
Dim bRunNow As Boolean
     Sub Test1()
    With ActiveWorkbook
    bRunNow = .Worksheets("Foglio1").Range("C1").Value
    If bRunNow Then .SetLinkOnData "FDF|Q!'F.MI;Last'", "Test2" Else .SetLinkOnData "FDF|Q!'F.MI;Last'", ""
    End With
    End Sub
     Sub Test2()
    ddedati = "C3:C3"   '<<< Area da copiare
    TWS = "Foglio1"     '<<< Foglio su cui storicizzare
    SWS = ActiveSheet.Name
    Range(ddedati).Copy
    Sheets(TWS).Select
    Range("A65536").End(xlUp).Offset(1, 0).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Sheets(SWS).Select
    End Sub
     Sub ButtonTest()
    Test1
    End Sub


Ora davvero non so come procedere per quanto riguarda l'ontime:

1- dovrebbe partire il timer esattamente in concomitanza con l'esecuzione della macro Test2;
2- dovrebbe prendere dalla colonna A, a partire dalla riga 2 tutti i dati memorizzati negli ultimi 3 minuti
3- ne dovrebbe estrarre il primo, il massimo, il minimo e la chiusura memorizzandoli in questo ordine in 4 colonne diverse, magari EFGH.
4- dovrebbe cancellare i dati memorizzati fino a quel momento dalla macro Test2 [il data feed ne spara fuori centinaia al minuto, se non li cancello rischio di andare in overflow]

poi per il grafico ne parleremo più avanti :lol:

Suggerimenti?
ale24
Newbie
 
Post: 6
Iscritto il: 12/03/08 17:23

Re: [Excel VBA/DDE] Problema macro

Postdi Anthony47 » 13/03/08 10:58

Come da suggerimenti dati nel mio post di ieri sera, la macro che si attiva sul dde change deve calcolare min, max e current senza trasferire niente. Metterai, come da tuoi desideri, Min in C1, Max in D1 e Current (la copia di A1) in E1.
Userai istruzioni del tipo
Codice: Seleziona tutto
If Range("A1").value<Range("C1").value Or Range("C1").value=0 then Range("C1").value =Range("A1").value       'Calcolo Min

(queste celle confliggono con il tuo bRunNow anche lui messo in C1; spostalo in M1)
Il codice che hai messo in Test2 lo metterai invece in una macro che si rischedula (la Restarta dei topic che ti ho linkato), che banalmente prendera' B1:E1 e li copiera' su Foglio2, poi copia E1 in B1, e azzera C1:D1.

Con la tecnica dei Flag (Restarta usa gia' M1 per sapere se deve rischedularsi, che e' l' equivalente del tuo bRunNow; ne puoi aggiungere altri), puoi far partire il dde + Restarta quando ti pare e invece copiare i dati su Foglio2 solo dopo l' orario di apertura borsa e fino alla chiusura. Ad esempio in M2 l' orario di apertura e in M3 l' orario di chiusura; poi Restarta sonda M1 per sapere se rischedularsi e M2/M3 per sapere se deve o no copiare in Foglio2.

Spero sia comprensibile.
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: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel VBA/DDE] Problema macro

Postdi ale24 » 13/03/08 12:32

Credo di aver capito, tuttavia c'è un problema di fondo.
Seguendo il tuo filo, il close di una miniserie di 3 minuti è uguale all'open della serie successiva. Questo è vero nel 95% dei casi, ma ci sono appunto casi in cui c'è discontinuità. In t=3- prezzo=5, in t=3+ prezzo 5.2.
Quindi per me sarebbe importante aggiornare l'open al prezzo battuto in quell'istante, e non semplicemente riportare il close precedente.
In ogni caso mi hai illuminato. :lol: ;)
Grazie del supporto!
ale24
Newbie
 
Post: 6
Iscritto il: 12/03/08 17:23

Re: [Excel VBA/DDE] Problema macro

Postdi ale24 » 13/03/08 19:21

Codice: Seleziona tutto
Dim bRunNow As Boolean
     Sub Test1()
    With ActiveWorkbook
    bRunNow = .Worksheets("Foglio1").Range("C1").Value
    If bRunNow Then .SetLinkOnData "FDF|Q!'F.MI;Last'", "Test2" Else .SetLinkOnData "FDF|Q!'F.MI;Last'", ""
    End With
    End Sub
     Sub Test2()
    ddedati = "C3:C3"   '<<< Area da copiare
    TWS = "Foglio1"     '<<< Foglio su cui storicizzare
    SWS = ActiveSheet.Name
    Range(ddedati).Copy
    Sheets(TWS).Select
    If Range("C3").Value < Range("F2").Value Or Range("F2").Value = 0 Then Range("F2").Value = Range("C3").Value  'Calcolo Min
    If Range("C3").Value > Range("E2").Value Or Range("E2").Value = 0 Then Range("E2").Value = Range("C3").Value  'Calcolo Max
    Range("G2").Value = Range("C3").Value                                                                         'Calcolo Current
    Sheets(SWS).Select
    End Sub
     Sub ButtonTest()
    Test1
    End Sub
     Sub Restarta()
    DeltaT = "00:03:00"
    CellaFlag = "N1"
    dati = "E2:G2"
    DWS = "Foglio1"
    CWS = ActiveSheet.Name
    Range(dati).Copy
    Sheets(DWS).Select
    Range("J65536:L65536").End(xlUp).Offset(1, 0).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Range("G2").Copy
    Range("I65536").End(xlUp).Offset(1, 0).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Range(dati).Select
    Selection.ClearContents
    Sheets(CWS).Select
    If Range(CellaFlag).Value = 0 Then
    Range(CellaFlag).Interior.ColorIndex = xlNone
    Exit Sub
    End If
    Application.OnTime Now + TimeValue(DeltaT), "Restarta"
    Range(CellaFlag).Interior.ColorIndex = 3   '<<< 3=ROSSO; 4=Verde; 6=Giallo;7=Fucsia; 8=Celeste
    'Range("N1").Value = Range("N1").Value + 1
    End Sub


Questo è dove sono arrivato, mi sembra funzionare discretamente.

La prima importazione della macro Restarta() funge da inizializzazione, poichè mi riporta i primi valori catturati dal dde.
In questo modo riempie la prima riga di min, max e close e inizia dalla seconda con l'open.
Vi riporto un'immagine per mostrarvi quello che intendo:

Immagine
ale24
Newbie
 
Post: 6
Iscritto il: 12/03/08 17:23

Re: [Excel VBA/DDE] Problema macro

Postdi Anthony47 » 13/03/08 23:19

Se il risultato e' quello che volevi ottenere, allora e' Ok cosi'; anche se al momento ci sono numerose istruzioni inutili; ad esempio tutte quelle che sono relativi a TWS (target WorkSheet) e SWS (Start WorkSheet), sia su Test che su Restarta, visto che fai tutto sullo stesso foglio.

Come unica semplificazione io calcolerei il valore di open in D2, ad esempio tramite
Codice: Seleziona tutto
If Range("D2").value =0 Then Range("D2").Value = Range(ddedati).value  '<<Questa va in Test2
dati = "D2:G2"              '<<< QUESTA E' una MODIFICA di quanto hai usato (E2:G2)
(Open sara' il primo valore rilevato dopo l' esecuzione di Restarta, come volevi tu)
Ovviamente dovresti modificare in Restarta l' istruzione Range("J65536:L65536").etc etc in Range("I65536").etc etc ed eliminare le istruzioni che copiano G2 in col I.

Ma sono sicuro che, riguardandola tu stesso tra un paio di ulteriori macro vorrai fare altre semplificazioni.

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


Torna a Applicazioni Office Windows


Topic correlati a "[Excel VBA/DDE] Problema macro":


Chi c’è in linea

Visitano il forum: Marius44, patel e 10 ospiti