Sonntag, 10. Januar 2010

DDE Kommunikation von Word VBA nach VB

Betreff DDE-Kommunikation von Word VBA nach VB6
Von Wolfgang Backes
Datum 31.10.2009 14:52:22

Hallo miteinander,

kann mir bitte jemand bei folgendem Problem helfen?

Ein Word-2003-Makro und ein VB6-Programm greifen beide auf die gleiche
Datenbank zu. Wenn das Word-Makro einen Datenbankeintrag verändert,
soll es das VB6-Programm hierüber per DDE informieren, damit bestimmte
Controls im VB6-Programm automatisch refreshed werden.

Bisher habe ich DDE nur für die Kommunikation zwischen VB6-Programmen
verwendet und hatte damit keine Probleme. Jetzt stelle ich fest, dass
der DDE-Mechanismus von VBA völlig anders funktioniert. In der
Online-Hilfe ist ein Beispiel für die Fernsteuerung von Excel durch
Word angegeben:

lngChannel = DDEInitiate(App:="Excel", Topic:="System")
DDEExecute Channel:=lngChannel, Command:="[New(1)]"
DDETerminate Channel:=lngChannel

Ist ja gut und schön, auf diese Weise kann ich vielleicht andere
Office-Programme fernsteuern. Aber wie muss "Command:=" lauten, wenn
ich damit ein VB6-Programm fernsteuern will? Das Einzige, was mir dazu
einfällt, ist so etwas wie:
Command:="txtDDE.text="+chr(34)+"test"+chr(34)

Aber das funktioniert nicht.

Für jeden Tipp dankbar,
Wolfgang

Betreff Re: DDE-Kommunikation von Word VBA nach VB6
Von "Horst Heinrich Dittgens"
Datum 31.10.2009 15:58:15

Also wenn ich das richtig in Erinnerung habe, dann ist der Execute-Parameter
das Zeugs, was an den Empfänger gesendet werden soll, d.h. irgendein
Kommando sprich String, der vom Empfänger interpretiert werden muß. Für
Windows & Co ist dieser Dateninhalt neutral, er wird nur ans Ziel weiter
transportiert.

Im vorliegenden Beispiel ist der Empfänger Excel, und das versteht 'New'
eben als Befehl zum Anlegen einer neuen Tabelle. Was ein VB6-Programm macht,
wenn es einen Befehl 'New' erhält, ist dagegen seine Sache.

Wenn Du schon bisher DDE von VB-App zu VB-App gemacht hast, dann verstehe
ich Deine Frage nicht so ganz, denn dann solltest Du doch bereits eine
funktionierende App haben, die ein DDE-Kommando empfangen und darauf
reagieren kann? Von wem das DDE-Kommando kommt ist unerheblich.


Betreff Re: DDE-Kommunikation von Word VBA nach VB6
Von Wolfgang Backes
Datum 31.10.2009 16:33:11

"Horst Heinrich Dittgens" schrieb:

>Also wenn ich das richtig in Erinnerung habe, dann ist der Execute-Parameter
>das Zeugs, was an den Empfänger gesendet werden soll, d.h. irgendein
>Kommando sprich String, der vom Empfänger interpretiert werden muß. Für
>Windows & Co ist dieser Dateninhalt neutral, er wird nur ans Ziel weiter
>transportiert.
>
>Im vorliegenden Beispiel ist der Empfänger Excel, und das versteht 'New'
>eben als Befehl zum Anlegen einer neuen Tabelle. Was ein VB6-Programm macht,
>wenn es einen Befehl 'New' erhält, ist dagegen seine Sache.
>
>Wenn Du schon bisher DDE von VB-App zu VB-App gemacht hast, dann verstehe
>ich Deine Frage nicht so ganz, denn dann solltest Du doch bereits eine
>funktionierende App haben, die ein DDE-Kommando empfangen und darauf
>reagieren kann? Von wem das DDE-Kommando kommt ist unerheblich.

In VB6 führt der Sender die folgenden Befehle aus:

txtDDE.LinkMode = 0
txtDDE.LinkTopic = "MyApplication|MyTopic"
txtDDE.LinkItem = "txtEmpfaengerDDE"
txtDDE.LinkMode = 2
txtDDE.LinkPoke

Dadurch weiß Windows, dass es den in txtDDE enthaltenenText an das
LinkItem "txtEmpfaengerDDE" in "MyApplication" senden soll.

In Word-VBA gibt es nur
Kanal=DDEInitiate(App:="MyApplication", Topic:="MyTopic")
DDEExecute Channel:=Kanal, Command:="Reagier endlich!"

Ich kann nirgendwo einen Befehl zum Spezifieren des LinkItems finden.
Woher soll Windows wissen, dass der Command an das LinkItem
txtEmpfaengerDDE gesendet werden soll? Windows schickt den Command
einfach an MyApplication, und die kann (verständlicherweise) nichts
damit anfangen.

Ratlos,
Wolfgang

Betreff Re: DDE-Kommunikation von Word VBA nach VB6
Von =?ISO-8859-1?Q?Wolfgang_Bu=DFmann?=
Datum 31.10.2009 17:27:33

Hallo Wolfgang,

ich kenne mich mit DDE eigentlich gar nicht aus, jedoch interessierte
mich dein Problem und ich habe mal etwas im Internet recherchiert.

Vielleicht helfen dir folgende Links:

http://support.microsoft.com/kb/75089/EN-US/

http://msdn.microsoft.com/en-us/library/aa223860%28office.11%29.aspx

Außerdem habe ich folgenden Code gefunden:
Sub RUNEXCELMACRO()

'RUN MACRO
aChan = DDEInitiate(App:="Excel", Topic:="System")
DDEExecute Channel:=aChan, Command:="[Run(" & Chr(34) & _
"Personal.xls!Macro1" & Chr(34) & ")]"

DDETerminate Channel:=aChan

'POKE
Chan = DDEInitiate(App:="Excel", Topic:="System")
DDEExecute Channel:=Chan, Command:="[OPEN(" & Chr(34) _
& "C:\Sales.xls" & Chr(34) & ")]"
DDETerminate Channel:=Chan
Chan = DDEInitiate(App:="Excel", Topic:="Sales.xls")
DDEPoke Channel:=Chan, Item:="R1C1", Data:="1996 Sales"
DDETerminate Channel:=Chan

'This example opens the Microsoft Excel workbook Book1.xls and retrieves
the contents of cell R1C1.
Chan = DDEInitiate(App:="Excel", Topic:="System")
DDEExecute Channel:=Chan, Command:="[OPEN(" & Chr(34) _
& "C:\My Documents\Book1.xls" & Chr(34) & ")]"
DDETerminate Channel:=Chan
Chan = DDEInitiate(App:="Excel", Topic:="C:\DATA\SBS.xls")
msg = DDERequest(Channel:=Chan, Item:="R2C1")
msg = msg & " " & DDERequest(Channel:=Chan, Item:="R2C2")
MsgBox msg
DDETerminateAll

'This example opens a channel to the System topic in Microsoft Excel and
then uses the Topics item to return a list of available topics. The
example inserts the topic list, which includes all open workbooks, after
the selection.
aChan = DDEInitiate(App:="Excel", Topic:="System")
TOPICLIST = DDERequest(Channel:=aChan, Item:="Topics")
Selection.InsertAfter TOPICLIST
DDETerminate Channel:=aChan

End Sub


Ich weiß zwar nicht genau was das alles bewirken soll, was mir jedoch
auffällt ist, dass öfter der Befehl DDEPoke in Verbindung mit einem
ITEM:= auftaucht. Vielleicht ist es das, was du suchst.

Gruß Wolfgang

Betreff Re: DDE-Kommunikation von Word VBA nach VB6
Von Wolfgang Backes
Datum 31.10.2009 19:19:41

Wolfgang Bußmann schrieb:

Hallo Wolfgang,

...

>Ich weiß zwar nicht genau was das alles bewirken soll, was mir jedoch
>auffällt ist, dass öfter der Befehl DDEPoke in Verbindung mit einem
>ITEM:= auftaucht. Vielleicht ist es das, was du suchst.

Genau, mit DDEPoke funktioniert es!

Vielen Dank, auch an die anderen Helfer!
Wolfgang

Betreff Re: DDE-Kommunikation von Word VBA nach VB6
Von "Horst Heinrich Dittgens"
Datum 31.10.2009 17:52:54

Hmm, ich habe nur VB6-to-VB6-App gearbeitet, aber geht vielleicht

Kanal=DDEInitiate(App:="MyApplication", Topic:="xxx")
DDEExecute Channel:=Kanal, Command:="Reagier endlich!"

mit xxx = Name der Empangstextbox (txtEmpfaengerDDE) oder deren
LinkTopic-Property?

Ansonsten würde ich mal in einer VBA-Gruppe nachfragen, da ist die Chance
größer, daß einer VBA- und VB6 gleichzeitig weiß.

Betreff Re: DDE-Kommunikation von Word VBA nach VB6
Von Wolfgang Backes
Datum 31.10.2009 19:20:59

"Horst Heinrich Dittgens" schrieb:

>Hmm, ich habe nur VB6-to-VB6-App gearbeitet, aber geht vielleicht
>
>Kanal=DDEInitiate(App:="MyApplication", Topic:="xxx")
>DDEExecute Channel:=Kanal, Command:="Reagier endlich!"
>
>mit xxx = Name der Empangstextbox (txtEmpfaengerDDE) oder deren
>LinkTopic-Property?

Leider Fehlanzeige. Aber das Problem ist gelöst, siehe meine Antwort
auf Wolfgang Bußmann.

Gruß
Wolfgang

Keine Kommentare:

Kommentar veröffentlichen