VBA-Spezialthema "OLE Document Properties Object Library (dsofile.dll)"
Allgemeines über die "OLE Document Properties Object Library"
Ü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
Lesen und Schreiben von Document Properties
Behandlung von Laufzeitfehlern (Error Handling)
Allgemeines über Laufzeitfehler der Objektbibliothek
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'
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.
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 |
|
| 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}
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.
Hier geht's zur Download-Seite
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.

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').
Methoden und Eigenschaften der verschiedenen Objekte
Nachfolgend werden sämtliche Objekte mit den Methoden und Eigenschaften vorgestellt.
PropertyReader: Methoden / Eigenschaften
DocumentProperties: Methoden / Eigenschaften
CustomProperties: Methoden / Eigenschaften
CustomProperty: Methoden / Eigenschaften
| Methoden | Beschreibung |
| GetDocumentProperties | Gibt ein DocumentProperties-Objekt zurück, das die Dokument-Eigenschaften der Datei enthält. |
| Eigenschaft | Beschreibung |
| UseUnicodePropSets | ANSI statt Unicode |
| Methoden | Beschreibung |
| (Keine) | - |
| 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 |
| Methoden | Beschreibung |
| Add | Fügt eine neue benutzerdefinierte Dokument-Eigenschaft hinzu |
| Eigenschaft | Beschreibung |
| Count | Anzahl benutzerdefinierte Dokument-Eigenschaften |
| Item | - |
| Methoden | Beschreibung |
| Remove | Entfernt eine benutzerdefinierte Dokument-Eigenschaft |
| Eigenschaft | Beschreibung |
| Name | Name der benutzerdefinierten Dokument-Eigenschaft |
| Type | Type der benutzerdefinierten Dokument-Eigenschaft |
| Value | Wert der benutzerdefinierten Dokument-Eigenschaft |
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 |
|
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.
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.
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). |
| - | 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. |
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.

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.
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
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
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
![]()
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
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
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
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.
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
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":

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.
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.
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.
Verwenden der Eigenschaft 'DigitalSignature'
Der Zugriff auf die Eigenschaft DigitalSignature führt generell zum Laufzeitfehler 70 "Zugriff verweigert":

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.
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.
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,

Abbildung: Laufzeitfehler 429 "Objekterstellung durch
ActiveX-Komponente nicht möglich"
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
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.

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