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:
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:
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:
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:
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:
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:
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.