[VBA] Makro anpassen für Dateisuche

Lasersword

Cadet 4th Year
Registriert
Jan. 2008
Beiträge
123
Hallo CBler,

ich hab da mal wieder ein kleines Problem.
Ich würde gerne die aktuellste Datei in einem Ordner suchen.

Dafür habe ich auch schon eine Lösung gefunden (Dank Google).
Allerdings wurde ich das Makro gerne etwas optimieren.

Hier erstmal der Code:
Code:
Const adVarChar = 200, adBigInt = 20, adDate = 7

Dim f As Object
Dim fsO As Object
Dim rsFiles As Object
Dim strPath As String
   strPath = "O:\Test"
   Set fsO = CreateObject("Scripting.FileSystemObject")
   Set rsFiles = CreateObject("ADODB.Recordset")
   rsFiles.Fields.append "Path", adVarChar, 255
   rsFiles.Fields.append "Size", adBigInt
   rsFiles.Fields.append "Date", adDate

   rsFiles.Open

   For Each f In fsO.GetFolder(strPath).Files
      ' fso.GetExtensionName (f)  ' what is the extension of the file
      rsFiles.AddNew
      rsFiles("Path") = f.Path
      rsFiles("Size") = f.Size
      rsFiles("Date") = f.DateLastModified
   Next

   rsFiles.Sort = "Date DESC"
   Set f = fsO.GetFile(rsFiles("Path"))
   Workbooks.Open Filename:=strPath & "\" & f.Name, ReadOnly:=True, UpdateLinks:=0

Es wird also nach Änderungsdatum absteigend sortiert. Soweit verstehe ich das jetzt auch.

Da wir aber ggf. an einem Tag mehrere Dateien ablegen, diese aber nicht chronologisch sein müssen,
würde ich gerne nach Namen sortieren.

OK, hab mir gedacht, kann ja nicht so schwer sein:


Code:
Const adVarChar = 200, adBigInt = 20, adDate = 7, adName = 70

Dim f As Object
Dim fsO As Object
Dim rsFiles As Object
Dim strPath As String
   strPath = "O:\Test"
   Set fsO = CreateObject("Scripting.FileSystemObject")
   Set rsFiles = CreateObject("ADODB.Recordset")
   rsFiles.Fields.append "Path", adVarChar, 255
   rsFiles.Fields.append "Size", adBigInt
   rsFiles.Fields.append "Date", adDate
   rsFiles.Fields.append "Name", adName

   rsFiles.Open

   For Each f In fsO.GetFolder(strPath).Files
      ' fso.GetExtensionName (f)  ' what is the extension of the file
      rsFiles.AddNew
      rsFiles("Path") = f.Path
      rsFiles("Size") = f.Size
      rsFiles("Date") = f.DateLastModified
      rsFiles("Name") = f.Name
   Next

   rsFiles.Sort = "Name DESC"
   Set f = fsO.GetFile(rsFiles("Path"))
   Workbooks.Open Filename:=strPath & "\" & f.Name, ReadOnly:=True, UpdateLinks:=0

Aber das funktioniert nicht.
"Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar."

Wo liegt der Fehler?

Habt ihr da eine Ahnung?

Vielen Dank im Voraus.

MfG,
Lasersword
 
Moin,

so ist das, wenn man Code von andern kopiert...

Code:
Const adVarChar = 200, adBigInt = 20, adDate = 7, adName = 70
 
Dim f As Object
Dim fsO As Object
Dim rsFiles As Object
Dim strPath As String
   strPath = "O:\Test"
   Set fsO = CreateObject("Scripting.FileSystemObject")
   Set rsFiles = CreateObject("ADODB.Recordset")
   rsFiles.Fields.append "Path", adVarChar, 255
   rsFiles.Fields.append "Size", adBigInt
   rsFiles.Fields.append "Date", adDate
   rsFiles.Fields.append "Name", adName
 
   rsFiles.Open
 
   For Each f In fsO.GetFolder(strPath).Files
      ' fso.GetExtensionName (f)  ' what is the extension of the file
      rsFiles.AddNew
      rsFiles("Path") = f.Path
      rsFiles("Size") = f.Size
      rsFiles("Date") = f.DateLastModified
      rsFiles("Name") = f.Name
   Next
 
   rsFiles.Sort = "Name DESC"
   Set f = fsO.GetFile(rsFiles("Path"))
   Workbooks.Open Filename:=strPath & "\" & f.Name, ReadOnly:=True, UpdateLinks:=0

In den Zeilen 1 und 13 liegen die Fehler.
Die Konstanten heißen genau so wie der jeweilige Datentyp des Recordset-Feldes, übergeben aber durch ihre Definition das DataTypeEnum value...Heißt:
Code:
rsFiles.Fields.append "Path", adVarChar, 255
wird übersetzt zu
Code:
rsFiles.Fields.append "Path", 200, 255
wobei die 200 das value für einen Datentypen names adVarChar steht, der die Länge 255 Zeichen hat.

Du versuchst jetzt eine 70 zu übergeben, die keinem DataTypeEnum value entspricht, daher gibts einen Fehler.

Code:
rsFiles.Fields.append "Name", adVarChar, 255
So würde es funktionieren...

€dit:
Hier der Link zu den Datentypen.
 
Zuletzt bearbeitet:
Danke Chaos,

das mit den Datentypen war mir nicht ganz klar.

Jetzt funktioniert es, wie ich es möchte.

Gruß,
Lasersword
 
Zurück
Oben