Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA: Auslesen der Dateieigenschaften

VBA: Auslesen der Dateieigenschaften
André
Moin zusammen,
in vielen Dateien frage ich die Dateieigenschaften im auto_open() ab. Der Grund: ich vergleiche einen Eintrag in den Dateieigenschaften mit demselben Eintrag einer Datei auf dem Server. Ist er nicht gleich, dann liegt auf dem Server eine neuere Version der Datei und ich bekomme einen entsprechenden Hinweis.
Hierzu benutze ich die Eigenschaft "Kategorien", in die ich einfach eine Zahl als Versionsnummer eintrage. Abgefragt wird diese Eigenschaft so:
fltVersionAktuell = ActiveWorkbook.BuiltinDocumentProperties(18)

Bisher hat das auch wunderbar funktioniert, unter Window XP. Nun habe ich Windows 7 installiert, und es funktioniert nicht mehr. Mittlerweile habe ich auch herausgefunden, warum:
Solange die Datei in Excel nicht geöffnet ist, steht die Versionsnummer in der Eigenschaft "Kategorien". In dem Moment, in dem Excel die Datei öffnet, ist diese Eigenschaft allerdings leer. Also liest mein Script natürlich den falschen (leeren) Wert.
Richtig komisch ist: wenn ich die Datei wieder schließe (mit oder ohne speichern), dann steht in der Dateieigenschaft wieder der korrekte Wert.
Kennt jemand dieses Phänomen, und weiß vielleicht, was ich dagegen tun kann?
Falls nicht, welche Alternativen könnt ihr mir vorschlagen, um eine Datei mit einer anderen zu vergleichen? Dabei sind folgende Bedingungen zu erfüllen:
1. die zweite Datei darf NICHT in Excel geöffnet werden
2. das Dateidatum und die Dateigröße reichen mir nicht für den Vergleich aus
Gruß, André
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: VBA: Auslesen der Dateieigenschaften
20.11.2009 15:01:42
André
Nochmal Moin,
ich habe nun noch ein wenig nachgeforscht und dabei herausbekommen, daßder Fehler doch noch etwas anders ist. Tatsächlich liest Excel die Dateieigenschaften der aktuelle geöffneten Datei richtig aus. Falsch ist aber, was aus der Datei aus dem Server ausgelesen wird.
Hier nochmal das Script, mit dem ich das mache:
Option Explicit
Sub auto_open()
' Konstanten und Variablen definieren
Const STRFOLDER As String = "\\server\pfad"      ' Pfad zu den aktuellen Dateien
Const STRFILE As String = "datei.xlsm"           ' Dateiname
Dim objShell, objFolder, objFile As Object       ' Pfad- und Dateiobjekte
Dim fltVersionNeu, fltVersionAktuell As Integer  ' Versionsnummern
Dim strKommentarNeu As String                    ' Neuerungen in aktueller Version
Dim Antwort As Integer                           ' 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)
fltVersionNeu = objFolder.GetDetailsOf(objFile, 12)
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("Ungültige Versionsnummer.", 276, "Versionshinweis")
End If
' Datei wieder schließen, falls Antwort NEIN geklickt wurde
If Antwort = vbNo Then
ActiveWorkbook.Close
Exit Sub
End If
End Sub
Der Witz ist nun, wenn ich dieses Script in einem Excel unter Windows XP starte, dann sind die Eigenschaften 12 und 14 mit den Feldern "Kategorien" und "Kommentare" gefüllt.
Rufe ich die selbe Datei aber unter Windows 7 auf, dann sind diese beiden Werte leer. Statt dessen sind in den Felder 23 und 24 nun die Werte aus "Kategorien" und "Kommentare".
Wäre toll, wenn jemand eine Idee für mich hätte.
Dazu noch eine Frage: ist es möglich, per VBA den Wert einer bestimmten Zelle einer anderen Datei auszulesen, OHNE daß diese andere Datei dafür geöffnet werden muß?
Gruß, André
Anzeige
AW: VBA: Auslesen der Dateieigenschaften
20.11.2009 15:58:40
Uwe
Hallo André,
hast Du schon probiert, statt der Nummern die Namen zu verwenden?

Debug.Print ActiveWorkbook.BuiltinDocumentProperties("Category")
Debug.Print ActiveWorkbook.BuiltinDocumentProperties("Comments")

Zur 2. Frage:
Lege doch in beiden Mappen eine versteckte Tabelle an, z.B. "Info".
In der Severdatei steht dann z.B. in A1 die Version.
In der abzufragenden Datei dann ein ganz simpler Bezug auf die ServerDatei:
='\\server\pfad\[datei.xlsm]Info'!$A$1
Gruß Uwe
Anzeige
AW: VBA: Auslesen der Dateieigenschaften
20.11.2009 16:09:57
André
Moin Uwe,
kann ich denn die Namen auch bei der Abfrage der externen Datei verwenden?
Dies hier führt immer zu einem Fehler "Typen unverträglich":
fltVersionNeu = objFolder.GetDetailsOf(objFile, "Category")
Den Verweis auf eine Zelle in der externen Datei kann ich deshalb nicht verwenden, weil dadurch die externe Datei geöffnet würde, um den Wert zu aktualisieren. Und das ist eben eine Bedingung bei meiner Anwendung, daß die Datei auf dem Server nicht geöffnet wird.
Gruß, André
Anzeige
Stimmt, ...
20.11.2009 17:06:35
Uwe
Hallo André,
stimmt, ein String geht leider nicht. GetDetailsOf verlangt einen Long.
Aber wieso wird bei einem Formelbezug die Externe Datei geöffnet?
Gruß Uwe
AW: VBA: Auslesen der Dateieigenschaften
20.11.2009 18:38:55
Nepumuk
Hallo,
die Position einer Dateieigenschaft ist a vom Betriebssystem und b von zusätzlichen Installationen abhängig. Ich mache das so, dass ich erst eine temporäre Datei anlege, dort die per Shell-Objekt lebaren Eigenschaften reinschreibe (sind nur 4) und dann per Shell die Postition auslese. Das ganze daurt zwar rund eine Sekunde, aber dafür können meine Kunden installieren was sie wollen und auch jedes Windows-Betriebssystem benutzen das es gibt, ich finde die Einträge garantiert.
Gruß
Nepumuk
Anzeige
AW: VBA: Auslesen der Dateieigenschaften
23.11.2009 08:29:41
André
Moin Nepumuk,
so richtig verstehe ich nicht, wie Du das meinst.
Die Datei, die ich gerade öffne, soll doch nichts in die Datei auf dem Server reinschreiben. Sie soll aus der Serverdatei nur eine Eigenschaft auslesen, um festzustellen, ob diese Eigenschaft einen entpsrechenden Wert hat.
Leider bin ich mit meinem Problem noch nicht wirklich weiter.
Gruß, André
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Dateieigenschaften mit VBA auslesen und vergleichen


Schritt-für-Schritt-Anleitung

Um die Dateieigenschaften mit VBA auszulesen, kannst du den folgenden VBA-Code verwenden. Dieser Code prüft die Version einer Datei auf deinem Server im Vergleich zur aktuellen Datei:

Option Explicit
Sub auto_open()
    ' Konstanten und Variablen definieren
    Const STRFOLDER As String = "\\server\pfad"      ' Pfad zu den aktuellen Dateien
    Const STRFILE As String = "datei.xlsm"           ' Dateiname
    Dim objShell, objFolder, objFile As Object       ' Pfad- und Dateiobjekte
    Dim fltVersionNeu, fltVersionAktuell As Integer   ' Versionsnummern
    Dim strKommentarNeu As String                     ' Neuerungen in aktueller Version
    Dim Antwort As Integer                            ' 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)
    fltVersionNeu = objFolder.GetDetailsOf(objFile, 12)

    ' Prüfen, ob aktuelle Datei eine andere Versionsnummer hat als die Datei auf dem Server
    If fltVersionAktuell <> fltVersionNeu Then
        Antwort = MsgBox("Ungültige Versionsnummer.", 276, "Versionshinweis")
    End If

    ' Datei wieder schließen, falls Antwort NEIN geklickt wurde
    If Antwort = vbNo Then
        ActiveWorkbook.Close
        Exit Sub
    End If
End Sub

Dieser Code funktioniert in Excel unter Windows XP und Windows 7, beachte jedoch, dass sich die Position der Dateieigenschaften je nach Betriebssystem ändern kann.


Häufige Fehler und Lösungen

  1. Leere Werte bei Dateieigenschaften: Wenn du unter Windows 7 die Dateieigenschaften ausliest und diese leer sind, kann das an den unterschiedlichen Positionen der Eigenschaften liegen. Du kannst die Property-Nummern überprüfen oder die Namen verwenden (wie „Category“ und „Comments“).

  2. Typen unverträglich: Bei der Verwendung von GetDetailsOf kann der Fehler "Typen unverträglich" auftreten, wenn du versuchst, die Eigenschaften mit einem String auszulesen. Stelle sicher, dass du die richtigen Long-Werte verwendest.


Alternative Methoden

Eine effektive Methode, die ohne das Öffnen der Datei auskommt, ist das Erstellen einer versteckten Tabelle in beiden Dateien. In der Serverdatei kannst du die Versionsnummer in eine Zelle schreiben und dann auf diese Zelle verweisen:

='\\server\pfad\[datei.xlsm]Info'!$A$1

Diese Methode ermöglicht dir den Zugriff auf die Versionsnummer, ohne die Datei zu öffnen.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie du die Dateieigenschaften auslesen kannst:

  • Um die Kategorie und Kommentare einer geöffneten Datei auszulesen, kannst du diesen Code verwenden:
Debug.Print ActiveWorkbook.BuiltinDocumentProperties("Category")
Debug.Print ActiveWorkbook.BuiltinDocumentProperties("Comments")
  • Wenn du eine temporäre Datei zur Überprüfung der Dateieigenschaften anlegen möchtest, kannst du dies über die Shell-Objekte tun, um sicherzustellen, dass die Eigenschaften für verschiedene Windows-Versionen korrekt ausgelesen werden.

Tipps für Profis

  • Nutze die Debug.Print-Methode, um schnell zu testen, ob deine Abfragen die gewünschten Ergebnisse liefern.
  • Achte darauf, die richtigen Indizes für die GetDetailsOf-Methode zu verwenden, die je nach Windows-Version variieren können.
  • Überlege dir die Verwendung von temporären Dateien, um die Dateieigenschaften zu sichern, besonders wenn du mit unterschiedlichen Excel-Versionen arbeitest.

FAQ: Häufige Fragen

1. Warum funktionieren die Dateieigenschaften nicht unter Windows 7?
Die Position der Dateieigenschaften kann von Windows-Version zu Windows-Version unterschiedlich sein, was dazu führt, dass der Zugriff auf die Werte fehlschlägt.

2. Kann ich die Namen der Eigenschaften statt der Indizes verwenden?
Ja, aber stelle sicher, dass du in den Fällen, wo die Eigenschaften über GetDetailsOf abgerufen werden, die Indizes verwendest, da diese Methode keine Strings akzeptiert.

3. Gibt es eine Möglichkeit, Daten aus einer geschlossenen Datei auszulesen?
Ja, du kannst eine versteckte Tabelle in der Datei erstellen, um die benötigten Werte abzuleiten, ohne die Datei zu öffnen.

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