domenica 13 novembre 2011

[Excel VBA] DDE

Descrizione :
Un mio esempio pratico di utilizzo DDE da Excel VBA completo di generatore DDE ( VB6 ) per simulazioni.

+ Articolo :

Tempo fa ho creato questo esempio per un Forum, dopo un buon bombardamento di richieste da parte di utenti che ( purtroppo per loro ) devono avere a che fare con il DDE in Excel.

Per chi non sapesse di cosa sto parlando, DDE sta per "Dynamic Data Exchange" :
http://en.wikipedia.org/wiki/Dynamic_Data_Exchange

L'esempio simula un generatore di valori, che ho scritto in VB6, dal momento che VB6 ha un supporto nativo al DDE, e un progetto Excel che "ascolta" e registra i dati DDE in arrivo...
Chiaramente il punto su cui focalizzare l'attenzione è il lato-Excel della tecnica in quanto, nel caso reale, i dati arriveranno tipicamente da links remoti e non da un generatore/simulatore locale.

--> Listener_DDE.xls :
WorkBook Excel con il codice VBA essenziale per ricevere i dati DDE e inoltre per verificare se e quando i dati arrivano effettivamente.
L'essenziale per il Listener_DDE.xls è che ci sia un Foglio "DDE" e un Modulo VBA.
Su Foglio "DDE" ho inserito due CommandButton ( del tipo ActiveX, come sempre ), cmd_attivadde e cmd_disattivadde.
La loro funzione, come suggeriscono i nomi, è di attivare/disattivare l'ascolto di eventuali dati DDE in arrivo.

Il codice per il Foglio "DDE" è il seguente :

Private Sub cmd_attivadde_Click()

    ApplicaFormuleDDE

    Dim SorgentiDDE As Variant
    SorgentiDDE = ActiveWorkbook.LinkSources(xlOLELinks)
    Dim i As Integer
    If Not IsEmpty(SorgentiDDE) Then
        For i = 1 To UBound(SorgentiDDE)
            ActiveWorkbook.SetLinkOnData SorgentiDDE(i), "SuArrivoDatiDDE"
        Next i
    Else
        MsgBox "Nessuna Sorgente DDE Rilevata", vbExclamation, "Errore"
    End If

End Sub

Private Sub ApplicaFormuleDDE()

    'A1
    Sheets("DDE").Range("A1").FormulaR1C1 = "=GeneratoreValori_DDE|Form1!txt_dati01"

End Sub

Private Sub cmd_disattivadde_Click()

    'A1
    Sheets("DDE").Range("A1").FormulaR1C1 = ""

End Sub

"SuArrivoDatiDDE", come si nota è il nome della Routine, passato come stringa al Metodo SetLinkOnData.
Per questo ho creato un Modulo VBA e vi ho inserito il codice seguente :

Public Sub SuArrivoDatiDDE()

    Sheets("DDE").Range("B1").FormulaR1C1 = Sheets("DDE").Range("A1").Text

End Sub

La Public Sub SuArrivoDatiDDE() è la Routine in cui inserire le varie operazioni da eseguire sui dati DDE in arrivo.
In questo caso l'unica operazione eseguita è la copia dell'ultimo valore ricevuto da A1 a B1.
Ovviamente si possono inserire istruzioni di copia in righe e colonne, registrazione dati in file di testo, inserimenti a DB, grafici e quant'altro...

--> GeneratoreValori_DDE.exe :
L'applicazione VB6 che genera, in questo caso, una semplice serie di valori numerici crescenti, ed è costituita da una sola Form ed alcuni semplici controlli.
Un'immagine rende subito l'idea della struttura :


ComboBox --> cmb_secondi
CommandButton --> cmd_attivainviodde
CommandButton --> cmd_disattivainviodde
TextBox --> txt_dati01
Timer --> Timer1

Il codice completo del Progetto / Form VB6 di GeneratoreValori_DDE è il seguente :
'****************************************************
'***** Generatore Dati DDE Locale *******************
'***** MARCOGG 2011 *********************************
'****************************************************

' Impostare a Design le seguenti proprietà su Form1 :
' LinkMode = 1 - Source
' LinkTopic = Form1

Private num As Long

Private Sub cmb_secondi_Click()

    Timer1.Interval = CInt(cmb_secondi.Text) * 1000

End Sub

Private Sub Form_Load()

    Dim i As Integer
    For i = 1 To 60
        cmb_secondi.AddItem (i)
    Next i
    cmb_secondi.ListIndex = 0

End Sub

Private Sub cmd_attivainviodde_Click()

    cmb_secondi.Enabled = False
    Timer1.Enabled = True
    
End Sub

Private Sub cmd_disattivainviodde_Click()

    cmb_secondi.Enabled = True
    Timer1.Enabled = False
    
End Sub

Private Sub Timer1_Timer()

    num = num + 1
    txt_dati01.Text = num

End Sub

Naturalmente potrei avere un Generatore VB6 con N controlli che generano N valori, anche su tempi diversi e il WorkBook-Listener potrebbe avere le corrispondenti N Celle che li ricevono...

--> Run :

1. Lanciare in esecuzione GeneratoreValori_DDE.exe e Listener_DDE.xls.

2. Selezionare sul Generatore l'intervallo in secondi desiderato tra un invio dati DDE e il successivo, e poi Click su "Attiva Invio Dati DDE".

3. Sul WorkBook, Click su "Attiva Ascolto DDE".

A questo punto c'è tutto l'essenziale per approfondire ed eseguire test, e ovviamente per completarlo e complicarlo a piacere.

+ Fine Articolo.

Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.



0 commenti:

Posta un commento

 
Design by Free WordPress Themes Modificato da MarcoGG