Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Dokumenteigenschaften auslesen

Forumthread: Dokumenteigenschaften auslesen

Dokumenteigenschaften auslesen
André
Moin zusammen,
ich habe mehrere größere Exceltabellen, die von verschiedenen Mitarbeitern im Unternehmen verwendet werden. Es ist notwendig, daß jeder Mitarbeiter seine eigene Kopie der jeweiligen Datei hat, es kann also nicht mit zentral auf dem Server abgelegten Dateien gearbeitet werden.
Nun möchte ich in meine Dateien eine kleine Versionsverwaltung einbauen, um zu verhindern, daß die Leute mit alten Versionen der Dateien arbeiten.
Dazu habe ich in den Dateieigenschaften im Feld "Version" die Versionsnummer abgelegt. Die jeweils aktuellste Version der einzelnen Dateien lege ich auf einem Server ab, von dem sich die verschiedenen Leute die Dateien holen können.
Damit auch jeder mitkriegt, wenn eine neue Version einer Datei existiert, soll das automatisch per Makro geprüft werden. Bei jedem Öffnen einer Datei soll dieses Makro die Versionsnummer in den eigenen Dateieigenschaften vergleichen mit der Versionsnummer der Datei auf dem Server und ggf. einen Hinweis ausgeben.
Mit folgendem kleinen Script habe ich es schon geschafft, die Eigenschaften einer anderen Datei richtig auszulesen. Allerdings habe ich dabei ein Problem: Die Datei wird hierzu vollständig geöffnet, was aufgrund der Dateigrößen teilweise sehr lange dauert.

Sub EigenschaftenAuslesen()
Dim objDatei As Object, strDateiname As String
strDateiname = "\\server\pfad\datei.xlsm"
Set objDatei = GetObject(strDateiname)
MsgBox objDatei.BuiltinDocumentProperties.Item(8)
objDatei.Close False
Set objDatei = Nothing
End Sub
Nun meine Frage: gibt es eine Möglichkeit, die Dateieigenschaften einer anderen Datei auszulesen, OHNE diese vollständig zu öffnen? Gehen müsste das, denn der Windows-Explorer kann diese Infos ja auch zeigen, ohne die Datei zu öffnen. Immerhin gebe ich den Wert in das Versionsfeld ja im WindowsExplorer ein.
Danke für eure Hilfe.
Gruß André
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Dokumenteigenschaften auslesen
06.10.2009 23:03:26
Daniel
Hi
such mal im Archiv nach "Dateieigenschaften auslesen", schon im ersten Treffer wird eine Methode beschreiben.
allerdings werden hier alle Dateien eines Ordners abgefragt, ggf müsstest du das etwas ergänzen.
einfacher wäre es allerdings, wenn du die Versionsnummer im Dateinamen hinterlegst, dann könntest du einfach mit der DIR()-Funktion prüfen, ob eine neuere Datei vorliegt:
if Dir("\\server\pfad\datei V2.xlsm") ="" then msgbox "Neue Version liegt vor"

die Meldung poppt hoch, wenn du die Datei auf dem Server in "datei V3.xlsm" umbenennst.
eine andere Methode wäre, das Erstellungsdatum der Datei in einer konstanten zu Speichern und mit dem letzten Speicherdatum der Serverdatei abzugleichen, das geht über die Funktion FILEDATETIME(vollständigerDateiname)
if erstelldatum 
dies geht aber auch nur, wenn mit der Serverdatei nicht gearbeitet wird und diese nur zum Versionswechsel dort gespeichert wird, da FileDateTime das Datum der letzten Änderung liefert, wenn die Datei geöffnet ist, sogar das aktuelle Datum)
Gruß, Daniel
Anzeige
AW: Dokumenteigenschaften auslesen
08.10.2009 09:29:22
André
Moin Daniel,
danke für den Tip. Über die Suche habe ich folgendes Script gefunden:
Option Explicit
Sub Dateieigenschaften()
Const STRFOLDER As String = "C:\Eigene Dateien"
Dim objShell As Object, objFolder As Object
Dim x As Byte, intColumn As Integer, lngRow As Long
Dim varName, arrHeaders(34)
If Dir(STRFOLDER, 16) = "" Then
MsgBox "Der Ordner " & STRFOLDER & " wurde nicht gefunden!" & Space(10), 64, "weise hin..."
Exit Sub
End If
Application.ScreenUpdating = False
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(STRFOLDER)
intColumn = 1
For x = 0 To 33
arrHeaders(x) = objFolder.GetDetailsOf(varName, x)
Cells(1, intColumn + x) = arrHeaders(x)
Next
Rows(1).Font.Bold = True
lngRow = 2
For Each varName In objFolder.Items
For x = 0 To 33
Cells(lngRow, intColumn + x) = objFolder.GetDetailsOf(varName, x)
Next
lngRow = lngRow + 1
Next
Columns.AutoFit
Application.ScreenUpdating = True
End Sub
Das funktioniert auch wunderbar, wenn ich die Eigenschaften aller Dateien eines Verzeichnisses auflisten will. Mir gelingt es aber partout nicht, die Eigenschaften einer einzelnen Datei so auszulesen.
Folgendes habe ich probiert:
Sub EigenschaftenAuslesen()
Const STRFOLDER As String = "\\server\pfad" 'anpassen
Dim objShell As Object
Dim objFolder As Object
Dim x As Byte
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(STRFOLDER)
For x = 0 To 41
Cells(x + 1, 1).Value = objFolder.GetDetailsOf("datei.xlsx", x)
Next x
End Sub

Damit werden aber nicht die Werte, sondern die Bezeichnungen der Eigenschaften aufgelistet. Wie kann ich die Werte der Eigenschaften auflisten lassen?
Gruß, André
Anzeige
AW: Dokumenteigenschaften auslesen
08.10.2009 13:59:29
André
Moin zusammen,
ich antworte mir jetzt mal selber, weil ich die Lösung für mein Problem gefunden habe. Mit nachfolgendem Script funktioniert es wunderbar. Es vergleicht bei jedem Öffnen einer Datei (in der dieses Script eingebunden ist) diese mit einer zweiten Datei in einem Serververzeichnis. Falls die Datei auf dem Server neuer ist (Versionsnummer), dann wird eine entsprechende Meldung ausgegeben.
Leider ist es mir nicht gelungen, das Feld "Version auszulesen", deshalb habe ich die Versionsnummer im Feld "Kategorie" abgelegt. Die Versionsnummer ist übrigens ganz simpel eine Integer-Zahl.
Zusätzlich blende ich, wenn die Versionsmeldung ausgegeben wird, den Inhalt des Kommentarfeldes mit ein, in dem ich die Änderungen/Neuerungen in der aktuellen Datei beschreibe.
So, hier ist mein kleines Script, vielleicht kann es ja jemand gebrauchen. Verbesserungsvorschläge werden immer gerne angenommen:

Sub auto_open()
' Konstanten und Variablen definieren
Const STRFOLDER As String = "\\server\pfad"     ' Pfad zu den neuen Dateien
Const STRFILE As String = "datei.xlsm"          ' Dateiname der Datei auf dem Server
Dim objShell, objFolder, objFile As Object      ' Pfad- und Dateiobjekte
Dim fltVersionNeu, fltVersionAktuell As Integer ' Versionsnummern
Dim strKommentarNeu As String                   ' Neuerungen in neuer Version
Dim Antwort                                     ' Rückgabewert von Messageboxen
' Prüfen, ob Serverdatei gelesen werden kann
If Dir(STRFOLDER & "\" & STRFILE, 16) = "" Then
' Serverdatei kann nicht gelesen werden -> Script beenden
Exit Sub
End If
' Variablen zuweisen
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(STRFOLDER)
Set objFile = objFolder.ParseName(STRFILE)
' Versionsinformationen auslesen
fltVersionAktuell = ActiveWorkbook.BuiltinDocumentProperties(18) ' aktuell offene Datei
fltVersionNeu = objFolder.GetDetailsOf(objFile, 12)              ' Server-Datei
strKommentarNeu = objFolder.GetDetailsOf(objFile, 14)
' Prüfen, ob aktuelle Datei eine andere Versionsnummer hat als die Datei auf dem Server
If fltVersionAktuell  fltVersionNeu Then
' auf dem Server liegt eine ältere Datei vor. Dies darf eigentlich nicht vorkommen
Antwort = MsgBox("FEHLER!" & Chr(13) & Chr(13) & _
"Die aktuelle Datei hat eine ungültige Versionsnummer." & _
Chr(13) & Chr(13) & _
"Bitte kopiere die gültige Version von " & Chr(13) & _
"\\server\pfad" & Chr(13) & _
"in Dein Arbeitsverzeichnis." & Chr(13) & Chr(13) & _
"Willst Du die aktuelle Datei trotzdem benutzen?", 276)
End If
' Datei wieder schließen, falls Antwort NEIN geklickt wurde
If Antwort = vbNo Then
ActiveWorkbook.Close
Exit Sub
End If
End Sub

Gruß, André
Anzeige
AW: Danke, daß du deine Lösung
09.10.2009 00:47:45
Daniel
hier hochgeladen hast.
wie bist du auf das "Set objFile = objFolder.ParseName(STRFILE)" gekommen?
hast du irgendwo eine Beschreibung dazu gefunden und wenn ja, wo?
Gruß, Daniel
;
Anzeige
Anzeige

Infobox / Tutorial

Dokumenteigenschaften in Excel effizient auslesen


Schritt-für-Schritt-Anleitung

  1. Öffne dein Excel-Dokument und aktiviere den VBA-Editor mit ALT + F11.
  2. Erstelle ein neues Modul: Klicke im Projektfenster mit der rechten Maustaste auf ein Projekt und wähle Einfügen > Modul.
  3. Füge den folgenden Code ein, um die Dateieigenschaften auszulesen:
Sub EigenschaftenAuslesen()
    Const STRFOLDER As String = "\\server\pfad" ' Anpassen
    Dim objShell As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim fltVersion As Integer

    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(STRFOLDER)
    Set objFile = objFolder.ParseName("datei.xlsx") ' Dateiname anpassen

    fltVersion = objFolder.GetDetailsOf(objFile, 12) ' Version auslesen
    MsgBox "Die Versionsnummer ist: " & fltVersion
End Sub
  1. Passe den Pfad und Dateinamen entsprechend deiner Datei an.
  2. Führe das Makro aus, um die Versionsnummer anzuzeigen.

Häufige Fehler und Lösungen

  • Fehler: "Der Ordner wurde nicht gefunden!"

    • Stelle sicher, dass der angegebene Pfad korrekt ist und dass du die erforderlichen Berechtigungen für den Zugriff auf den Server hast.
  • Fehler: "Objekt nicht gefunden"

    • Überprüfe, ob der Dateiname korrekt angegeben ist und ob die Datei existiert.
  • Lösung: Falsche Indizes verwenden

    • Achte darauf, dass die Indizes in GetDetailsOf für die gewünschten Eigenschaften korrekt sind (z. B. Version, Erstellungsdatum).

Alternative Methoden

Eine einfache Möglichkeit, um die Dateieigenschaften auszulesen, ohne die Datei vollständig zu öffnen, besteht darin, die Windows-Shell zu verwenden. Hier ist ein Beispiel, wie du die DIR()-Funktion nutzen kannst, um zu überprüfen, ob eine neuere Version der Datei vorhanden ist:

If Dir("\\server\pfad\datei V2.xlsm") = "" Then 
    MsgBox "Neue Version liegt vor"
End If

Eine weitere Methode ist die Verwendung von FILEDATETIME, um das Erstellungsdatum der Datei zu überprüfen.


Praktische Beispiele

  1. Versionsvergleich bei Dateiöffnung: Verwende den folgenden Code, um bei jeder Dateiöffnung die Versionsnummer mit der auf dem Server zu vergleichen:
Sub auto_open()
    Const STRFOLDER As String = "\\server\pfad"
    Const STRFILE As String = "datei.xlsm"
    Dim objShell As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim fltVersionNeu As Integer
    Dim fltVersionAktuell As Integer

    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(STRFOLDER)
    Set objFile = objFolder.ParseName(STRFILE)

    fltVersionAktuell = ActiveWorkbook.BuiltinDocumentProperties(18)
    fltVersionNeu = objFolder.GetDetailsOf(objFile, 12)

    If fltVersionAktuell < fltVersionNeu Then
        MsgBox "Eine neuere Version ist verfügbar!"
    End If
End Sub
  1. Dateieigenschaften für alle Dateien eines Ordners auslesen: Hier ist ein Beispiel, um die Eigenschaften aller Dateien in einem bestimmten Ordner aufzulisten:
Sub Dateieigenschaften()
    Const STRFOLDER As String = "C:\Eigene Dateien"
    Dim objShell As Object
    Dim objFolder As Object
    Dim varName As Variant
    Dim x As Byte
    Dim lngRow As Long

    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(STRFOLDER)

    lngRow = 1
    For Each varName In objFolder.Items
        For x = 0 To 33
            Cells(lngRow, x + 1) = objFolder.GetDetailsOf(varName, x)
        Next x
        lngRow = lngRow + 1
    Next varName
End Sub

Tipps für Profis

  • Verwende Konstanten: Definiere den Pfad und Dateinamen als Konstanten, um deinen Code flexibler und leichter wartbar zu machen.
  • Fehlerbehandlung einbauen: Implementiere Fehlerbehandlungsroutinen, um unerwartete Probleme zu vermeiden.
  • Dokumentiere deinen Code: Kommentiere wichtige Abschnitte, damit du oder andere den Code später leichter nachvollziehen können.

FAQ: Häufige Fragen

1. Wie kann ich die Dateieigenschaften einer Datei auslesen, ohne sie zu öffnen? Mit der Verwendung der Shell-Anwendung in VBA kannst du die Dateieigenschaften (z. B. Version) auslesen, ohne die Datei vollständig zu öffnen.

2. Ist es möglich, mehrere Dateien gleichzeitig auszulesen? Ja, du kannst eine Schleife verwenden, um alle Dateien in einem bestimmten Verzeichnis zu durchlaufen und deren Eigenschaften auszulesen.

3. Welche Excel-Version benötige ich für diese Makros? Die meisten dieser Makros sind ab Excel 2007 einsetzbar, jedoch können einige Funktionen in früheren Versionen nicht verfügbar sein.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige