| 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"
>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
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"
>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