Comunicarea prin intermediul DDE

Dacă aplicația cu care doriți să comunicați nu acceptă Automation, încercați Dynamic Data Exchange (DDE).

DDE este un protocol care stabilește un canal între două aplicații prin care pot face schimb automat de date. DDE poate fi dificil de configurat, dar odată ce ați înțeles modul de lucru, este de obicei de încredere.

Nu toate aplicațiile acceptă DDE. Printre aplicațiile Office, doar Word, Excel și Access acceptă DDE, iar PowerPoint și Outlook nu. În plus, Microsoft avertizează că DDE nu este o tehnologie securizată. Deci, să o utilizați numai în situațiile în care nu sunt vulnerabile la intruziune din afara.

În următoarele descrieri de declarații DDE, voi folosi termenul metodă în sensul său mai generic, non-OOP. Mult timp în urmă, atunci când DDE a fost introdus (în Windows 3.0!), programarea orientată pe obiecte nu era încă la modă.

O conversație DDE tipică poate conține următoarele acțiuni:

  • Folosirea metodei DDEInitiate pentru a porni o conexiune DDE și a stabili canalul pe care funcționează conexiunea
  • Folosirea metodei DDERequest pentru a returna text din cealaltă aplicație sau metoda DDEPoke pentru a trimite text celeilalte aplicații
  • Folosirea metodei DDEExecute pentru a executa o comandă în cealaltă aplicație
  • Folosirea metodei DDETerminate pentru a închide canalul DDE curent sau folosirea metodei DDETerminateAll pentru a închide toate canalele DDE.

Utilizarea DDEInitiate pentru a porni o conexiune DDE

Pentru a porni o conexiune DDE, utilizați metoda DDEInitiate. Metoda DDEInitiate utilizează următoarea sintaxă:

   expression.DDEInitiate(App, Topic)

Componentele sintaxei sunt:

  • expression este o expresie opțională care specifică un obiect Application.
  • App este un argument necesar de tip String care specifică numele aplicației cu care urmează să fie pornită conexiunea DDE.
  • Topic este un argument necesar de tip String care specifică subiectul DDE (cum ar fi un fișier deschis) în aplicație. Pentru a descoperi lista de subiecte disponibile pentru o aplicație, trimiteți o solicitare DDE (prin metoda DDERequest, discutată în secțiunea următoare) la obiectul System din aplicație.

DDEInitiate returnează numărul canalului DDE stabilit. Apoi utilizați acest număr pentru apeluri DDE ulterioare.

De exemplu, următoarele declarații declară variabila lngDDEChanneli de tip Long și îi atribuie un canal DDE stabilit cu registrul de lucru RezultateVanzari.xlsm din Excel::

   Dim lngDDEChanneli As Long
   lngDDEChanneli = DDEInitiate("Excel", "RezultateVanzari.xlsm")

Utilizarea DDERequest pentru returnarea textului dintr-o altă aplicație

Pentru a returna un șir de text din altă aplicație, utilizați metoda DDERequest. Metoda DDERequest are următoarea sintaxă:

expression.DDERequest(Channel, Item)

Componentele sintaxei sunt:

  • expression este o expresie opțională care returnează un obiect Application.
  • Channel este un argument necesar de tip Long care specifică canalul DDE de utilizat pentru solicitare.
  • Item este un argument obligatoriu de tip String care specifică elementul solicitat.

Pentru a obține lista de subiecte disponibile prin DDE, solicitați elementul Topics din subiectul System.

De exemplu, următoarele declarații stabilesc un canal DDE la FrontPage (utilizând DDEInitiate) și returnează lista de subiecte DDE, atribuind o listă la variabila strDDETopics de tip String:

Dim lngDDEi As Long
Dim strDDETopics As String
lngDDEi = DDEInitiate(App:="FrontPage", Topic:="System") 
strDDETopics = DDERequest(Channel:=lngDDEi, Item:="Topics")

Deschideți Excel, clic pe fila File de pe Ribbon, apoi clic pe opțiunea New. În câmpul de căutare din partea de sus, tastați Monthly Family Meal Planner. Clic pe acel șablon pentru a-l selecta, apoi clic pe butonul Create.

Acum deschideți VBA Editor din Word și tastați următoarea procedură. Următoarele declarații stabilesc un canal DDE la registrul de lucru RaportVanzari.xlsm din Excel și returnează conținutul celulei C7 (R7C3) în variabila strResult de tip String:

Sub DDEtoExcel()
Dim lngDDEChanneli As Long, strResult As String
lngDDEChanneli = DDEInitiate("Excel", "Monthly family meal planneri") 
strResult = DDERequest(lngDDEChannel1, "R11C4")
  MsgBox strResult 
DDETerminateAll
End Sub

Nu salvați acest registru de lucru. Apăsați F5 pentru a-l testa, și ar trebui să vedeți o casetă de mesaje care afișează "Beef and Mushroom Skillet Supper".

Pentru ca să funcționeze DDE, trebuie să utilizați numele corect, complet al documentului țintă așa cum apare în bara de titlu a aplicației. În acest caz, documentul țintă este un registru de lucru Excel denumit Monthly family meal planner1.

Codul anterior funcționează numai dacă nu ați salvat încă registrul de lucru Monthly family meal planner1 pentru că înainte de a fi salvat, un registru de lucru nou nu are nicio extensie de nume de fișier adăugată la numele său. Cu toate acestea, dacă ați salvat deja acest registru de lucru, trebuie să adăugați orice extensie de nume de fișier ați folosit, de exemplu.xlsm. Iată un exemplu:

lngDDEChannel1 = DDEInitiate("Excel", "Monthly family meal planner1.xlsx")

Declarația DDETerminateAll este explicată mai jos.

Folosirea DDEPoke pentru a trimite text spre altă aplicație

Pentru a trimite text la o altă aplicație, utilizați metoda DDEPoke. Metoda DDEPoke folosește sintaxa următoare:

expression.DDEPoke(Channel, Item, Data)

Componentele sintaxei sunt:

  • expression este o expresie opțională care returnează un obiect Application.
  • Channel este un argument necesar de tip Long care specifică canalul DDE de utilizat.
  • Item este un argument necesar de tip String care specifică elementul la care se trimit datele.
  • Data este un argument necesar de tip String care specifică datele care trebuie trimise.

Continuând să utilizați exemplul anterior, următoarele declarații utilizează metoda DDEPoke pentru a atribui datele Potato Salad Surprise la celula R11 C4 din foaia de lucru:

Sub DDEPokeExcel()
Dim lngDDEChannel1 As Long, strResult As String
lngDDEChannel1 = DDEInitiate("Excel", "Monthly family meal planner1") 
strResult = DDERequest(lngDDEChannel1, "R11C4")
DDEPoke Channel:=lngDDEChannel1, Item:="R11C4", Data:="Potato Salad" 
DDETerminateAll
End Sub

Acum, uitați-vă la foaia de lucru Excel și veți vedea că "Beef and Mushroom Skillet Supper" a fost înlocuit cu "Potato Salad".

Utilizarea DDEExecute pentru ca o aplicație să execute o comandă în altă aplicație

Pentru a executa o comandă în altă aplicație, utilizați metoda DDEExecute. Metoda DDEExecute are următoarea sintaxă:

expression.DDEExecute(Channel, Command)

Componentele sintaxei sunt:

  • expression este o expresie opțională care returnează un obiect Application.
  • Channel este un argument necesar de tip Long care specifică canalul DDE care va fi folosit.
  • Command este un argument necesar de tip String care specifică comanda sau seria de comenzi pentru a fi executate.

De exemplu, următoarele declarații stabilesc un canal DDE în Excel și emite o comandă Close pentru a închide registrul de lucru activ:

Sub DDEExec()
Dim lngMyChannel
lngMyChannel = DDEInitiate(App:="Excel", Topic:="System")
DDEExecute lngMyChannel, Command:="[Close]"
End Sub

Dacă registrul de lucru pe care îl închideți are date nesalvate, Excel va afișa o casetă de mesaje care vă solicită să îl salvați mai întâi, împiedicând astfel închiderea până când solicitarea este îndeplinită.

Utilizarea DDETerminate pentru a închide un canal DDE

După ce ați terminat o comunicare DDE, utilizați metoda DDETerminate pentru a închide canalul DDE pe care l-ați deschis. Sintaxa pentru metoda DDETerminate este:

expression.DDETerminate(Channel)

Iată componentele sintaxei:

  • expression este o expresie opțională care returnează un obiect Application.
  • Channel este un argument necesar de tip Long care specifică canalul DDE care va fi închis.

Următoarele declarații utilizează exemplul anterior, închizând canalul DDE care a fost deschis:

Dim lngMyChannel
lngMyChannel = DDEInitiate(App:="Excel", Topic:="System")
DDEExecute lngMyChannel, Command:="[Close]"
DDETerminate lngMyChannel

Utilizarea DDETerminateAll pentru închiderea tuturor canalelor DDE deschise

Pentru a închide toate canalele DDE deschise, utilizați metoda DDETerminateAll:

DDETerminateAll

Deoarece VBA nu închide automat canalele DDE atunci când se termină o procedură, este o idee bună să utilizați o declarație DDETerminateAll pentru a vă asigura că nu ați lăsat din greșeală canale DDE deschise.