Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

VBA: Auslesen der Dateieigenschaften | Herbers Excel-Forum


Betrifft: VBA: Auslesen der Dateieigenschaften von: André
Geschrieben am: 20.11.2009 12:43:03

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é

  

Betrifft: AW: VBA: Auslesen der Dateieigenschaften von: André
Geschrieben am: 20.11.2009 15:01:42

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 neuere Datei vor
        Antwort = MsgBox("Es gibt eine neue Version dieser Datei.", 308, "Versionshinweis")
    ElseIf 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é


  

Betrifft: AW: VBA: Auslesen der Dateieigenschaften von: Uwe Küstner
Geschrieben am: 20.11.2009 15:58:40

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


  

Betrifft: AW: VBA: Auslesen der Dateieigenschaften von: André
Geschrieben am: 20.11.2009 16:09:57

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é


  

Betrifft: Stimmt, ... von: Uwe Küstner
Geschrieben am: 20.11.2009 17:06:35

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


  

Betrifft: AW: VBA: Auslesen der Dateieigenschaften von: Nepumuk
Geschrieben am: 20.11.2009 18:38:55

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


  

Betrifft: AW: VBA: Auslesen der Dateieigenschaften von: André
Geschrieben am: 23.11.2009 08:29:41

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é


Beiträge aus den Excel-Beispielen zum Thema "VBA: Auslesen der Dateieigenschaften"