none
OLE-Objekte aus einer Access 2003-Tabelle per VBA in Word öffnen und bearbeiten

    Frage

  • Hallo,

    ich habe in einer Access 2003-Tabelle eine Spalte vom Typ OLE-Objekt angelegt, in der ich Word-Dateien als Verknüpfung einbinde. Diese Dateien dienen als Fragmente, aus denen später ein Word-Dokument zusammengeführt werden soll. Dazu mächte ich per VBA einen Datensatz suchen, das darin verknüfte OLE-Objekt in Word öffnen und bearbeiten. Anschließend will ich dann noch den Inhalt kopieren, um ihn in mein Zieldokument zu pasten.

    Das Ganze funktioniert, wenn ich ein OLE-Objekt über ein BoundObjectFrame in einem Formular aktiviere. Ich möchte aber nach Möglichkeit ohne Formular auskommen und einfach nur das in der Tabelle gespeicherte/referenzierte OLE-Objekt öffnen.

    Hat hierzu jemand eine gute Idee? Es muss doch irgendwie möglich sein, auch ohne Formular an ein OLE-Objekt heran zu kommen, oder?! Ich würde dir Datei auch direkt öffnen, aber aus der Datenbank kriege ich auch den Pfad und Namen des verknüpften Dokuments nicht heraus.

    Ich bin dankbar für jeden heißen Tipp.

    Viele Grüße,


       Karsten
    Freitag, 5. August 2011 09:42

Antworten

  • Hallo Bogdan,

    danke für Deinen Tipp. Ich habe verknüpfe allerdings die OLE-Objekte ohnehin nur und speichere sie nicht in der Datenbank, damit die Datenbank nicht unnötig groß wird. Meine Idee war, den Pfad der Datei bei der Auswahl einfach gleich mit zu speichern, dann muss ich nicht lange an einem OLE-Objekt fummeln und kann den Pfad direkt in Word übergeben, um die Datei zu öffnen. Das scheint mir das aller einfachste zu sein.

    Muss mir aber Deinen Vorschlag nochmal genau ansehen, das ist sicher auch eine ganz charmante Lösung.

    Beste Grüße,

     

       Karsten

    Dienstag, 16. August 2011 12:31

Alle Antworten

  • Hallo Karsten,
    man kann die Datei aus der Datenbank lokal speichern und dann mit Word Object Model weiterbearbeiten. Die Word Datei, die eigentlich im OleObject Feld abgelagert ist, hat zusätzlich auch ein Ole Header, das man weg tun muss.
    Hier ist ein Beispiel:
    1.   Neue Access Datenbank erstellen
    2.   Neue Tabelle (Tabel1) erstellen
    Feld
    Typ
    ID
    AutoNumber
    WordDocument
    OleObject
     
    3.   Die Tabelle Tabel1 mit einer Word Datei belegen
    4.   Neues Modul erstellen
    5.   Der Code habe ich auf diese Seite - http://www.aleksoft.net - gefunden und angepasst:
     
    Option Compare Database
    Option Explicit
    
    Global Const OBJECT_HEADER_SIZE = 20
    
    Type PT
      Width As Integer
      Height As Integer
    End Type
    
    Type OBJECTHEADER
      Signature As Integer
      HeaderSize As Integer
      ObjectType As Long
      NameLen As Integer
      ClassLen As Integer
      NameOffset As Integer
      ClassOffset As Integer
      ObjectSize As PT
      OleInfo As String * 256
    End Type
    
    Type OLEHEADER
      OleVersion As Long
      Format As Long
      TypeLen As Long
    End Type
    
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
     
    Private Sub WriteWordFile(sOutput As String, f As Field)
      Dim Buffer() As Byte
      Dim BytesNeeded As Long
      Dim ObjHeader As OBJECTHEADER
      Dim sOleHeader() As Byte ' As String
      Dim OleHdr As OLEHEADER
    
      'Get the Microsoft Access OBJECT header:
      sOleHeader = f.GetChunk(0, OBJECT_HEADER_SIZE + 256) 'get some extra bytes for string data
      CopyMemory ObjHeader, sOleHeader(0), OBJECT_HEADER_SIZE
      'Get OLE Header
      Buffer = f.GetChunk(ObjHeader.HeaderSize, 12)
      CopyMemory OleHdr, Buffer(0), 12
      'Get file length
      Buffer = f.GetChunk(ObjHeader.HeaderSize + 20 + OleHdr.TypeLen, 12)
      CopyMemory BytesNeeded, Buffer(0), 4
      'Get the rest of the field and save it into a file
      Buffer = f.GetChunk(ObjHeader.HeaderSize + 24 + OleHdr.TypeLen, BytesNeeded)
      Open sOutput For Binary Access Write As #1
        Put #1, , Buffer
      Close #1
      
    End Sub
    
    Public Sub Test()
      Dim r As Recordset
      Dim f As Field
      
      Set r = CurrentDb.OpenRecordset("select WordDocument from Table1 where ID = 1")
      Set f = r.Fields("WordDocument")
      WriteWordFile "C:\test1.doc", f
      
    End Sub
    
    

    6.   Die Prozedur Test ausführen J
    Grüße,
    Bogdan
    Mittwoch, 10. August 2011 13:24
    Moderator
  • Hallo Bogdan,

    danke für Deinen Tipp. Ich habe verknüpfe allerdings die OLE-Objekte ohnehin nur und speichere sie nicht in der Datenbank, damit die Datenbank nicht unnötig groß wird. Meine Idee war, den Pfad der Datei bei der Auswahl einfach gleich mit zu speichern, dann muss ich nicht lange an einem OLE-Objekt fummeln und kann den Pfad direkt in Word übergeben, um die Datei zu öffnen. Das scheint mir das aller einfachste zu sein.

    Muss mir aber Deinen Vorschlag nochmal genau ansehen, das ist sicher auch eine ganz charmante Lösung.

    Beste Grüße,

     

       Karsten

    Dienstag, 16. August 2011 12:31
  • Hallo Karsten,

    ganz genau. Man speichert halt den Pfad mit und fasst du das Word Dokument durch Word Object Model an.

    Beste Grüße,

    Bogdan

    Mittwoch, 24. August 2011 07:17
    Moderator