1         
  DDE
För att kommunicera mellan program i Windows kan man använda 
  sig av DDE – Dynamic Data Exchange. Det finns fyra typer av DDE:
   
    |  |  | 
   
    |  | Ger DDE kommandon åt ett annat program | 
   
    |  | Tittar efter data i ett annat program | 
   
    |  | ”Trycker in data” i ett annat program | 
Vi kommer här att se mer på Request och Execute (Peek och 
  Poke tycker jag är ”oartiga”)
1.1        
  Gemensamt för alla DDE metoder
För att kunna använda DDE krävs samarbete av två program. 
  Ett program fungerar som klient och det andra som server. Eftersom man kan ha 
  flera DDE konversationer igång samtidigt kan ett program vara såväl klient som 
  server samtidigt. För en given DDE konversation gäller dock att programmet är 
  antingen eller. För att få igång en konversation krävs att klienten vet följande 
  om servern:
Application är det namn som programmet registrerat för DDE. 
  Detta måste inte vara detsamma som programnamnet. För enkelhets skull brukar 
  det dock vara samma som programnamnet.
Topic är ”ämnet” som dataöverföringen skall hantera. Ej alltid 
  helt dokumenterade.
Item är en specifik datamängd, t.ex. en cell i Excel
1.2        
  DDE med VB 5.0 som klient
                        Komponent                  Namn               
  Egenskaper
            1.         TextBox                        Text1                
  MultiLine: True
            2.         CommandButton            Command1        
  Caption: Prova
Dessutom måste du ha igång Excel och ha värden i A1 
  t.o.m. A3 i arket Sheet1
1.2.1       
  DDE Request
Den vanligaste formen av DDE är utbyte av data. Det finns 
  tre former av Request. Nedan kommer namnan samt de begrepp som används i VB 
  5.0 (6.0 har jag inte tillgång till):
                        Verkligt namn                i VB
            1.         Cold                              Manual
            2.         Warm                           Notify                
            3.         Hot                               Automatic
 
1.2.1.1     Cold DDE Request (manual)
En cold Request går ut på att man tar kontakt, frågar efter 
  data och efter att ha fått datat (eller blivit vägrad) så avbryts förbindelsen. 
  Skriv in följande kod för knappen:
 
  Private Sub Command1_Click()
      Text1.LinkTopic = "Excel|Sheet1"
      Text1.LinkItem = "R1C1"
      Text1.LinkMode = vbLinkManual
      Text1.LinkRequest
  End Sub
 
 
Förklaringar:
Text1.LinkTopic = "Excel|Sheet1"
Ser till att textboxen skapar en DDE kanal mot:
            Application:       Excel
            Topic:               Sheet1
Text1.LinkItem = "R1C1"
Ser till att man sätter:
            Item:                 R1C1
                        Text1.LinkMode = vbLinkManual
            Säger att man skall ha en manuell länk (cold). Obervera att man inte 
  kan sätta denna egenskap före man har satt Applicatioin, Topic och Item
Text1.LinkRequest 
Gör att själva förfrågningen görs.
1.2.1.2     Warm DDE Request (notify)
 
  Private Sub Command1_Click()
      Text1.LinkTopic = "Excel|Sheet1"
      Text1.LinkItem = "R1C1"
      Text1.LinkMode = vbLinkNotify
      ' Raden Text1.LinkRequest tas bort
  End Sub
 
Skapa sedan följande händelseprocedur (välj Text1 och LinkNotify 
  i Listorna i VB:s editor)
 
  Private Sub Text1_LinkNotify()
      Text1.LinkRequest
  End Sub
 
När vi nu klickar på knappen kommer Text1 att få några inställningar. 
  Det kommer dock inte att komma något värde i textboxen. Om vi hoppar till Excel 
  och skriver om värdet i A1 (R1C1) så kommer vårt program att meddelas om detta. 
  Då körs Text1_LinkNotify  proceduren. 
  I denna säger vi att vi vill ha datat som Excel vill ge. (Vi kan även låta bli 
  om vi vill)
 
1.2.1.3     Hot DDE Request (automatic)
 
  Private Sub Command1_Click()
      Text1.LinkTopic = "Excel|Sheet1"
      Text1.LinkItem = "R1C1"
      Text1.LinkMode = vbLinkAutomatic
  End Sub
 
Efter detta kommer textboxen att automatiskt uppdateras vid 
  behov och Text1_LinkNotify kommer inte att användas 
  (kan tas bort om man vill)
1.2.2       
  DDE med VBA  (T.ex. Excel makro) som klient 
I övriga VB versioner som t.ex. Excels VBA använd en annan 
  konstruktion för Request, oftast endast cold DDE:
 
  Sub TestRequest()
        Dim channel
        Dim retArray
              channel = DDEInitiate("application", 
    "Topic")
              ' kan ge en array tillbaka
              retArray = DDERequest(channel, "Item")
              ' loopa igenom denna array
              For I = 1 To UBound(retArray)
                    MsgBox retArray(I)
              Next
              ' glöm inte att stänga DDE kanalen
              DDETerminate (channel)
        End Sub
 
Enklaste sättet att testa DDE är med Excel cellformler. Dessa 
  skrivs i formen:
=Application|Topic!Item
Vi får då en Hot DDE REquest (automatisk). Vill du 
  ha den manuell så kan man använda:
            Edit, Links... Välj länken i dialogen 
  och ändra Update: till Manual
1.3        
  DDE med VB som Server
För att få en form i VB att fungera som DDE server så måste 
  den ha satt Application, Topic och Item. Dessa är
1.Application                    Namnet på projektet 
  (inte exe filens namn utan det som syns i Project explorern. )
2.Topic                            Ställs in i formens LinkTopic property. 
Ändra samtidigt LinkMode till 1- Source
3.Item                              Namnet på en TextBox, Label 
  eller PictureBox
Detta kan testas genom att ställa in LinkTopic till 
  Form1 och LinkMode till Source för formen. 
Starta ditt VB program och klicka på dess CommandButton
Hoppa sedan till Excel och skriv in följande formel i en cell, 
  men inte i A1:
=Project1|Form1!Text1
Skriv in någonting i cell A1. Detta kommer att föras över 
  med DDE till vårt VB projekt. Sedan kommer vår Excel formel att hämta detta 
  värde till cellen där den fanns. (En hemsk omväg för datat med det är ju bara 
  en demonstration)
 
1.4        
  Nedan kommer en förteckning över DDE topic och item  i några vanliga 
  program:
   
    | Microsoft Access | 
   
    | Application | Topic | Item | Förklaring | 
   
    | MSAccess | System | SysItems | Lista över items som finns i System topic | 
   
    |  |  | Formats | Klippbords format  | 
   
    |  |  | Status | ”Busy” eller ”Ready” | 
   
    |  |  | Topics | Alla öppna databaser | 
   
    |  | Databas (Namnet 
        på en databas.  T.ex. northwind om filen heter Northwind.mdb) | TableList  | Lista över tabeller i databasen | 
   
    |  | QueryList | Alla Query i databasen | 
   
    |  | FormList | Alla formar | 
   
    |  | ReportList | Rapporter | 
   
    |  |  | MacroList | Makron | 
   
    |  |  | ModuleList | Moduler | 
   
    |  | databas; TABLE tabellnamn databas; QUERY query databas; SQL SELECT 
        * FROM... T.ex.  mindb; TABLE minTabell | All | Allt data i tabellen inklusive fälltnamn | 
   
    |  | Data | Posterna, men inte fältnamn | 
   
    |  | NextRow | NästaPost.  | 
   
    |  | PrevRow | Föregående rad | 
   
    |  | FirstRow | Första raden | 
   
    |  | LastRow | Sista raden | 
   
    |  | FieldCount | Antal poster | 
   
    | För mer info om MS Access som DDE Server se Q89586 i 
        MSKB  eller sök i Access hjälp efter DDE och sedan Using Microsoft 
        Access As a DDE Server | 
   
    | För DDE Execute kan man använda följande: | 
   
    | MSAccess | System | [OpenDatabase databas.mdb] [OpenForm Formnamn] [Makronamn parametrar] | 
   
    | Microsoft Word | 
   
    | Application | Topic | Item | Förklaring | 
   
    | Winword | System | SysItems | System Items | 
   
    |  |  | Formats | Format som Word kan sätta till klippbordet | 
   
    |  |  | Topics | Alla alternativa topics som finns tillgängliga | 
   
    |  | document (Namnet 
        på ett dokument.  T.ex. sales.doc) | Bokmärke  | Ett bokmärke i texten (markera en text och välj  Insert, Bookmark... Skriv in ett namn i dialogen) | 
   
    | För mer info om MS Word som DDE Server se Q93657  i MSKB  | 
   
    | För DDE Execute kan man använda följande: | 
   
    | Winword | System | [FileOpen  ....] (Se Q93657 för mer info) | 
   
    | Microsoft Excel | 
   
    | Application | Topic | Item | Förklaring | 
   
    | Excel | System | SysItems | System Items | 
   
    |  |  | Formats | Format som kan sättas till klippbordet | 
   
    |  |  | Selection |  | 
   
    |  |  | Topics | Alla alternativa topics som finns tillgängliga | 
   
    |  | ark (Namnet 
        på ett ark.  T.ex. Sheet1) | RnCn T.ex  R1C1  för A1 | Rad nummer och kolumnnummer i formen R1C2 där 1:an är rad och 2:an är kolumn | 
   
    |  | 
   
    | För DDE Execute kan man använda följande: | 
   
    | Excel | System | ?? | 
Man kan göra en hel del med DDE (om man vill) 
  Prova t.ex.  följande i VB :
 
  Private Sub Command1_Click()
      ' Se till att ha igång Access när du kör detta
      ' byt ut MinDatabas 
    till namnet på den databas du har igång
      ' byt ut ManTabell 
    till en tabell i din databas
      Text1.LinkTopic = "MSAccess|MinDatabas; TABLE MinTabell"
      Text1.LinkItem = "Data"
      Text1.LinkMode = vbLinkManual
      Text1.LinkRequest
  End Sub
 
Du kan även skriva in följande i Excel (för att förtydliga 
  har jag satt extra mellanslag i formeln):
=MSAccess | ' MinDatabas;   TABLE   MinTabell ' ! Data
Skriv in det i en tom cell i början av Excel arket.
Om du får ett värde i cellen så provar du följande:
1.       Markera upp cellen du skrev in formeln i och ett godtyckligt område 
  neråt och åt höger sida: