VBA in Excel/ Dateieigenschaften
Über Dateieigenschaften
[Bearbeiten]Über VBA-Prozeduren können Dateieigenschaften gelesen und geschrieben werden. Voraussetzung hierfür ist, dass das jeweilige Dokument geöffnet ist.
Programmierbeispiele
[Bearbeiten]Dateieigenschaften lesen
[Bearbeiten]- Prozedur: ReadDocumentProperties
- Art: Sub
- Modul: Standardmodul
- Zweck: Dateieigenschaften in eine Tabelle einlesen
- Ablaufbeschreibung:
- Variablendeklaration
- Datenbereich leeren
- Fehlerroutine starten
- Rahmen um die BuiltInDocumentProperties bilden
- Schleife über alle Elemente bilden
- Den Namen der Eigenschaft eintragen
- Den Wert der Eigenschaft eintragen
- Den Typ der Eigenschaft eintragen
- Wenn ein Fehler aufgetreten ist...
- Den Fehlerwert eintragen
- Fehler-Objekt zurücksetzen
- Rahmen um die CustomDocumentProperties bilden
- Schleife über alle Elemente bilden
- Den Namen der Eigenschaft eintragen
- Den Wert der Eigenschaft eintragen
- Den Typ der Eigenschaft eintragen
- Wenn ein Fehler aufgetreten ist...
- Den Fehlerwert eintragen
- Fehler-Objekt zurücksetzen
- Code:
Sub ReadDocumentProperties()
Dim iRow As Integer
Range("A4:F35").ClearContents
On Error Resume Next
With ActiveWorkbook.BuiltinDocumentProperties
For iRow = 1 To .Count
Cells(iRow + 3, 1).Value = .Item(iRow).Name
Cells(iRow + 3, 2).Value = .Item(iRow).Value
Cells(iRow + 3, 3).Value = .Item(iRow).Type
If Err.Number <> 0 Then
Cells(iRow + 3, 2).Value = CVErr(xlErrNA)
Err.Clear
End If
Next iRow
End With
With ActiveWorkbook.CustomDocumentProperties
For iRow = 1 To .Count
Cells(iRow + 3, 5).Value = .Item(iRow).Name
Cells(iRow + 3, 6).Value = .Item(iRow).Value
Cells(iRow + 3, 7).Value = .Item(iRow).Type
If Err.Number <> 0 Then
Cells(iRow + 3, 6).Value = CVErr(xlErrNA)
Err.Clear
End If
Next iRow
End With
On Error GoTo 0
End Sub
Dateieigenschaften schreiben
[Bearbeiten]- Prozedur: WriteDocumentProperties
- Art: Sub
- Modul: Standardmodul
- Zweck: Dateieigenschaften in eine Datei schreiben
- Ablaufbeschreibung:
- Variablendeklaration
- Aktives Blatt an eine Objekt-Variable übergeben
- Wenn die Zelle A4 leer ist...
- Warnton
- Warnmeldung
- Prozedur verlassen
- Neue Arbeitsmappe anlegen
- Rahmen um die BuiltInDocumentProperties bilden
- Eine Schleife um den Datenbereich bilden
- Wenn die Zelle in Spalte A der aktuellen Zeile leer ist, Prozedur verlassen
- Wenn sich in Spalte B der aktuellen Zeile kein Fehlerwert befindet...
- Wert für die Dateieigenschaft gem. Spalte A der aktuellen Zeile festlegen
- Rahmen um die CustomDocumentProperties bilden
- Eine Schleife um den Datenbereich bilden
- Eine benutzerdefinierte Eigenschaft hinzufügen
- Vollzugsmeldung anzeigen
- Code:
Sub WriteDocumentProperties()
Dim wks As Worksheet
Dim iRow As Integer
Set wks = ActiveSheet
If IsEmpty(Range("A4")) Then
Beep
MsgBox "Sie müssen zuerst die Eigenschaften einlesen!"
Exit Sub
End If
Workbooks.Add
With ActiveWorkbook.BuiltinDocumentProperties
For iRow = 4 To 35
If IsEmpty(wks.Cells(iRow, 1)) Then Exit For
If IsError(wks.Cells(iRow, 2)) = False Then
.Item(wks.Cells(iRow, 1).Value) = wks.Cells(iRow, 2).Value
End If
Next iRow
End With
With ActiveWorkbook.CustomDocumentProperties
For iRow = 4 To 4
.Add Name:=wks.Cells(iRow, 5).Value, LinkToContent:=False, _
Type:=msoPropertyTypeDate, Value:=wks.Cells(iRow, 6).Value
Next iRow
End With
MsgBox "Die editierbaren Dateieigenschaften wurden auf diese neue" & vbLf & _
"Arbeitsmappe übertragen, bitte prüfen."
End Sub
Alle Dateieigenschaften ausgeben
[Bearbeiten]Dateieigenschaften können eingebaute Dateieigenschaften sein (Auflistung der .BuiltinDocumentProperties), aber auch benutzerdefinierte Eigenschaften sein (Auflistung der .CustomDocumentProperties), die beispielsweise von anderen Programmen (wie NovaPath) geschrieben werden. Das folgende Programmierbeispiel zeigt, wie man im Hauptprogramm die gewünschte Auflistung als Objekt an das Unterprogramm übergeben wird. Im Unterprogramm wiederum werden alle Dateieigenschaften überprüft und ausgegeben, wenn vorhanden. Dieser Aufbau bietet sich an, weil beide Eigenschaftstypen über gleiche Methoden und Eigenschaften verfügen. Das Programm ermittelt alle Eigenschaften der aktiven Arbeitsmappe und gibt sie auf ein neues Blatt aus, welches dieser Arbeitsmappe angefügt wird.
Die Switch-Anweisung ist die einzeilige Version der Select-Case-Anweisung.
' Listet alle Deteieigenschaften der aktiven Arbeitsmappe auf
Public Sub DateiEigenschaftenAufzählen()
' Mappe, deren Eigenschaften ermittelt werden
Dim Mappe As Excel.Workbook
' Neues Blatt mit der Liste aller Eigenschaften
Dim AusgabeBlatt As Excel.Worksheet
' Zeile in der Ausgabemappe, in die gerade geschrieben wird
Dim AusgabeZeileNr As Long
On Error Resume Next
Set Mappe = ActiveWorkbook
Set AusgabeBlatt = Mappe.Worksheets.Add
AusgabeZeileNr = 2
' Eingebaute Eigenschaften auflisten
EigenschaftenAusgeben Mappe.BuiltinDocumentProperties, _
AusgabeBlatt, AusgabeZeileNr, "B"
' Benutzerdefinierte Eigenschaften auflisten
EigenschaftenAusgeben Mappe.CustomDocumentProperties, _
AusgabeBlatt, AusgabeZeileNr, "C"
' Kopfzeile der Ausgabetabelle formatieren
With AusgabeBlatt.Range("A1:E1")
.Value = Array("Typ", "ID", "Name", "Wert", "Datentyp")
.Font.Bold = True
.HorizontalAlignment = xlCenter
.EntireColumn.AutoFit
.AutoFilter
' Blattname ändern:
.Parent.Name = "DateiEigenschaften"
End With
End Sub
Private Sub EigenschaftenAusgeben(EigenschaftsListe As Object, _
AusgabeBlatt As Worksheet, ByRef AusgabeZeileNr As Long, Eingebaut As String)
' Zählvariable
Dim EigenschaftsID As Long
On Error Resume Next
' Alle Eigenschaften durchgehen
For EigenschaftsID = 1 To EigenschaftsListe.Count
With EigenschaftsListe(EigenschaftsID)
If .Name <> vbNullString Then ' Eigenschaft vorhanden
AusgabeBlatt.Cells(AusgabeZeileNr, 1).Value = Eingebaut
AusgabeBlatt.Cells(AusgabeZeileNr, 2).Value = EigenschaftsID
AusgabeBlatt.Cells(AusgabeZeileNr, 3).Value = .Name
AusgabeBlatt.Cells(AusgabeZeileNr, 4).Value = .Value
' Datentyp in Text übersetzen
AusgabeBlatt.Cells(AusgabeZeileNr, 5).Value = Switch(.Type = _
msoPropertyTypeDate, "Datum", _
.Type = msoPropertyTypeBoolean, "Boolscher Wert", _
.Type = msoPropertyTypeNumber, "Ganzzahl", _
.Type = msoPropertyTypeString, "Text", _
.Type = msoPropertyTypeFloat, "Gleitkommazahl")
' Nächste Zeile im Ausgabeblatt
AusgabeZeileNr = AusgabeZeileNr + 1
End If
End With
Next EigenschaftsID
End Sub