Office Logo VBA  Zurück zur Hauptseite

VBA-Spezialthema "OLE Document Properties Object Library (dsofile.dll)"

      Allgemeines über die "OLE Document Properties Object Library"

      Was sind Document Properties?

      Übersicht über die OLE Document Properties Object Library

         Beschaffung der Objektbibliothek-Datei DSOFile.dll

         Einbinden der Objektbibliothek im VBA-/VB-Projekt

      Methoden und Eigenschaften der verschiedenen Objekte

         PropertyReader

         DocumentProperties

         CustomProperties

         CustomProperty

      Lesen und Schreiben von Document Properties

      Behandlung von Laufzeitfehlern (Error Handling)

         Allgemeines über Laufzeitfehler der Objektbibliothek

         Übersicht der Laufzeitfehler

      Anwendungsfehler und Zugriffsverletzungen

      VBA-Codebeispiele und Musterlösungen

         Benötigte Objekte instanzieren (New/CreateObject)

         Allgemeine Standard-Document Properties ändern und speichern

         Custom Document Properties einer Datei auflisten

         Neues Custom Document Property hinzufügen

         Existierendes Custom Document Property löschen

         Fehlerbehandlungsroutine (Musterlösung)

      Spezialitäten und bekannte Probleme

         Automatische DLL-Registrierung während der Programmausführung

         Verwenden der Eigenschaft 'HasMacros'

         Verwenden der Eigenschaften 'Thumbnail' und 'Icon'

         Verwenden der Eigenschaft 'LocaleInfo'

         Verwenden der Eigenschaft 'DigitalSignature'

         Verwenden der Eigenschaft 'Version'

         Verwenden der Eigenschaft 'ProgId'

         Verwenden der Eigenschaft 'LastEditedBy'

         Verwenden der Eigenschaft 'PresentationFormat'

 

      Zur Hauptseite

To Top

Diese Seite ist teilweise in Bearbeitung!

Allgemeines über die "OLE Document Properties Object Library"

Microsoft Developer Support stellt für das Lesen und Schreiben von Dokument-Eigenschaften eine Objektbibliothek in Form einer ActiveX-DLL namens DSOFile.dll zur Verfügung, die man kostenlos benutzen und weitergeben darf. Die Bibliothek heisst "OLE Document Properties Object Library" und befindet sich in einer ActiveX-DLL namens DSOFile.dll.

Lesen Sie hier, welche Möglichkeiten diese Objektbibliothek bietet. Sie finden hier auch detaillierte Informationen über Spezialitäten, bekannte Probleme sowie verborgene Funktionalitäten. Die Bibliothek enthält nämlich Problemlösungsmöglichkeiten, die eigentlich in dieser Art und Weise gar nicht vorgesehen waren. Es werden ausserdem mehrere Codebeispiele und Musterlösungen vorgestellt. Die Codebeispiele können mit VBA und VB verwendet werden.

Anmerkung des Autors
Microsoft hat nie eine Dokumentation oder Anleitung zu dieser Objektbibliothek herausgegeben. Im Internet ist ebenfalls keine Beschreibung auffindbar. Die auf dieser Seite vorgestellten Informationen habe ich selber erforscht und zusammengetragen. Es scheint so, dass dies die einzige öffentlich zugängliche Dokumentation ist.

To Top

 


Was sind Document Properties?

Jede Datei, die das OLE Structured Storage-Dateiformat besitzt, ist in der Lage, sogenannte Document Properties (Dokument-Eigenschaften) und Custom Document Properties (Benutzerdefinierte Dokument-Eigenschaften) zu speichern.

Eine Dokumentdatei besitzt Standard-Document Properties, und kann auch benutzerdefinierte Document Properties enthalten. Standard-Document Properties sind unter anderem Autor, Titel, Kommentar, Firma, Erstellungsdatum, Zuletzt gespeichert von, Bearbeitungszeit, Anzahl Seiten, Anzahl Wörter und Anzahl Folien.

Verwandte Themen

Verwandte Themen

Excel-Dateiformat BIFF

To Top

 

 

Nr. Anwendung Dateityp Dateiendung Beschreibung
1 Microsoft Word Dokument doc Document
2 Microsoft Word Vorlage dot Document Template
3 Microsoft Word Wizard wiz Wizard
4 Microsoft Word - wzs -
5 Microsoft Word Sicherungskopie wbk Word Backup
6 Microsoft Word AutoWiederherstellen-
Dokument
asd AutoSave Document
7 Microsoft Excel Arbeitsmappe xls Excel Sheet
8 Microsoft Excel Vorlage xlt Excel Template
9 Microsoft Excel Add-In xla Excel Add-In
10 Microsoft Excel Sicherungsdatei xlk Excel Backup
11 Microsoft PowerPoint Dokument ppt PowerPoint Presentation
12 Microsoft PowerPoint Vorlage pot PowerPoint Template
13 Microsoft PowerPoint - pps PowerPoint Pack & Go Presentation
14 Microsoft PowerPoint Add-In ppa PowerPoint Add-In
15 Microsoft PowerPoint Wizard pwz PowerPoint Wizard
16 Microsoft PowerPoint Symbolleiste pcb PowerPoint Command Bars
17 Microsoft Access - mdz -
18 Microsoft Outlook Vorlage oft Outlook File Template
19 Microsoft Outlook Nachricht msg Outlook Message
20 Microsoft Sammelmappe - obt -
21 Microsoft Sammelmappe - obd -
22 Microsoft Sammelmappe - obz -
23 VBA-Editor (VBE) Werkzeugsammlung-
Seite
pag Page
24 VBA-Editor (VBE) Werkzeugsammlung box Toolbox
25 Crystal Decisions/Business Objects
Crystal Reports
Bericht rpt Report
26 Walldata Rumba - wdm -
27 Walldata Rumba - prf -
28 Walldata Rumba - mnc -
29 Microsoft Management Console Managementkonsole msc Microsoft Management Console
30 Windows Installer Installationsskript msi Microsoft Installer
31 Internet Marvel CallingCard - mcc Marvel CallingCard
32 ClipArt Gallery ClipArt-Galerie cag ClipArt Gallery

Microsoft Graph (*.gra)

Microsoft Office Suchlauf (*.oss)

Microsoft Project (*.mpp, *.mpt)

 

 

 


Übersicht über die OLE Document Properties Object Library

Die Bibliothek befindet sich in einer ActiveX-DLL, die den Dateinamen "DSOFile.dll" besitzt.

DS: OLE Document Properties 1.4 Object Library

 

OLE File Property Reader Class

ProgID:
DSOleFile.PropertyReader.1

CLSID:
{3955D421-C8F3-11d2-B7C8-A22B3D95F811}

{93769740-DE48-11D2-B7C8-A62255602516}

To Top

 


Beschaffung der Objektbibliothek-Datei DSOFile.dll

Die Objektbibliothek wird von Microsoft Corporation in Form einer ActiveX-DLL zur Verfügung gestellt. Der Name dieser DLL-Datei ist DSOFile.dll. Sie können diese Datei auf der Download-Seite herunterladen.

Gehe zur Download-Seite  Hier geht's zur Download-Seite

To Top

 


Einbinden der Objektbibliothek im VBA-/VB-Projekt

Wie bei Objektbibliotheken üblich wird im Verweise-Dialogfenster des VBA-Editors ein Verweis auf die entsprechende Datei, in unserem Fall die Datei DSOFile.dll, erstellt.

VBA-Editor: Verweis auf Objektbibliothek erstellen
Abbildung: Verweise-Dialogfenster des VBA-Editors

Nachdem der Verweis angelegt ist, stehen alle Objekte, Methoden, Eigenschaften usw. dieser Bibliothek bereits zur Entwicklungszeit zur Verfügung. Sie können dadurch in Ihren Automations-Programmcode bereits die entsprechenden Objekte mit ihren korrekten Datentypen deklarieren (sogenanntes 'Early Binding').

To Top

 


Methoden und Eigenschaften der verschiedenen Objekte

Nachfolgend werden sämtliche Objekte mit den Methoden und Eigenschaften vorgestellt.

PropertyReaderMethoden / Eigenschaften

DocumentPropertiesMethoden / Eigenschaften

CustomPropertiesMethoden / Eigenschaften

CustomPropertyMethoden / Eigenschaften

 


PropertyReader

Methoden

Methoden Beschreibung
GetDocumentProperties Gibt ein DocumentProperties-Objekt zurück, das die Dokument-Eigenschaften der Datei enthält.

 

Eigenschaften

Eigenschaft Beschreibung
UseUnicodePropSets ANSI statt Unicode

To Top


DocumentProperties

Methoden

Methoden Beschreibung
(Keine) -

 

Eigenschaften

Eigenschaft Beschreibung
AppName Name der zugeordneten Anwendung
Author Name des Autors
ByteCount Anzahl Bytes
Category Kategorie
CharacterCount Anzahl Zeichen
CharacterCountWithSpaces Anzahl Zeichen (ohne Leerzeichen)
CLSID CLSID
Comments Kommentare
Company Firma
CustomProperties -
DateCreated Erstelt am
DateLastPrinted Zuletzt gedruckt am
DateLastSaved Zuletzt gespeichert am
HasMacros Makros enthalten
HiddenSlides -
Icon Datei-Symbol (Objektreferenz)
IsReadOnly Schreibschutz
Keywords Stichwörter
LastEditedBy Letzter Bearbeiter
LineCount Anzahl Zeilen
LocaleInfo -
Location Ort (Pfad)
Manager Manager
MultimediaClips -
Name Dateiname
PageCount Anzahl Seiten
ParagraphCount Anzahl Absätze
PresentationFormat -
PresentationNotes -
ProgID ProgID
RevisionNumber -
SlideCount Anzahl Folien
Subject Thema
Template Dateiname der Vorlage
Thumbnail Vorschaugrafik (Objektreferenz)
Title Titel
TotalEditTime Bearbeitungszeit
Version Formatversion
WordCount Anzahl Wörter

To Top


CustomProperties

Methoden

Methoden Beschreibung
Add Fügt eine neue benutzerdefinierte Dokument-Eigenschaft hinzu

 

Eigenschaften

Eigenschaft Beschreibung
Count Anzahl benutzerdefinierte Dokument-Eigenschaften
Item -

To Top


CustomProperty

Methoden

Methoden Beschreibung
Remove Entfernt eine benutzerdefinierte Dokument-Eigenschaft

 

Eigenschaften

Eigenschaft Beschreibung
Name Name der benutzerdefinierten Dokument-Eigenschaft
Type Type der benutzerdefinierten Dokument-Eigenschaft
Value Wert der benutzerdefinierten Dokument-Eigenschaft

To Top

 


Lesen und Schreiben von Document Properties

Die Funktionen der OLE Document Properties Object Library verwenden eine Technik für den Zugriff auf die Dokument-Eigenschaften einer Datei, welche zwar nicht unbekannt, aber doch eher unüblich ist. Speziell ist vor allem, dass die Dokument-Datei nicht im eigentlichen Sinne geöffnet wird, sondern direkt auf den so genannten SummaryInformation- bzw. DocumentSummaryInformation-Stream in der Datei zugegriffen wird. Der SummaryInformation-Stream enthält unter anderem die Vorschaugrafik des Dokumentes; der DocumentSummaryInformation-Stream unter anderem die benutzerdefinierten Eigenschaften (Custom Properties).

Mehr über diese Streams erfahren Sie auf dieser Seite:

Verwandte Themen

Verwandte Themen

Excel-Dateiformat BIFF

 

In Bezug auf das Lesen und Schreiben von Dokument-Eigenschaften sollten Sie sich unbedingt folgende Punkte merken:

Beim ersten Zugriff auf die Document Properties der Datei (wird mit der GetDocumentProperties-Methode durchgeführt) wird die Datei exklusiv gesperrt, und zwar sowohl für Lese- als auch für Schreibzugriffe. Das bedeutet, dass beim Aufruf der GetDocumentProperties-Methode die Datei von keiner anderen Anwendung und keinem Benutzer geöffnet sein darf.

Die Datei bleibt so lange gesperrt, bis sämtliche Objektvariablen, welche eine Referenz auf das verwendete DocumentProperties-Objekt enthalten, auf Nothing gesetzt werden oder ihren Gültigkeitsbereich verlassen. Es existiert keine Methode zum Schliessen der Dokumentdatei (d.h. etwas in der Art wie Close).

Die Änderung eines Document Properties erfolgt unmittelbar bei Zuweisung des neuen Inhaltes. Das heisst, dass geänderte Properties nicht explizit mit einer speziellen Methode in die Datei geschrieben werden müssen. Es existiert dazu keine Methode wie Save oder Update, die man oft in anderen Objektbibliotheken findet.

Sie können GetDocumentProperties mehrmals nacheinander verwenden, solange nicht die gleiche Dokumentdatei angegeben wird wie beim vorangegangenen Aufruf. Wenn Sie GetDocumentProperties zweimal nacheinander mit der gleichen Datei aufrufen, erscheint der Laufzeitfehler "Datei ist bereits geöffnet". Wenn Sie die aktuell mit GetDocumentProperties geöffnete Datei neu öffnen möchten, müssen zuerst alle auf die Dokumentdatei referenzierenden Objektvariablen auf Nothing gesetzt werden.

To Top

 


Behandlung von Laufzeitfehlern (Error Handling)

Allgemeines über Laufzeitfehler der Objektbibliothek

In diesem Kapitel werden die Laufzeitfehler vorgestellt, die bei der Ausführung eines VBA-/VB-Programmes im Zusammenhang mit den Objekten, Methoden und Eigenschaften der DSOFile-Objektbibliothek auftreten können.

Da die Objektbibliothek in einer ActiveX-DLL abgelegt ist, müssen auf jeden Fall alle potenziellen COM-/Automation-Fehler abgefangen und behoben werden. Es handelt sich insbesondere um diese Fehler:
- Objekt kann nicht instanziert werden (z.B. wenn die ActiveX-DLL nicht registriert ist)
- DCOM ist nicht installiert (kann eigentlich nur bei Windows 95 und Windows NT 4.0 vorkommen)
- ActiveX-DLL ist nicht korrekt registriert (z.B. wenn der in der Registry eingetragene Pfad zur DLL falsch ist)

Den Programmcode für eine gute Fehlerbehandlungsroutine in einem VBA-/VB-Projekt finden Sie unter Fehlerbehandlungsroutine (Musterlösung).

Bitte beachten Sie, dass auch Anwendungs-/Ausnahmefehler auftreten können, die nicht abgefangen werden können. Lesen Sie mehr dazu in Kapitel Anwendungsfehler und Zugriffsverletzungen.

To Top


Übersicht der Laufzeitfehler

Die folgende Tabelle zeigt eine Liste der Fehler, die unbedingt in einer Fehlerbehandlungsroutine abgefangen und behandelt werden müssen. Bitte beachten Sie, dass bestimmte Fehler mehr als einen Fehlercode besitzen.

Fehler (Hex) Fehler (Dec) Fehlermeldung Beschreibung
- 424 Object required.
Objekt erforderlich.
Das Objekt ist nicht vorhanden.

Die Thumbnail-Eigenschaft wurde einer Objektvariable zugewiesen bei einem Dokument, das kein Vorschaubild enthält (Eigenschaftswert Empty).
oder
Die Icon-Eigenschaft wurde einer Objektvariable zugewiesen bei einem Dokument, das kein Symbol enthält (Eigenschaftswert Empty).

- 429 ActiveX component can't create object.
Objekterstellung durch ActiveX-Komponente nicht möglich.
Die Objekterstellung ist fehlgeschlagen.

Meistens ist die Komponente (d.h. die Dokument-Klasse) nicht oder nur unvollständig registriert. Dieser Fehler tritt oft erst beim Zugriff auf bestimmte Dokument-Eigenschaften auf, wie unter anderem auf die Eigenschaft ProgId.

- 432 File name or class name not found during Automation operation.
Daten- oder Klassenname während Automatisierungsoperation nicht gefunden.
Die Datei wurde nicht gefunden, d.h. dass die bei GetDocumentProperties angegebene Datei nicht existiert.

In diesem Fall ist zu kontrollieren, ob der angegebene Pfad- und Dateiname korrekt ist.

- 450 Falsche Anzahl an Argumenten oder ungültige Eigenschaftszuweisung. Wahrscheinlich wurde versucht, eine schreibgeschützte Dokumenteigenschaft zu verändern.

Überprüfen Sie, ob die angegebene Eigenschaft nicht schreibgeschützt ist.

&H80040201 -2147220991 - DCOM ist auf dem Computer nicht installiert.

Dieser Fehler kann eigentlich nur bei älteren Windows-Versionen wie Windows 95 oder Windows NT 4.0 auftreten. Bei allen anderen (d.h. neueren) Versionen ist DCOM standardmässig installiert.

&H80040202 -2147220990
oder
2
The file you have selected has no document properties. Die Datei enthält keine Document Properties bzw. die Datei besitzt nicht das OLE Structured Storage-Format. Es kann auch sein, dass der Benutzer für die Datei keine Lese-Berechtigung besitzt.
&H80040203 -2147220989
oder
3
The file is currently open and cannot be read. Die Datei ist bereits geöffnet.

Auf Document Properties kann nur zugegriffen werden, wenn die Datei nicht in Bearbeitung ist, d.h. von keinem Benutzer oder Prozess geöffnet ist. Dieser Fehler wird behoben, indem die angegebene Datei zuerst geschlossen wird.

&H80040204 -2147220988
oder
4
This property can only be called on Word or Excel documents. Die HasMacros-Eigenschaft wurde bei einem Dokument aufgerufen, das weder ein Microsoft Word- noch ein Microsoft Excel-Dokument ist
&H80040205 -2147220987 The property "<Name>" already exists in the collection. Das Custom Document Property existiert bereits (erscheint beim Hinzufügen).
- 5 The property "<Name>" does not exists in the collection. Das Custom Document Property existiert nicht (erscheint beim Entfernen).
&H8007007E -2147024770 - Die Komponente ist registriert, aber der in der Registry eingetragene Pfad wahrscheinlich falsch.

Bitte beachten Sie, dass dieser Fehlercode auch von anderen Bibliotheken, also nicht ausschliesslich von der DSOFile.dll, benutzt wird. Es ist daher möglich, dass eine Fehlermeldung mit diesem Fehlercode erscheint, obwohl gar keine Funktion der DSOFile.dll aufgerufen wurde.

To Top

 


Anwendungsfehler und Zugriffsverletzungen

Es kann mehr oder weniger selten vorkommen, dass beim Ansprechen der Document Properties einer Datei ein schwerer Anwendungsfehler auftritt. Unter Windows NT sowie den neueren Windows-Versionen wie Windows XP und Windows 2003 erscheint gewöhnlich der Dr. Watson wegen eines Ausnahmefehlers/einer Zugriffsverletzung.

Dr. Watson
Abbildung: Dr. Watson mit Anwendungsfehler

 

Situation 1

Ein solcher Anwendungsfehler tritt beim Aufrufen der GetDocumentProperties-Methode auf und führt zum sofortigen Absturz des Office-Programmes, in welchem der VBA-Code ausgeführt wird (z.B. Microsoft Excel). Es muss kaum erwähnt werden, dass dadurch sämtliche nicht gespeicherten Daten verloren gehen.

Hier ein Codebeispiel zur Verdeutlichung, wo der Fehler auftritt:

Sub GetDocumentProperties()
  Dim objDSOReader As Object
  Dim objDSODocument As Object

  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties(strFile)   '<- Hier tritt der Anwendungsfehler auf

  'Weiterer Programmcode...
End Sub

Die Variable strFile enthält den vollständigen Dateinamen inklusive Pfad der Datei. In einem konkreten Fall, der sich beliebig oft reproduzieren liess, wurde auf eine Textdatei zugegriffen, was zum sofortigen Absturz der Anwendung führte. Der Zugriff auf eine Textdatei stellt normalerweise kein Problem dar, weil eigentlich die Fehlermeldung "The file you have selected has no document properties" erscheint.

 

Situation 2

Eine andere Situation, die zu einem Anwendungsfehler mit Absturz führt, ist der Zugriff auf eine benutzerdefinierte Dokumenteigenschaft. Der folgende Code funktioniert problemlos, wenn das Property "Ablage" existiert und somit gelöscht werden kann.

Sub RemoveCustomDocumentProperty()
  CreateObject("DSOleFile.PropertyReader").GetDocumentProperties("C:\Daten\EineMappe.xls"). _
     CustomProperties("Ablage").Remove
End Sub

Wenn man den Code ein zweites Mal ausführt, erscheint der Laufzeitfehler 5 mit der Meldung, dass "Ablage" nicht existiert. Bei der dritten Ausführung stürzt die gesamte Anwendung ab.

Wenn man bei der zweiten Ausführung den Fehlermeldungstext im Direktfenster des VBA-Editors abfragt, erhält man ein unlesbares Resultat.

?Err.Description
? À ? ????    ? ? s t

 

Hinweis
Da der hier beschriebene Anwendungs-/Ausnahmefehler zwar verhältnissmässig selten auftritt, aber eben auftreten kann, ist es zu empfehlen, vor jeder Codeausführung das VBA-Projekt zu speichern.

To Top

 


VBA-Codebeispiele und Musterlösungen

Benötigte Objekte instanzieren (New/CreateObject)

Instanzierung mit Early Binding

Dim objDSOReader As DSOleFile.PropertyReader
Dim objDSODocument As DSOleFile.DocumentProperties

Set objDSOReader = New DSOleFile.PropertyReader
- oder -
Set objDSOReader = CreateObject("DSOleFile.PropertyReader")

Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")

MsgBox objDSODocument.Author

Set objDSODocument = Nothing
Set objDSOReader = Nothing

 

Instanzierung mit Late Binding

Dim objDSOReader As Object
Dim objDSODocument As Object

Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")

MsgBox objDSODocument.Author

Set objDSODocument = Nothing
Set objDSOReader = Nothing

To Top


Allgemeine Standard-Document Properties ändern und speichern

Nicht alle Standard-Document Properties einer Datei können geändert werden. So ein Property ist beispielsweise "Gedruckt" (DateLastPrinted), da es vom System aktualisiert wird und daher nur gelesen werden kann. Zudem gibt es Standard-Document Properties, die nicht bei alle Dokument-Dateitypen verwendet werden können. Zum Beispiel kann das Property "Ausgeblendete Folien" (HiddenSlides) bei einem Excel-Dokument (Dateinamenerweiterung xls, xlt und xla) ohne weiteres gelesen werden. Allerdings macht das keinen Sinn, da ein Excel-Dokument garantiert keine ausgeblendeten Folien enthält und folgedessen das Document Property immer den Wert 0 enthält. Dieses Property wird nur bei PowerPoint-Dokumenten (Dateinamenerweiterung ppt, pot, pps und ppa) benutzt.

Sub SaveProperties()
  Set objDSOReader = New DSOleFile.PropertyReader
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")

  objDSODocument.Author = txtAuthor.Text
  objDSODocument.Title = txtTitle.Text
  objDSODocument.Subject = txtSubject.Text
  objDSODocument.Comments = txtComments.Text
  objDSODocument.Keywords = txtKeywords.Text
  objDSODocument.Category = txtCategory.Text
  objDSODocument.Manager = txtManager.Text
  objDSODocument.Company = txtCompany.Text

  Set objDSODocument = Nothing
  Set objDSOReader = Nothing

End Sub

To Top


Custom Document Properties einer Datei auflisten

Benutzerdefinierte Dokument-Eigenschaften in eine ListBox (lstCustProps) füllen.

Sub ListCustomProperties()
  Dim objDSOReader As Object
  Dim objDSODocument As Object

  Dim objDSOCustProp As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")

  For Each objDSOCustProp In objDSODocument.CustomProperties
    lstCustProps.AddItem objDSOCustProp.Name & ": " & CStr(objDSOCustProp.Value) & " [" & CustTypeName(objDSOCustProp.Type) & "]"
  Next

  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

Function CustTypeName(ByVal lType As Long) As String
  Select Case lType
    Case 1
      CustTypeName = "String"   'Text
    Case 2
      CustTypeName = "Long"      'Ganzzahl
    Case 3
      CustTypeName = "Double"   'Dezimalzahl
    Case 4
      CustTypeName = "Boolean"  'Ja/Nein
    Case 5
      CustTypeName = "Date"      'Datum
    Case Else
      CustTypeName = "Unknown"  'Unbekannt
  End Select

End Function

To Top


Neues Custom Document Property hinzufügen

 

Sub AddCustomProperty()
  Dim strCustPropName As String
  Dim strValue As String
  Dim varCustPropValue As Variant
  Select Case intType
    Case 1
      varCustPropValue = strValue
    Case 2
      varCustPropValue = CLng(strValue)
    Case 3
      varCustPropValue = CDbl(strValue)
    Case 4
      varCustPropValue = CBool(strValue)
    Case 5
      varCustPropValue = CDate(strValue)
    Case Else
      varCustPropValue = strValue
  End Select

  objDSODocument.CustomProperties.Add strCustPropName, varCustPropValue
End Sub

To Top


Existierendes Custom Document Property löschen

 

Sub RemoveCustomProperty()
  Dim strCustPropName As String
  Dim objDSOCustProp As DSOleFile.CustomProperty
  Set objDSOCustProp = objDSODocument.CustomProperties.Item(strCustPropName)
  objDSOCustProp.Remove
  Set objDSOCustProp = Nothing

End Sub

To Top


Fehlerbehandlungsroutine (Musterlösung)

 

Set oFilePropReader = New DSOleFile.PropertyReader
Set oDocProp = oFilePropReader.GetDocumentProperties(strFileName)

 

'Trap common errors returned from component
Select Case Err.Number
  Case &H80040203
    'The file is open by another program
    MsgBox "Error: " & CStr(Err.Number) & vbCrLf & Err.Description & vbCrLf & vbCrLf & "Auf die Datei " & strFileName & " konnte nicht zugegriffen werden. Wahrscheinlich ist die Datei von einem anderen Programm geöffnet oder wird von einem anderen Benutzer bearbeitet.", vbExclamation
  Case &H80040202
    'The file selected is not an OLE structured storage file
    MsgBox "Error: " & CStr(Err.Number) & vbCrLf & Err.Description & vbCrLf & vbCrLf & "Die Datei " & strFileName & " besitzt nicht das erforderliche Structured Storage-Dateiformat. Es kann sein, dass die Datei defekt ist, ein älteres Format verwendet oder keine Dokumentdatei dieser Anwendung ist.", vbExclamation
  Case &H80040201
    'DCOM is not installed -- fall through to MsgBox below
  Case &H8007007E
    If MsgBox("Error: " & CStr(Err.Number) & vbCrLf & Err.Description & vbCrLf & vbCrLf & "Die Instanzierung eines Objektes der Klasse 'PropertyReader' ist fehlgeschlagen. Wahrscheinlich ist die ActiveX DLL-Datei DSOFile.dll registriert, aber der in der Registry eingetragene Dateipfad ungültig." & vbCrLf & vbCrLf & "Soll jetzt versucht werden, die benötigte Komponente neu zu registrieren?", vbExclamation + vbYesNo) = vbYes Then
      Err.Clear
      On Error GoTo -1   'Trick: Error Handling initialisieren
      On Error Resume Next
      Shell "regsvr32.exe /s " & Chr$(34) & App.Path & "\DSOFile.dll" & Chr$(34), vbHide
      If Err.Number <> 0 Then
        MsgBox "Beim Versuch, die DLL-Datei zu registrieren, ist ein Fehler aufgetreten.", vbExclamation
      Else
        MsgBox "Die DLL-Datei konnte erfolgreich registriert werden." & vbCrLf & vbCrLf & "Damit das Vorschau-Bild des Reports angezeigt werden kann, muss das Dialogfenster neu geöffnet werden.", vbInformation
      End If
    End If
  Case 429
    If MsgBox("Error: " & CStr(Err.Number) & vbCrLf & Err.Description & vbCrLf & vbCrLf & "Die Instanzierung eines Objektes der Klasse 'PropertyReader' ist fehlgeschlagen. Wahrscheinlich ist die ActiveX DLL-Datei DSOFile.dll nicht registriert." & vbCrLf & vbCrLf & "Soll jetzt versucht werden, die benötigte Komponente zu registrieren?", vbExclamation + vbYesNo) = vbYes Then
      Err.Clear
      On Error GoTo -1   'Trick: Error Handling initialisieren
      On Error Resume Next
      Shell "regsvr32.exe /s " & Chr$(34) & App.Path & "\DSOFile.dll" & Chr$(34), vbHide
      If Err.Number <> 0 Then
        MsgBox "Beim Versuch, die Komponente zu registrieren, ist ein Fehler aufgetreten." & vbCrLf & vbCrLf & "Bitte schliessen Sie das Eigenschaften-Fenster.", vbExclamation
      Else
        MsgBox "Die DLL-Datei konnte erfolgreich registriert werden." & vbCrLf & vbCrLf & "Damit die Datei-Eigenschaften angezeigt werden können, müssen Sie anschliessend das Eigenschaften-Fenster schliessen und neu öffnen.", vbInformation
      End If
    End If
  Case Else
    MsgBox "Error: " & CStr(Err.Number) & vbCrLf & Err.Description, vbExclamation, "Laufzeitfehler"
End Select

To Top

 


Spezialitäten und bekannte Probleme

Im Zusammenhang mit der DSOFile-Bibliothek gibt es ein paar Spezialitäten und potenzielle Probleme, die man als Programmierer kennen und berücksichtigen sollte. Diese werden nachfolgend vorgestellt.

To Top


Automatische DLL-Registrierung während der Programmausführung

Wenn Sie mit Late Binding auf die Objekte der DSOFile-Bibliothek zugreifen, können Sie die DLL auch während der Ausführung des VBA- bzw. VB-Programmes nachträglich registrieren, sollte sie noch nicht korrekt registriert sein. Der Vorteil ist, dass das Programm nicht abgebrochen werden muss. Zudem entfällt die manuelle Registrierung der Bibliothek durch den Benutzer, was die Benutzungsfreundlichkeit Ihres Programmes erheblich verbessert.

Die Registrierung erfolgt durch Aufrufen des Hilfsprogrammes "regsvr32.exe", das auf jedem Windows-Computer vorhanden ist.

Beachten Sie auch die Fehlerbehandlungsroutine. Anhand eines Tricks mit dem undokumentierten Befehls On Error GoTo -1 wird das Error Handling initialisiert, damit innerhalb des Error Handlers Laufzeitfehler abgefangen werden. Weil dadurch jedoch der Rücksprung mit Resume Next in den eigentlichen Programmcode nicht mehr funktioniert, muss eine Sprungmarke (sie heisst im Programmcode TryAgain) definiert werden, zu welcher dann zurückgekehrt werden kann.

Diese Beispiel zeigt, wie bei Auftreten eines Fehlers wegen nicht registrierter DSOFile.dll die Bibliothek automatisch registriert und anschliessend das Programm fortgesetzt wird:

Sub UseDSOFileLibrary()
  Dim objDSOReader As Object
  Dim objDSODocument As Object

  On Error Goto ErrorHandler

TryAgain:

  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")    'Hier tritt ein Laufzeitfehler auf
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")

  'Beliebiger Programmcode...

  Set objDSODocument = Nothing
  Set objDSOReader = Nothing

  Exit Sub

ErrorHandler:
  If Err.Number = 429 Or Err.Number = &H8007007E Then
    'Komponente ist nicht oder fehlerhaft registriert
    Err.Clear
    On Error GoTo -1    'Trick: Error Handling initialisieren
    On Error Resume Next
    Shell "regsvr32.exe /s " & Chr$(34) & "C:\Windows\DSOFile.dll" & Chr$(34), vbHide
    If Err.Number <> 0 Then
      MsgBox "Die Registrierung der Komponente DSOFile.dll ist fehlgeschlagen.", vbExclamation
    Else
      MsgBox "Die Komponente DSOFile.dll wurde erfolgreich registriert.", vbInformation

      GoTo TryAgain
    End If

  End If
End Sub

To Top


Verwenden der Eigenschaft 'HasMacros'

Bei der HasMacros-Eigenschaft muss beachtet werden, dass sie nur dann einen korrekten Wert liefert, wenn die Datei eine Microsoft Excel- oder eine Microsoft Word-Datei ist. Ob die Excel-Datei eine Arbeitsmappe (Dateinamenerweiterung xls), eine Vorlagemappe (xlt), ein Add-In (xla) oder eine Sicherungskopie (xlk) ist, ist in diesem Fall nicht relevant (bei Word-Dateien verhält es sich gleich). Wenn Sie HasMacros bei einem anderen Dokumentdateityp abfragen, beispielsweise bei einer PowerPoint-Präsentation, einem Microsoft Projekt-Projektplan oder einem Crystal Reports-Bericht, so erscheint der Laufzeitfehler -2147220988 (&H80040204) "This property can only be called on Word or Excel documents":

DSOFile-HasMacros-Error.gif (3037 Byte)
Abbildung: Fehler Nr. -2147220988 (80040204 hex)

Es ist somit unerlässlich, beim Abfragen von HasMacros das Auftreten des obigen Laufzeitfehlers anhand einer Fehlerbehandlung zu testen. Hier eine Musterlösung:

Sub CheckMacros()
  'Dim objDSOReader As DSOleFile.PropertyReader
  'Dim objDSODocument As DSOleFile.DocumentProperties

  Dim objDSOReader As Object
  Dim objDSODocument As Object

  'Set objDSOReader = New DSOleFile.PropertyReader
  'Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")

  On Error Resume Next
  strMacros = CStr(objDSODocument.HasMacros)
  If Err.Number = &H80040204 Then
    MsgBox "Die Makros-Existenz kann für diesen Dokumenttyp nicht abgefragt werden."
  Else
    If strMacros = "True" Then
      MsgBox "Das Dokument enthält Makros."
    Else
      MsgBox "Das Dokument enthält keine Makros."
    End If
  End If
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

Hinweis
HasMacros verwendet ein 'pessimistisches' Verfahren zum Ermitteln, ob ein Dokument Makros enthält. Überprüft wird nicht die tatsächliche Existenz eines Makros, sondern das blosse Vorhandensein des VBA-Projektes. Auch wenn das VBA-Projekt keinerlei Programmcode enthält, gibt HasMacros Wahr/True zurück, weil die Projektstruktur vorhanden ist und somit VBA-Code aufnehmen könnte. In Excel-Arbeitsmappen ist die Projektstruktur in einem Storage mit der Bezeichnung "_VBA_PROJECT_CUR" gespeichert (bei Excel 5.0/95-Mappen im Storage "_VBA_PROJECT"). HasMacros prüft somit lediglich, ob dieser Storage existiert.

Wenn also HasMacros die Existenz von Makros meldet, so bedeutet dies nicht zwingend, dass tatsächlich Makros in Form von ausführbarem VBA-Code vorhanden sind.

To Top


Verwenden der Eigenschaften 'Thumbnail' und 'Icon'

Die beiden Eigenschaften Thumbnail (enthält die Vorschaugrafik) und Icon (enthält das Dateisymbol) geben ein Objekt vom Typ StdPicture zurück. StdPicture ist ein Objekt von VBA/VB, das zum Erstellen einer Grafik benötigt wird.

Hier wird gezeigt, wie auf die Icon-Eigenschaft zugegriffen wird. Mit dem Programmcode wird das Icon einer Dokumentdatei abgefragt und in einem Anzeige- bzw. Picture-Steuerelement dargestellt.

VBA:
Erstellen Sie in einem neuen VBA-Projekt ein neues Benutzerformular und fügen diesem ein Anzeige-Steuerelement hinzu. Den Namen des Formulares "UserForm1" und auch den Namen des Anzeige-Steuerelementes "Image1" können Sie so belassen. Kopieren Sie die nachstehende Prozedur in das Codefenster des Formulares.

Visual Basic:
Erstellen Sie in einem neuen VB-Projekt eine neue Form und fügen dieser ein Picture-Steuerelement hinzu. Den Namen des Forms "Form1" können Sie so belassen. Ändern Sie aber den Namen des Picture-Steuerelementes von "Picture1" auf "Image1". Kopieren Sie die nachstehende Prozedur in das Codefenster des Forms und ändern den Prozedurkopf von "UserForm_Click" auf "Form_Click".

Private Sub UserForm_Click()
  Dim objDSOReader As Object
  Dim objDSODocument As Object

  Dim objPicture As StdPicture
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")

  If IsEmpty(objDSODocument.Icon) = True Then
    Image1.Visible = False
  Else
    Set objPicture = objDSODocument.Icon
    If objPicture Is Nothing Then
      Image1.Visible = False
    Else
      Set Image1.Picture = objPicture
      Image1.Visible = True

    End If
    Set objPicture = Nothing
  End If

  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

Hinweis
Der Zugriff auf die Vorschaugrafik (Thumbnail-Eigenschaft) erfolgt nach dem genau gleichen Prinzip. Man muss im obigen Code lediglich "Icon" durch "Thumbnail" ersetzen.

To Top


Verwenden der Eigenschaft 'LocaleInfo'

Das Objekt DocumentProperties besitzt eine Eigenschaft namens LocaleInfo, welche in der Objektbibliothek ausgeblendet ist. Dieses Property enthält gewöhnlich den Länder-/Gebietsschema-Code bzw. -Namen des Dokumentes. Wenn LocaleInfo jedoch ein einzelnes Fragezeichen enthält, dann bedeutet dies, dass das Dokument ein Dateikennwort bzw. Lese-/Schreibschutzkennwort besitzt. Davon betroffen sind allerdings ausschliesslich Microsoft Excel-Dokumente.

Sub CheckPassword()
  Dim objDSOReader As Object
  Dim objDSODocument As Object

  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
  If objDSODocument.LocaleInfo = "?" Then
    MsgBox "Das Dokument besitzt ein Kennwort."
  Else
    MsgBox "Das Dokument besitzt kein Kennwort."
  End If
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing

End Sub

Anmerkung des Autors
Normalerweise enthalten die Document-Eigenschaften auch bei Vorhandensein eines Dateikennwortes korrekte Werte. Bei LocaleInfo ist dies jedoch nicht der Fall. Ich nehme an, dass aus diesem Grund das hier beschriebene Property in der Objektbibliothek ausgeblendet ist.

Wichtiger Hinweis
LocaleInfo liefert ebenfalls ein einzelnes Fragezeichen, wenn der Arbeitsmappenschutz eingeschaltet ist (in Microsoft Excel zu Erreichen über Menü Extras/Schutz/Arbeitsmappe). In diesem Fall kann sich nicht feststellen, ob die Arbeitsmappe entweder ein Dateikennwort oder einen Arbeitsmappenschutz, oder sogar beides besitzt.

To Top


Verwenden der Eigenschaft 'DigitalSignature'

Der Zugriff auf die Eigenschaft DigitalSignature führt generell zum Laufzeitfehler 70 "Zugriff verweigert":

Laufzeitfehler 70
Abbildung: Laufzeitfehler 70 "Zugriff verweigert"

Sub GetDigitalSignature()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
  MsgBox objDSODocument.DigitalSignature    '<- Hier tritt der Laufzeitfehler auf
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

Anmerkung des Autors
Diese Eigenschaft ist in der Objekt-Bibliothek ausgeblendet und steht daher wahrscheinlich nicht offiziell zur Verfügung.

To Top


Verwenden der Eigenschaft 'Version'

Die Version-Eigenschaft enthält nicht etwa die Versionsnummer des Dokumentes, sondern die Dateiformatversion.

Bei einer Microsoft Excel-Arbeitsmappe, die mit Excel 97 oder Excel 2000 erstellt bzw. zuletzt gespeichert wurde, wird die Zeichenfolge "97/2000" zurückgegeben. Handelt es sich um eine Arbeitsmappe, die mit Excel 5.0 oder Excel 95 bearbeitet wurde, so liefert Veersion die Zeichenfolge "5.0/95". Bei Microsoft Word-Dokumenten verhält es sich identisch.

Sub GetVersion()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
  MsgBox objDSODocument.Version
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

Die Version-Eigenschaft enthält nur bei Excel- und Word-Dateien einen Wert. Sie können die Version zwar auch bei anderen Dokumentdateitypen abfragen, beispielsweise bei einer PowerPoint-Präsentation, einem Microsoft Projekt-Projektplan oder einem Crystal Reports-Bericht. Es wird aber kein Wert zurückgegeben. Ein Laufzeitfehler tritt allerdings auch nicht auf.

To Top


Verwenden der Eigenschaft 'ProgId'

Anhand der ProgId-Eigenschaft kann der so genannte programmatische Bezeichner (engl. Programatic Identifier) einer Dokumentdatei abgefragt werden. Bei einer Microsoft Excel-Arbeitsmappe ist dies "Excel.Sheet.8", wenn auf dem Rechner die Version Microsoft Excel 97 vorhanden ist. Bei einem Word-Dokument lautet die ID "Word.Document.10", wenn Microsoft Word 2002/XP verwendet wird.

Sub GetProgId()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\Bericht.rpt")
  MsgBox objDSODocument.ProgId    '<- Hier kann der Laufzeitfehler auftreten
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

Wenn man die ProgId einer Datei abfragt, welche zwar eine Dokument-Datei ist,

Fehler 429 "Objekterstellung durch ActiveX-Komponente nicht möglich"
Abbildung: Laufzeitfehler 429 "Objekterstellung durch ActiveX-Komponente nicht möglich"

To Top


Verwenden der Eigenschaft 'LastEditedBy'

Der Name des Benutzers, welcher das Dokument zuletzt bearbeitet bzw. gespeichert hat, ist in der LastEditedBy-Eigenschaft abgelegt. Immer wenn man das Dokument im Office-Programm speichert, wird der Name des Excel-Benutzers (eingetragen im Optionen-Dialog, Registerseite "Allgemein") dieser Eigenschaft zugewiesen.

Die LastEditedBy-Eigenschaft ist erstaunlicherweise die einzige Dokument-Eigenschaft in der Objekt-Bibliothek, die nicht schreibgeschützt ist (natürlich abgesehen von den Eigenschaften Author, Category, Comments, Company, Keywords, Manager, Subject und Title, die zwingend änderbar sein müssen). Man kann den Wert von LastEditedBy daher direkt mittels VBA-Code ändern.

Sub SetLastEditedBy()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
  MsgBox "Benutzername vorher: " & objDSODocument.LastEditedBy
  objDSODocument.LastEditedBy = "Peter Mustermann"

  MsgBox "Benutzername nachher: " & objDSODocument.LastEditedBy
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

Das Pendant zu LastEditedBy ist in Microsoft Excel das Element "Last Author" der BuiltinDocumentProperties-Auflistung. Auch dieses ist nicht schreibgeschützt und kann direkt geändert werden. Nur macht dies keinen Sinn, weil beim Schliessen/Speichern der Arbeitsmappe automatisch der Name des aktuellen Benutzers eingetragen wird.

Sub SetLastEditedBy()
  ActiveWorkbook.BuiltinDocumentProperties("Last Author").Value = "Peter Mustermann"

End Sub

To Top


Verwenden der Eigenschaft 'PresentationFormat'

Die Dokument-Eigenschaft PresentationFormat enthält - wie der Name schon sagt - das Format der Präsentation beziehungsweise des Präsentation-Dokumentes. Ein solches Format kann beispielsweise "Bildschirmpräsentation" oder "On-Screen Show" sein. Die Eigenschaft wird somit nur bei Microsoft PowerPoint-Dokumenten verwendet.

Erstaunlicherweise kann man die PresentationFormat-Eigenschaft auch bei Dokumentdateien beliebiger anderer Dokumenttypen verwenden, zum Beispiel bei Microsoft Excel-Arbeitsmappen (Dateinamenerweiterung xls), Microsoft Outlook-Nachrichten (msg) oder Business Objects Crystal Reports-Berichten (rpt). Man kann die Eigenschaft sowohl lesen als auch schreiben.

Diese Abbildung zeigt das Eigenschaften-Fenster der Datei BIFFText.xls. Der Inhalt der PresentationFormat-Eigenschaft befindet sich auf der Registerseite "Statistik". Beachten Sie, dass es sich hier um eine Microsoft Excel-Arbeitsmappendatei handelt.

Dokument-Eigenschaften: Präsentationsformat
Abbildung: Dokument-Eigenschaften mit Präsentationsformat

In der Spalte "Wert" wird der in der Eigenschaft abgelegte Text angezeigt. Bitte beachten Sie, dass bei einem sehr langen Text nur die ersten ca. 260 Zeichen zu sehen sind. Also auch dann, wenn man die Spalte auf Maximalbreite verbreitert.

Anhand der PresentationFormat-Eigenschaft lässt sich ein beliebig langer Text in einem Dokument ablegen, ohne dass ein Benutzer davon etwas merkt.

Die Eigenschaft kann nur gelesen werden. Beim Schreiben tritt der Laufzeitfehler 450 "Falsche Anzahl an Argumenten oder ungültige Eigenschaftszuweisung" auf.

 

Eigenschaftswert abfragen

Sub GetPresentationFormat()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
  MsgBox objDSODocument.PresentationFormat
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

 

Eigenschaftswert setzen

Sub SetPresentationFormat()
  Dim objDSOReader As Object
  Dim objDSODocument As Object
  Set objDSOReader = CreateObject("DSOleFile.PropertyReader")
  Set objDSODocument = objDSOReader.GetDocumentProperties("C:\Daten\EineMappe.xls")
  objDSODocument.PresentationFormat = "Dies ist eine versteckte Mitteilung!"
  Set objDSODocument = Nothing
  Set objDSOReader = Nothing
End Sub

To Top

Haben Sie Fragen, Anregungen oder Hinweise?
E-Mail senden an: philipp_von_wartburg@yahoo.de

Zuletzt aktualisiert am 10.02.2006 / 20:45 Uhr
Zuletzt kontrolliert am 01.01.2009 / 10:00 Uhr
© 2002-2009 by Philipp von Wartburg, Schweiz