HERBERS Excel-Forum - das Archiv

Thema: Datei Attribute auslesen

Datei Attribute auslesen
Hippolytus
Hallo liebes Forum,

ich habe im Windowsexplorer Dateien gespeichert, die ich in Eigenschaften mit Kategorien, Betreff und Kommentar versehen habe. Weil es schon über 300 Dateien sind, möchte ich mir dafür in Excel eine Datenbank anlegen. Als Basis dafür muss ich die Dateien und die Attribute, Kategorien, Betreff und Kommentar neben dem Pfad und dem Namen auslesen. Nachdem ich den ganzen Tag herumexperimentiert habe (den Code habe ich mir im Internet zusammengesucht) bitte ich nun um Hilfe. Leider verändert sich der Dateiname in der Sub Dateieigenschaften() nicht.
Vielen Dank im Voraus

Hippolytus

Hier ist der Code:

Option Explicit

'Verweis auf die Microsoft Scripting Runtime Bibliothek --> Extras Verweise
Dim Kategorie As String
Dim Kommentar As String
Dim LetzteZeile As Long
Dim fso As New FileSystemObject
Dim Datei As File
Dim DateiAttribute As String
Dim Ordner As Variant
Dim Pfad As String


Sub AlleDateienauslesen()

'Variablen dimensionieren

Dim Ordner As Variant
Dim Pfad As String


'Pfad definieren

Pfad = ("F:\___Resolve\_Eigenes Tutorial\Einzel-Hinweise\Test") 'Ordner anpassen !!!

'neues Tabellenblatt erstellen

'Worksheets.Add
'alte Inhalte löschen

Cells.Clear

'Erste zeile auswählen

Cells.Rows("1").Select



'Überschriften eintragen

Range("A1:D1").Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")


'Dateien des Ordner auslesen

Call DateienAuslesen(Pfad)

'Spaltenbreite einstellen

Columns("A:D").AutoFit

End Sub


Sub DateienAuslesen(Pfad As String)

'Variablen dimensionieren (fso = FileSystem Objekt)

Dim fso As New FileSystemObject
Dim Datei As File


'Schleife über alle dateien im Ordner

For Each Datei In fso.GetFolder(Pfad).Files

'letzte Zeile herausfinden

LetzteZeile = Cells(Rows.Count, 1).End(xlUp).Row + 1


'Alle Attribute auslesen

Dim DateiAttribute As String
' DateiAttribute


'Ergebnisse ins Tabellenblatt eintragen

ActiveSheet.Hyperlinks.Add anchor:=Cells(LetzteZeile, 1), Address:=Datei.Path, TextToDisplay:=Datei.Name

Cells(LetzteZeile, 1).Value = Datei.Name
Cells(LetzteZeile, 2).Value = Datei.ParentFolder
' Cells(LetzteZeile, 3).Value = Datei.Type
Dateieigenschaften

Next Datei

End Sub

Public Sub Dateieigenschaften()
Stop

Const FOLDER_PATH As String = "F:\___Resolve\_Eigenes Tutorial\Einzel-Hinweise\Test" 'Ordner anpassen !!!

Dim objShell As Object, objFolder As Object
Dim lngIndex As Long, lngColumn As Long, lngRow As Long
Dim vntFileName As Variant

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

'Application.ScreenUpdating = False

'Cells.Clear

lngColumn = 1

'For lngIndex = 0 To 24
' Cells(1, lngColumn + lngIndex) = objFolder.GetDetailsOf(Empty, lngIndex)
'Debug.Print objFolder.GetDetailsOf(Empty, lngIndex)

'Next

Stop
Rows(1).Font.Bold = True
lngRow = LetzteZeile

For Each vntFileName In objFolder.Items
For lngIndex = 0 To 24
'Cells(lngRow, lngColumn + lngIndex) = objFolder.GetDetailsOf(vntFileName, lngIndex)

If lngColumn + lngIndex = 24 Then Cells(LetzteZeile, 3).Value = objFolder.GetDetailsOf(vntFileName, lngIndex)

If lngColumn + lngIndex = 25 Then Cells(LetzteZeile, 4).Value = objFolder.GetDetailsOf(vntFileName, lngIndex)

If lngColumn + lngIndex > 25 Then Exit For

'Debug.Print lngRow; lngColumn + lngIndex; objFolder.GetDetailsOf(vntFileName, lngIndex)

Next
' lngRow = lngRow + 1
If lngColumn + lngIndex Then Exit For
Next



Columns.AutoFit
'Application.ScreenUpdating = True

Set objFolder = Nothing
Set objShell = Nothing

End Sub

AW: Datei Attribute auslesen
Onur
Was genau soll denn diese Zeile, deiner Meinung nach, bewirken?
If lngColumn + lngIndex = 24 Then
Ausserdem: Ist das Absicht, dass du für jede Datei einen Hyperlink anlegst?
AW: Datei Attribute auslesen
Oppawinni
Das kommt mir irgendwie bekannt vor.
Ist wieder mal einer dabei seine Filmchen zu listen, oder sowas...
Jedenfalls gab es da schon manches..
https://www.herber.de/forum/archiv/1928to1932/1929342_Zugriff_verweigert.html
Wobei da nicht klar wurde, ob das Zugriffsproblem um das es da ging gelöst werden konnte.
Soweit ich mich erinnere, war das für niemanden nachvollziehbar.
AW: Datei Attribute auslesen
Oppawinni
Ich hab den Code aus dem Link (ich nenne das Rosel-Code) jetzt mal angepasst,
halt entsprechend dem, was ich aus dem Post hier so beim drüber schauen entnommen habe:
Gut, ich hab jetzt keinen fest vorgegebenen Ordner mehr da drin... kann man ja aber leicht ändern.
Sollte ohne zusätzliche Verweise laufen.



Option Explicit

'Listet für einen vom Benutzer gewählten Ordner und dessen Unterordner
'jeweils auf einem neuen Arbeitsblatt alle Dateien
'
'Ursprungscode https://www.herber.de/forum/archiv/1928to1932/1929342_Zugriff_verweigert.html

Private oSheet As Worksheet
Private oFSO As Object
Private shFolder As Object
Private dtStart As Date
Private t(4) As Variant
Const cFilesRead = 0
Const cLinesOut = 1
Const cTimeElapsed = 2
Const cPathNoReadPerm = 3
Const cPathSysHid = 4

Public Sub OVBAde_DateienMitUnterordnernAuslesen()

Dim sRootPath As String
Dim objFileDialog As Object
Dim shApp As Object

Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
With objFileDialog
.AllowMultiSelect = False
.InitialFileName = Application.DefaultFilePath
.InitialView = msoFileDialogViewSmallIcons
.Title = "Bitte den Ordner auswählen"
If .Show Then sRootPath = .SelectedItems(1)
End With
Set objFileDialog = Nothing
If sRootPath = "" Then
Exit Sub
End If



dtStart = Now
t(cLinesOut) = 0
t(cFilesRead) = 0
t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
t(cPathNoReadPerm) = 0
t(cPathSysHid) = 0

dtStart = Now

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set shApp = CreateObject("Shell.Application")
Set shFolder = shApp.Namespace(sRootPath & "\")

Set oSheet = Sheets.Add

'Titelzeile erstellen
With oSheet.Range("A1:D1")
.Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")
.Interior.ColorIndex = 11
.Font.Color = vbWhite
.Font.Color = vbWhite
.HorizontalAlignment = xlCenter
End With

'Titel für Zähleranzeige während der Laufzeit
oSheet.Range("i1:M1").Value = Array("Files geprüft", "Files ausgeg.", "Laufzeit", "Folder o. Rechte", "Folder Sys/Hidden")
oSheet.Range("i2:M2").Value = t
oSheet.Range("i1:M2").Columns.AutoFit

If oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).Path = sRootPath Then
OVBAde_ReadSubFolder oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).RootFolder
Else
OVBAde_ReadSubFolder oFSO.GetFolder(sRootPath)
End If

'Zähleranzeige entfernen
oSheet.Range("i1:M2").Clear

oSheet.Columns.AutoFit

t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
MsgBox "Files geprüft " & vbTab & ": " & t(cFilesRead) & vbCrLf & _
"Files ausgegeben" & vbTab & ": " & t(cLinesOut) & vbCrLf & _
"Laufzeit " & vbTab & ": " & t(cTimeElapsed) & vbCrLf & vbCrLf & _
"Folder o. Leserechte" & vbTab & ": " & t(cPathNoReadPerm) & vbCrLf & _
"Folder Syst./Hidden" & vbTab & ": " & t(cPathSysHid)

End Sub

Private Sub OVBAde_ReadSubFolder(oFolder As Object)
Dim oSubFolder As Object
Dim oFile As Object


'Testet ob Verzeichnis gelesen werden kann
On Error Resume Next
If Not (oFolder.Files.Count >= 0) Then
t(cPathNoReadPerm) = t(cPathNoReadPerm) + 1
Exit Sub
End If
On Error GoTo 0

'Alle Dateien durchforsten
For Each oFile In oFolder.Files
If Not oFile Is Nothing Then
Details_auslesen oFile, oFolder.Path
End If
Next

'Alle Unterverzeichnisse verarbeiten (rekursiv), die nicht System oder Hidden sind
For Each oSubFolder In oFolder.subfolders
If Not ((oSubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
OVBAde_ReadSubFolder oSubFolder
Else
t(cPathSysHid) = t(cPathSysHid) + 1
End If
Next oSubFolder

End Sub

Sub Details_auslesen(Datei As Object, Ordner As String)

Dim ShFolderItem As Object 'Folder-Item, also Datei, nach Shell.GetItem

DoEvents

t(cFilesRead) = t(cFilesRead) + 1
t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
oSheet.Range("i2:M2").Value = t

oSheet.Cells(2, 10).Value = oSheet.Cells(2, 10).Value + 1

Set ShFolderItem = shFolder.ParseName(Datei.Name)

t(cLinesOut) = t(cLinesOut) + 1

With oSheet.Cells(t(cLinesOut), 1)
.Offset(1, 0).Hyperlinks.Add Anchor:=.Offset(1, 0), Address:=Datei.Path, TextToDisplay:=Datei.Name
.Offset(1, 1).Value = Ordner
.Offset(1, 2).Value = shFolder.GetDetailsOf(ShFolderItem, 24) 'Kategorie
.Offset(1, 3).Value = shFolder.GetDetailsOf(ShFolderItem, 25) 'Kommentar
End With

End Sub
AW: Korrektur
Oppawinni
Ich dachte, ich könnte das Beschleunigen, ging auch schnell, bringt aber nicht die erforderlichen Ergebnisse.
Muss mir das nochmal anschauen, so ist das sehr langsam, da macht Piet auf jeden Fall das Rennen.
Für 300 Dateien wahrscheinlich nicht tragisch.
Ich hoffe ich hab jetzt nicht wieder was verschossen.



Option Explicit

'Listet für einen vom Benutzer gewählten Ordner und dessen Unterordner
'jeweils auf einem neuen Arbeitsblatt alle Dateien
'
'Ursprungscode https://www.herber.de/forum/archiv/1928to1932/1929342_Zugriff_verweigert.html

Private oSheet As Worksheet
Private oFSO As Object
Private dtStart As Date
Private t(4) As Variant
Const cFilesRead = 0
Const cLinesOut = 1
Const cTimeElapsed = 2
Const cPathNoReadPerm = 3
Const cPathSysHid = 4

Public Sub OVBAde_DateienMitUnterordnernAuslesen()

Dim sRootPath As String
Dim objFileDialog As Object
Dim shApp As Object

Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
With objFileDialog
.AllowMultiSelect = False
.InitialFileName = Application.DefaultFilePath
.InitialView = msoFileDialogViewSmallIcons
.Title = "Bitte den Ordner auswählen"
If .Show Then sRootPath = .SelectedItems(1)
End With
Set objFileDialog = Nothing
If sRootPath = "" Then
Exit Sub
End If

dtStart = Now
t(cLinesOut) = 0
t(cFilesRead) = 0
t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
t(cPathNoReadPerm) = 0
t(cPathSysHid) = 0

dtStart = Now

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oSheet = Sheets.Add

'Titelzeile erstellen
With oSheet.Range("A1:D1")
.Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")
.Interior.ColorIndex = 11
.Font.Color = vbWhite
.Font.Color = vbWhite
.HorizontalAlignment = xlCenter
End With

'Titel für Zähleranzeige während der Laufzeit
oSheet.Range("i1:M1").Value = Array("Files geprüft", "Files ausgeg.", "Laufzeit", "Folder o. Rechte", "Folder Sys/Hidden")
oSheet.Range("i2:M2").Value = t
oSheet.Range("i1:M2").Columns.AutoFit

If oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).Path = sRootPath Then
OVBAde_ReadSubFolder oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).RootFolder
Else
OVBAde_ReadSubFolder oFSO.GetFolder(sRootPath)
End If

'Zähleranzeige entfernen
oSheet.Range("i1:M2").Clear

oSheet.Columns.AutoFit

t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
MsgBox "Files geprüft " & vbTab & ": " & t(cFilesRead) & vbCrLf & _
"Files ausgegeben" & vbTab & ": " & t(cLinesOut) & vbCrLf & _
"Laufzeit " & vbTab & ": " & t(cTimeElapsed) & vbCrLf & vbCrLf & _
"Folder o. Leserechte" & vbTab & ": " & t(cPathNoReadPerm) & vbCrLf & _
"Folder Syst./Hidden" & vbTab & ": " & t(cPathSysHid)

End Sub

Private Sub OVBAde_ReadSubFolder(oFolder As Object)
Dim oSubFolder As Object
Dim oFile As Object


'Testet ob Verzeichnis gelesen werden kann
On Error Resume Next
If Not (oFolder.Files.Count >= 0) Then
t(cPathNoReadPerm) = t(cPathNoReadPerm) + 1
Exit Sub
End If
On Error GoTo 0

'Alle Dateien durchforsten
For Each oFile In oFolder.Files
If Not oFile Is Nothing Then
Details_auslesen oFile, oFolder.Path
End If
Next

'Alle Unterverzeichnisse verarbeiten (rekursiv), die nicht System oder Hidden sind
For Each oSubFolder In oFolder.subfolders
If Not ((oSubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
OVBAde_ReadSubFolder oSubFolder
Else
t(cPathSysHid) = t(cPathSysHid) + 1
End If
Next oSubFolder

End Sub

Sub Details_auslesen(Datei As Object, Ordner As String)
Dim shApp As Object
Dim shFolder As Object
Dim ShFolderItem As Object 'Folder-Item, also Datei, nach Shell.GetItem

DoEvents

t(cFilesRead) = t(cFilesRead) + 1
t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
oSheet.Range("i2:M2").Value = t

oSheet.Cells(2, 10).Value = oSheet.Cells(2, 10).Value + 1
Set shApp = CreateObject("Shell.Application")
Set shFolder = shApp.Namespace(Datei.parentfolder.Path)
Set ShFolderItem = shFolder.ParseName(Datei.Name)

t(cLinesOut) = t(cLinesOut) + 1

With oSheet.Cells(t(cLinesOut), 1)
.Offset(1, 0).Hyperlinks.Add Anchor:=.Offset(1, 0), Address:=Datei.Path, TextToDisplay:=Datei.Name
.Offset(1, 1).Value = Datei.parentfolder.Path
.Offset(1, 2).Value = shFolder.GetDetailsOf(ShFolderItem, 23) 'Kategorie
.Offset(1, 3).Value = shFolder.GetDetailsOf(ShFolderItem, 24) 'Kommentar
End With

End Sub

AW: bissl schneller
Oppawinni
Ich hab jetzt versucht noch etwas Speed heraus zu holen.
Was aber noch drinn ist, aber natürlich Zeit braucht, ist DoEvents
und ich habe auch das Screenupdating nicht abgeschaltet, was natürlich auf die Geschwindigkeit drückt.
(ggf. würde man dann natürlich auch die Kontrollausgaben raus werfen, die auch Zeit kosten)
Das ist jetzt dann nicht ganz so schnell wie es vielleicht sein könnte.
Aber ich find es halt schlimm, wenn man vor dem Ding sitzt und man den Eindruck hat, dass sich da nichts tut.
Da werden 15 Sekunden lang....
Da sind mir kurze 20 Sekunden lieber :)

Option Explicit


'Listet für einen vom Benutzer gewählten Ordner und dessen Unterordner
'jeweils auf einem neuen Arbeitsblatt alle Dateien
'
'Ursprungscode https://www.herber.de/forum/archiv/1928to1932/1929342_Zugriff_verweigert.html

Private oSheet As Worksheet
Private oApp As Object
Private oFSO As Object
Private dtStart As Date
Private t(4) As Variant
Const cFilesRead = 0
Const cLinesOut = 1
Const cTimeElapsed = 2
Const cPathNoReadPerm = 3
Const cPathSysHid = 4

Public Sub OVBAde_DateienMitUnterordnernAuslesen()

Dim sRootPath As String
Dim objFileDialog As Object
Dim shApp As Object

Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
With objFileDialog
.AllowMultiSelect = False
.InitialFileName = Application.DefaultFilePath
.InitialView = msoFileDialogViewSmallIcons
.Title = "Bitte den Ordner auswählen"
If .Show Then sRootPath = .SelectedItems(1)
End With
Set objFileDialog = Nothing
If sRootPath = "" Then
Exit Sub
End If


dtStart = Now
t(cLinesOut) = 0
t(cFilesRead) = 0
t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
t(cPathNoReadPerm) = 0
t(cPathSysHid) = 0

dtStart = Now

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oApp = CreateObject("Shell.Application")

Set oSheet = Sheets.Add

'Titelzeile erstellen
With oSheet.Range("A1:D1")
.Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")
.Interior.ColorIndex = 11
.Font.Color = vbWhite
.Font.Color = vbWhite
.HorizontalAlignment = xlCenter
End With

' Application.ScreenUpdating = False

'Titel für Zähleranzeige während der Laufzeit
oSheet.Range("i1:M1").Value = Array("Files geprüft", "Files ausgeg.", "Laufzeit", "Folder o. Rechte", "Folder Sys/Hidden")
oSheet.Range("i2:M2").Value = t
oSheet.Range("i1:M2").Columns.AutoFit

If oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).Path = sRootPath Then
OVBAde_ReadSubFolder oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).RootFolder
Else
OVBAde_ReadSubFolder oFSO.GetFolder(sRootPath)
End If

'Zähleranzeige entfernen
oSheet.Range("i1:M2").Clear
oSheet.Columns.AutoFit

' Application.ScreenUpdating = True

t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
MsgBox "Files geprüft " & vbTab & ": " & t(cFilesRead) & vbCrLf & _
"Files ausgegeben" & vbTab & ": " & t(cLinesOut) & vbCrLf & _
"Laufzeit " & vbTab & ": " & t(cTimeElapsed) & vbCrLf & vbCrLf & _
"Folder o. Leserechte" & vbTab & ": " & t(cPathNoReadPerm) & vbCrLf & _
"Folder Syst./Hidden" & vbTab & ": " & t(cPathSysHid)

End Sub

Private Sub OVBAde_ReadSubFolder(oFolder As Object)
Dim oSubFolder As Object
Dim oFile As Object

'Testet ob Verzeichnis gelesen werden kann
On Error Resume Next
If Not (oFolder.Files.Count >= 0) Then
t(cPathNoReadPerm) = t(cPathNoReadPerm) + 1
Exit Sub
End If
On Error GoTo 0

Dim shfolder As Object
Dim shfolderitem As Object
Set shfolder = oApp.Namespace(oFolder.Path)

'Alle Dateien durchforsten
For Each oFile In oFolder.Files
If Not oFile Is Nothing Then
Set shfolderitem = shfolder.ParseName(oFile.Name)
Details_auslesen shfolder, shfolderitem
End If
Next

'Alle Unterverzeichnisse verarbeiten (rekursiv), die nicht System oder Hidden sind
For Each oSubFolder In oFolder.subfolders
If Not ((oSubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
OVBAde_ReadSubFolder oSubFolder
Else
t(cPathSysHid) = t(cPathSysHid) + 1
End If
Next oSubFolder

End Sub

Sub Details_auslesen(shfolder As Object, item As Object)

DoEvents

t(cFilesRead) = t(cFilesRead) + 1
t(cLinesOut) = t(cLinesOut) + 1
t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")

oSheet.Range("i2:M2").Value = t

With oSheet.Cells(t(cLinesOut), 1)
.Offset(1, 0).Hyperlinks.Add Anchor:=.Offset(1, 0), Address:=item.Path, TextToDisplay:=item.Name
.Offset(1, 1).Value = shfolder.self.Path
.Offset(1, 2).Value = shfolder.GetDetailsOf(item, 23) 'Kategorie
.Offset(1, 3).Value = shfolder.GetDetailsOf(item, 24) 'Kommentar
End With

End Sub


AW: bissl schneller
Piet
Hallo

ich habe auf meinem Rechner dutzende Dateien zum Ordner auflisten ausprobiert. Mit FSO, Directionary usw.
Nach vielen Test fand ich heraus, das die uralte Dir Kamelle am schnellsten läuft. Problem sind Datei Eigenschaften.
Die über Shell Objekt mit - GetDetailsOf - auflisten ist ein echter Zeitkiller. Das macht sich richtig bemerkbar.

Von Nepumuk gab es einen Code zum auflisten von 400 Dateieigenschafte. Dann kann man aber in Ruhe Kaffe trinken.
Zum auflisten von Videos nehme ich die wieder die alte Dir Version, aber bei über 1000 Videos merkt man das ausbremsen.
Meine private schnellste Video Version dauert bei 3.970 Videos 1:17 Minuten. Mit Spielzeit, Bitrate, Bildformat und Bilderzahl.
An der Version habe ich lange getüfftelt, geht nur mit Array! Das schlägt sogar den Code von unserem Meister Nepumuk.

mfg Piet
AW: bissl schneller
Oppawinni
Ich bin da eher aus Versehen rein gerutscht, weil bei Rosel das Thema ja der Zugriff war und mich schon interessiert hätte, wo da das Problem lag.
Das hat sich aber auch nicht klären können, zumal Rosel sich ja auch nicht sehr kooperativ gezeigt hatte.
Es ging halt nebenbei auch um diese Meta-Daten wozu man wenig findet. Es scheint, dass es sogar systemabhängige Unterschiede bei diesen Attributen gibt. (abhängig auch von installierter Software, wenn ich es recht erinnere) .
Auf meinem System hab ich oberhalb von so ca. 330 nichts mehr gefunden und die Video-Attribute liegen ja scheinbar wesentlich oberhalb von 300. Keine Ahnung, ob es einen Unterschied macht, ob man auf item 1 oder item 300 zugreift, lahm ist das mit den gegebenen Möglichkeiten auf jeden Fall.
Je nach Datenorganisation kann es da schon Sinn machen, sich beim Lesen dieser Metadaten auf konkrete Dateitypen zu beschränken, zumal die Daten in aller Regel ohnehin nicht belegt sind, wenn es sich nicht um einen bestimmten Datei-Typ handelt. Eine Text-Datei kennt halt keine Frame-Rate usw.
Wenn man sehr aufgeräumte Verzeichnisse hat, dann ergibt sich ja die Beschränkung auf bestimmte Dateitypen schon daraus, ansonsten sollte man da im Programm etwas einbauen, dass nur bei den Datei-Typen, bei denen das Sinn macht, spezifischen Attribute gelesen werden, zumindest wenn man größere Verzeichnisbereiche durchnudelt.
Bei allen Dateitypen alle X Attribute zu lesen ist nicht wirklich sinnhaft. Man müsste da eher typabhängig Attribute lesen, sonst musst du ja Kaffee einkaufen gehen, weil das, was du zu Hause hast nicht reicht....und das, um leere Einträge lesen zu lassen.
AW: mit Array
Oppawinni
Damit das auch mal gemacht ist.
Ich hab mich jetzt mal von meinen Kontrollausgaben verabschiedet, weil die doch auch ganz schön auf die Laufzeit schlagen und damit
auch noch die letzten µs raus geholt werden, auch noch auf Array umgestellt und sowas alles.
DoEvents hab ich gelassen, weil das sonst ja den Eindruck macht, als wäre das schon am Absterben.
Aber hee, ich hab mich überredet, keine Kontrollausgaben zu machen :=)
Ich hab halt leider wenig, woran ich das vernünftig testen könnte, also jedenfalls nicht tausende von Filmchen.
Weil ich das halt auch nie brauche, meine letzte Version:



Option Explicit

'Listet für einen vom Benutzer gewählten Ordner und dessen Unterordner
'jeweils auf einem neuen Arbeitsblatt alle Dateien
'
'Ursprungscode https://www.herber.de/forum/archiv/1928to1932/1929342_Zugriff_verweigert.html
'
'andere Attribute und ohne Beschränkung auf bestimmte Dateitypen
'Aus Geschwindigkeitsgründen:
'Kontrollausgaben entfernt
'Ausgabe wird in Array vorbereitet
'Hyperlinks ergänzt (und jetzt per Formel)
'DoEvents lass ich mal drin
'Oppawinni : Du sitzt halt davor und fragst dich, ob sich noch was tut....es kann dauern.

Private oSheet As Worksheet
Private oApp As Object
Private oFSO As Object
Private dtStart As Date
Private arrOut As Variant
Private t(4) As Variant
Const cFilesRead = 0
Const cLinesOut = 1
Const cTimeElapsed = 2
Const cPathNoReadPerm = 3
Const cPathSysHid = 4

Public Sub OVBAde_DateienMitUnterordnernAuslesen()

Dim sRootPath As String
Dim objFileDialog As Object
Dim shApp As Object
Dim i As Long

Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
With objFileDialog
.AllowMultiSelect = False
.InitialFileName = Application.DefaultFilePath
.InitialView = msoFileDialogViewSmallIcons
.Title = "Bitte den Ordner auswählen"
If .Show Then sRootPath = .SelectedItems(1)
End With
Set objFileDialog = Nothing
If sRootPath = "" Then
Exit Sub
End If

dtStart = Now
t(cFilesRead) = 0
t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
t(cPathNoReadPerm) = 0
t(cPathSysHid) = 0

dtStart = Now

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oApp = CreateObject("Shell.Application")
ReDim arrOut(3, 1000)

Set oSheet = Sheets.Add

'Titelzeile erstellen
With oSheet.Range("A1:D1")
.Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")
.Interior.ColorIndex = 11
.Font.Color = vbWhite
.Font.Color = vbWhite
.HorizontalAlignment = xlCenter
End With

If oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).Path = sRootPath Then
OVBAde_ReadSubFolder oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).RootFolder
Else
OVBAde_ReadSubFolder oFSO.GetFolder(sRootPath)
End If

'Ausgabe
ReDim Preserve arrOut(3, t(cFilesRead) - 1)
oSheet.Range("A2").Resize(UBound(arrOut, 2) + 1, 4) = WorksheetFunction.Transpose(arrOut)
For i = 0 To UBound(arrOut, 2)
oSheet.Range("A2").Offset(i, 0).FormulaR1C1 = "=HYPERLINK(RC[1]&""\" & arrOut(0, i) & """,""" & arrOut(0, i) & """)"
Next

oSheet.Columns.AutoFit

t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
MsgBox "Files gelesen " & vbTab & ": " & t(cFilesRead) & vbCrLf & _
"Laufzeit " & vbTab & ": " & t(cTimeElapsed) & vbCrLf & vbCrLf & _
"Folder o. Leserechte" & vbTab & ": " & t(cPathNoReadPerm) & vbCrLf & _
"Folder Syst./Hidden" & vbTab & ": " & t(cPathSysHid)

End Sub

Private Sub OVBAde_ReadSubFolder(oFolder As Object)
Dim oSubFolder As Object
Dim oFile As Object

'Testet ob Verzeichnis gelesen werden kann
On Error Resume Next
If Not (oFolder.Files.Count >= 0) Then
t(cPathNoReadPerm) = t(cPathNoReadPerm) + 1
Exit Sub
End If
On Error GoTo 0

Dim shfolder As Object
Dim shfolderitem As Object
Set shfolder = oApp.Namespace(oFolder.Path)

'Alle Dateien durchforsten
For Each oFile In oFolder.Files
If Not oFile Is Nothing Then
Set shfolderitem = shfolder.ParseName(oFile.Name)
Details_auslesen shfolder, shfolderitem
End If
Next

Set shfolder = Nothing
Set shfolderitem = Nothing

'Alle Unterverzeichnisse verarbeiten (rekursiv), die nicht System oder Hidden sind
For Each oSubFolder In oFolder.subfolders
If Not ((oSubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
OVBAde_ReadSubFolder oSubFolder
Else
t(cPathSysHid) = t(cPathSysHid) + 1
End If
Next oSubFolder

End Sub

Sub Details_auslesen(shfolder As Object, item As Object)

Dim lngArrSize As Long

DoEvents

t(cFilesRead) = t(cFilesRead) + 1

lngArrSize = UBound(arrOut, 2)
If t(cFilesRead) = lngArrSize Then
ReDim Preserve arrOut(3, lngArrSize + 1000)
End If

arrOut(0, t(cFilesRead) - 1) = item.Name
arrOut(1, t(cFilesRead) - 1) = shfolder.self.Path
arrOut(2, t(cFilesRead) - 1) = shfolder.GetDetailsOf(item, 23)
arrOut(3, t(cFilesRead) - 1) = shfolder.GetDetailsOf(item, 24)

End Sub



AW: mit Array
Piet
Hallo

ich lade euch mal eine Properties Datei hoch, wo ich mit dem Thema beschäftigt habe. - Folgender Stand:
Je nach dem ob mit XP, Win7 oder höher gespeichert wurde ist die Anzahl der Properties verschieden.
Bekannt sind mir bisher, 286, 298, 303 und 320 Properties. Inzwischen gibt es vielleicht noch mehr??

Die Index haben sich ab Index 33 verschoben, ab da muss man den Properties Text beachten!
Für Bilder, Videos, MP3, Word, Excel, PDF und Text sind nur bestimmte Properties vorgesehen.
Die habe ich mir in Tabelle3 per MS xlDialog für Eigenschaften aus dem XlDialog rauskopiert.
Nicht alle Daten des xlDialog sind als Eigenschaften verfügbar, z.b. Bild-ID u.v.a. fehlen.

Die restlichen sind für Private oder Geschäftliche Informationen, auch Hobbies, Kinder, etc.
Keine Ahnung warum man soviele private Informationen in diese Dateien eingebaut hat??
https://www.herber.de/bbs/user/169193.xls

mfg Piet
AW: mit Array
Oppawinni
Wie gesagt, die Attribute können variieren, je nach installierter Software.
Ich hab das mal eben damit abgefragt:


Sub theAttributes()
Dim shApp As Object
Dim shfolder As Object
Dim strAttrib As String
Dim i As Long

Set oApp = CreateObject("Shell.Application")
Set shfolder = oApp.Namespace("C:\")

For i = 0 To 400
strAttrib = shfolder.GetDetailsOf("", i)
Debug.Print i & ":" & Left(strAttrib & String(40, " "), 40);
If i Mod 3 = 2 Then Debug.Print
Next
End Sub


320 hätten genügt, da kommt nicht mehr.



0:Name 1:Größe 2:Elementtyp
3:Änderungsdatum 4:Erstelldatum 5:Letzter Zugriff
6:Attribute 7:Offlinestatus 8:Verfügbarkeit
9:Erkannter Typ 10:Besitzer 11:Art
12:Aufnahmedatum 13:Mitwirkende Interpreten 14:Album
15:Jahr 16:Genre 17:Dirigenten
18:Markierungen 19:Bewertung 20:Autoren
21:Titel 22:Betreff 23:Kategorien
24:Kommentare 25:Copyright 26:Titelnummer
27:Länge 28:Bitrate 29:Geschützt
30:Kameramodell 31:Abmessungen 32:Kamerahersteller
33:Firma 34:Dateibeschreibung 35:Masterschlüsselwörter
36:Masterschlüsselwörter 37: 38:
39: 40: 41:
42:Programmname 43:Dauer 44:Ist online
45:Periodisch wiederkehrend 46:Ort 47:Adressen der optionalen Teilnehmer
48:Optionale Teilnehmer 49:Organisatoradresse 50:Organisatorname
51:Erinnerungszeit 52:Adressen der erforderlichen Teilnehmer 53:Erforderliche Teilnehmer
54:Ressourcen 55:Besprechungsstatus 56:Status frei/besetzt
57:Gesamtgröße 58:Kontoname 59:
60:Aufgabenstatus 61:Computer 62:Jahrestag
63:Name des Assistenten 64:Telefonnummer des Assistenten 65:Geburtstag
66:Geschäftsadresse 67:Ort (geschäftlich) 68:Land/Region (geschäftlich)
69:Postfach (geschäftlich) 70:Postleitzahl (geschäftlich) 71:Bundesland/Provinz (geschäftlich)
72:Straße (geschäftlich) 73:Fax (geschäftlich) 74:Homepage (geschäftlich)
75:Rufnummer (geschäftlich) 76:Rückrufnummer 77:Autotelefon
78:Kinder 79:Zentrale Firmenrufnummer 80:Abteilung
81:E-Mail-Adresse 82:E-Mail2 83:E-Mail3
84:E-Mail-Liste 85:E-Mail-Anzeigename 86:Speichern unter
87:Vorname 88:Vollständiger Name 89:Geschlecht
90:Gegebener Name 91:Hobbies 92:Privatadresse
93:Ort (privat) 94:Land/Region (privat) 95:Postfach (privat)
96:Postleitzahl (privat) 97:Bundesland/Provinz (privat) 98:Straße (privat)
99:Fax (privat) 100:Rufnummer (privat) 101:Adressen für Chats
102:Initialen 103:Position 104:Bezeichnung
105:Nachname 106:Adresse 107:Zweiter Vorname
108:Mobiltelefon 109:Spitzname 110:Bürostandort
111:Weitere Adresse 112:Andere Stadt 113:Anderes Land/Region
114:Anderes Postfach 115:Andere Postleitzahl 116:Anderes Bundesland oder Provinz
117:Andere Straße 118:Pager 119:Persönlicher Titel
120:Stadt 121:Land/Region 122:Postfach
123:Postleitzahl 124:Bundesland/Provinz 125:Straße
126:Primäre E-Mail 127:Primäre Telefonnummer 128:Beruf
129:Ehepartner/Partner 130:Suffix 131:TTY/TTD-Telefon
132:Telex 133:Webseite 134:Inhaltstatus
135:Inhaltstyp 136:Erfassungsdatum 137:Archivierungsdatum
138:Vollendungsdatum 139:Gerätekategorie 140:Verbindung hergestellt
141:Erkennungsmethode 142:Anzeigename 143:Lokaler Computer
144:Hersteller 145:Modell 146:Gekoppelt
147:Klassifizierung 148:Status 149:Gerätestatus
150:Clientkennung 151:Mitwirkende 152:Inhalt erstellt
153:Zuletzt gedruckt 154:Letzte Speicherung 155:Hauptabteilung
156:Dokument-ID 157:Seiten 158:Folien
159:Gesamtbearbeitungszeit 160:Wortanzahl 161:Fällig am
162:Enddatum 163:Dateianzahl 164:Dateierweiterung
165:Dateiname 166:Dateiversion 167:Kennzeichnungsfarbe
168:Kennzeichnungsstatus 169:Freier Speicherplatz 170:
171: 172:Gruppe 173:Freigabetyp
174:Bittiefe 175:Horizontale Auflösung 176:Breite
177:Vertikale Auflösung 178:Höhe 179:Wichtigkeit
180:Anlage? 181:Ist gelöscht 182:Verschlüsselungsstatus
183:Kennzeichnung vorhanden 184:Wurde beendet 185:Unvollständig
186:Lesestatus 187:Freigegeben 188:Ersteller
189:Datum 190:Ordnername 191:Ordnerpfad
192:Ordner 193:Teilnehmer 194:Pfad
195:Nach Ort 196:Typ 197:Kontaktnamen
198:Eintragstyp 199:Sprache 200:Letzter Besuch
201:Beschreibung 202:Verknüpfungsstatus 203:Verknüpfungsziel
204:URL 205: 206:
207: 208:Medium erstellt 209:Veröffentlichungsdatum
210:Codiert durch 211:Folgennummer 212:Produzenten
213:Herausgeber 214:Staffelnummer 215:Untertitel
216:Benutzerweb-URL 217:Texter 218:
219:Anlagen 220:BCC-Adressen 221:BCC
222:CC-Adressen 223:CC 224:Unterhaltungs-ID
225:Empfangsdatum 226:Absendungsdatum 227:Von Adressen
228:Von 229:Hat Anlagen 230:Absenderadresse
231:Absendername 232:Speicher 233:Empfängeradressen
234:Arbeitstitel 235:An 236:Laufzeit
237:Albuminterpret 238:Sortierung nach Albuminterpret 239:Album-ID
240:Sortierung nach Album 241:Sortierung nach mitwirkenden Interpreten242:Beats pro Minute
243:Komponisten 244:Sortierung nach Komponist 245:Disc
246:Ursprünglicher Schlüssel 247:Bestandteil einer Kompilation 248:Stimmung
249:Teil eines Satzes 250:Zeitraum 251:Farbe
252:Jugendschutz 253:Grund für Jugendschutzeinstufung 254:Verwendeter Speicherplatz
255:EXIF-Version 256:Ereignis 257:Lichtwert
258:Belichtungsprogramm 259:Belichtungszeit 260:Blendenzahl
261:Blitzlichtmodus 262:Brennweite 263:35mm Brennweite
264:ISO-Filmempfindlichkeit 265:Objektivhersteller 266:Objektivmodell
267:Lichtquelle 268:Maximale Blende 269:Messmodus
270:Ausrichtung 271:Kontakte 272:Programmmodus
273:Sättigung 274:Abstand 275:Weißausgleich
276:Priorität 277:Projekt 278:Kanal
279:Folgenname 280:Untertitel (Closed Captions) 281:Wiederholung
282:Zweikanalton 283:Sendungsdatum 284:Sendungsbeschreibung
285:Aufnahmezeit 286:Senderrufzeichen 287:Fernsehsendername
288:Zusammenfassung 289:Schnipsel 290:Automatische Zusammenfassung
291:Relevanz 292:Dateibesitz 293:Sensitivität
294:Freigegeben für 295:Freigabestatus 296:
297:Produktname 298:Produktversion 299:Supportlink
300:Quelle 301:Startdatum 302:Ist geteilt
303:Verfügbarkeitsstatus 304:Status 305:Abrechnungsinformationen
306:Abgeschlossen 307:Aufgabenbesitzer 308:Sortierung nach Titel
309:Gesamtdateigröße 310:Marken 311:Videokomprimierung
312:Regisseure 313:Datenrate 314:Bildhöhe
315:Einzelbildrate 316:Bildbreite 317:Kugelförmig
318:Stereo 319:Videoausrichtung 320:Gesamtbitrate


AW: schnell genug
Oppawinni
Ich hab das Ding jetzt doch nochmal angefasst, um nochmal einen Vergleich mit deinem "alten Teil" zu machen.
Dazu hab ich das so gepasst, dass etwas die gleichen Daten gelesen werden.
Gut, ich mach jetzt trotzdem nur Datei-spezifischen Output
Aber es sieht so aus, als wäre das wieder gleich schnell.
Ich mache es jetzt auch so, dass ich das Array NICHT vergrößere, wenn es voll ist, sondern schreib die Daten dann jedes mal einfach raus.
Wenn du auch mal vergleichen möchtest, Piet, hier der Code:
Option Explicit


'Listet für einen vom Benutzer gewählten Ordner und dessen Unterordner
'jeweils auf einem neuen Arbeitsblatt alle Dateien
'
'Ursprungscode https://www.herber.de/forum/archiv/1928to1932/1929342_Zugriff_verweigert.html
'
'andere Attribute und ohne Beschränkung auf bestimmte Dateitypen
'Aus Geschwindigkeitsgründen:
'Kontrollausgaben entfernt
'Ausgabe wird in Array vorbereitet
'Hyperlinks ergänzt (und jetzt per Formel)
'DoEvents lass ich mal drin
'Oppawinni : Du sitzt halt davor und fragst dich, ob sich noch was tut....es kann dauern.

Private oSheet As Worksheet
Private oApp As Object
Private oFSO As Object
Private dtStart As Date
Private arrOut As Variant
Private rngStartOut As Range
Private t(4) As Variant
Const cFilesRead = 0
Const cLinesCount = 1
Const cTimeElapsed = 2
Const cPathNoReadPerm = 3
Const cPathSysHid = 4

Public Sub OVBAde_DateienMitUnterordnernAuslesen()

Dim sRootPath As String
Dim objFileDialog As Object
Dim shApp As Object
Dim i As Long

Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
With objFileDialog
.AllowMultiSelect = False
.InitialFileName = Application.DefaultFilePath
.InitialView = msoFileDialogViewSmallIcons
.Title = "Bitte den Ordner auswählen"
If .Show Then sRootPath = .SelectedItems(1)
End With
Set objFileDialog = Nothing
If sRootPath = "" Then
Exit Sub
End If

dtStart = Now
t(cFilesRead) = 0
t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
t(cPathNoReadPerm) = 0
t(cPathSysHid) = 0
t(cLinesCount) = 0

dtStart = Now

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oApp = CreateObject("Shell.Application")
ReDim arrOut(7, 800)

Set oSheet = Sheets.Add

'Titelzeile erstellen
With oSheet.Range("A1:H1")
.Value = Array("Datei", "Typ", "Größe", "Stand", "Ordner", "Betreff", "Kategorie", "Kommentar")
.Interior.ColorIndex = 11
.Font.Color = vbWhite
.Font.Color = vbWhite
.HorizontalAlignment = xlCenter
End With

Set rngStartOut = oSheet.Range("A2")

If oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).Path = sRootPath Then
OVBAde_ReadSubFolder oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).RootFolder
Else
OVBAde_ReadSubFolder oFSO.GetFolder(sRootPath)
End If

'Ausgabe der letzten Daten und Autofit
ReDim Preserve arrOut(UBound(arrOut, 1), t(cLinesCount) - 1)
putArray
oSheet.Columns.AutoFit

t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
MsgBox "Files gelesen " & vbTab & ": " & t(cFilesRead) & vbCrLf & _
"Laufzeit " & vbTab & ": " & t(cTimeElapsed) & vbCrLf & vbCrLf & _
"Folder o. Leserechte" & vbTab & ": " & t(cPathNoReadPerm) & vbCrLf & _
"Folder Syst./Hidden" & vbTab & ": " & t(cPathSysHid)

End Sub

Private Sub OVBAde_ReadSubFolder(oFolder As Object)
Dim oSubFolder As Object
Dim oFile As Object

'Testet ob Verzeichnis gelesen werden kann
On Error Resume Next
If Not (oFolder.Files.Count >= 0) Then
t(cPathNoReadPerm) = t(cPathNoReadPerm) + 1
Exit Sub
End If
On Error GoTo 0

Dim shfolder As Object
Dim shfolderitem As Object
Set shfolder = oApp.Namespace(oFolder.Path)

'Alle Dateien durchforsten
For Each oFile In oFolder.Files
If Not oFile Is Nothing Then
Set shfolderitem = shfolder.ParseName(oFile.Name)
Details_auslesen shfolder, shfolderitem
End If
Next

Set shfolder = Nothing
Set shfolderitem = Nothing

'Alle Unterverzeichnisse verarbeiten (rekursiv), die nicht System oder Hidden sind
For Each oSubFolder In oFolder.subfolders
If Not ((oSubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
OVBAde_ReadSubFolder oSubFolder
Else
t(cPathSysHid) = t(cPathSysHid) + 1
End If
Next oSubFolder

End Sub

Private Sub Details_auslesen(shfolder As Object, item As Object)

Dim lngArrSize As Long

lngArrSize = UBound(arrOut, 2)
If t(cLinesCount) = lngArrSize Then
putArray
End If

arrOut(0, t(cLinesCount)) = item.Name
arrOut(1, t(cLinesCount)) = item.Type
arrOut(2, t(cLinesCount)) = item.Size
arrOut(3, t(cLinesCount)) = item.ModifyDate
arrOut(4, t(cLinesCount)) = shfolder.self.Path
arrOut(5, t(cLinesCount)) = shfolder.GetDetailsOf(item, 22)
arrOut(6, t(cLinesCount)) = shfolder.GetDetailsOf(item, 23)
arrOut(7, t(cLinesCount)) = shfolder.GetDetailsOf(item, 24)

t(cLinesCount) = t(cLinesCount) + 1
t(cFilesRead) = t(cFilesRead) + 1

End Sub

Private Sub putArray()

Dim i As Long
rngStartOut.Resize(UBound(arrOut, 2) + 1, UBound(arrOut, 1) + 1) = WorksheetFunction.Transpose(arrOut)
For i = 0 To UBound(arrOut, 2)
rngStartOut.Offset(i, 0).FormulaR1C1 = "=HYPERLINK(RC[4]&""\" & arrOut(0, i) & """,""" & arrOut(0, i) & """)"
Next
Set rngStartOut = rngStartOut.Offset(t(cLinesCount))
t(cLinesCount) = 0

DoEvents

End Sub
AW: bissl schneller
schauan
Hallöchen,
@Piet - jupp, Arrays statt einzelner Zellzugriffe sind schon sehr relevant, wird mE viel zu wenig genutzt...
"Richttige" Hyperlinks sind auch nicht unbedingt immer erste Wahl, per Formel in einen Bereich eintragen geht's zudem schneller.

Hier mal mein Vorschlag / Ansatz für die ursprüngliche Problemstellung. Ordnerwahl usw. überlasse ich dem TE zwecks Einprogrammierung :-)

Sub Dateiliste()

Dim objShell As Object, objPath As Object, objFile As Object
Dim arrData, iCnt%
Set objShell = CreateObject("Shell.Application")
Set objPath = objShell.Namespace("c:\test")
ReDim arrData(3, 1000)
'Überschriften eintragen
Range("A1:D1").Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")
'Schleife ueber alle Files
For Each objFile In objPath.Items
'Daten in Array uebernehmen
arrData(0, iCnt) = Replace(objFile.Path, objFile.Name, "")
arrData(1, iCnt) = objFile.Name
arrData(2, iCnt) = objPath.GetDetailsOf(objFile, 24)
arrData(3, iCnt) = objPath.GetDetailsOf(objFile, 25)
'Zaehler fuer Arrayndex hochsetzen
iCnt = iCnt + 1
'Ende Schleife ueber alle Files
Next
'Array entsprechend Anzahl Eintraege kuerzen
ReDim Preserve arrData(3, iCnt - 1)
'Array in Bereich ab Zeile 2 eintragen
Cells(2, 1).Resize(iCnt - 1, 4).Value = WorksheetFunction.Transpose(arrData)
Columns("A:D").AutoFit
'Hyperlink-Formel
Range(Cells(2, 5), Cells(iCnt - 1, 5)).FormulaR1C1 = "=HYPERLINK(RC[-4]&RC[-3],""zur Datei"")"
End Sub

AW: bissl schneller
schauan
Hallöchen,
@Piet - jupp, Arrays statt einzelner Zellzugriffe sind schon sehr relevant, wird mE viel zu wenig genutzt...
"Richttige" Hyperlinks sind auch nicht unbedingt immer erste Wahl, per Formel in einen Bereich eintragen geht's zudem schneller.

Hier mal mein Vorschlag / Ansatz für die ursprüngliche Problemstellung. Ordnerwahl usw. überlasse ich dem TE zwecks Einprogrammierung :-)

Sub Dateiliste()

Dim objShell As Object, objPath As Object, objFile As Object
Dim arrData, iCnt%
Set objShell = CreateObject("Shell.Application")
Set objPath = objShell.Namespace("c:\test")
ReDim arrData(3, 1000)
'Überschriften eintragen
Range("A1:D1").Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")
'Schleife ueber alle Files
For Each objFile In objPath.Items
'Daten in Array uebernehmen
arrData(0, iCnt) = Replace(objFile.Path, objFile.Name, "")
arrData(1, iCnt) = objFile.Name
arrData(2, iCnt) = objPath.GetDetailsOf(objFile, 24)
arrData(3, iCnt) = objPath.GetDetailsOf(objFile, 25)
'Zaehler fuer Arrayndex hochsetzen
iCnt = iCnt + 1
'Ende Schleife ueber alle Files
Next
'Array entsprechend Anzahl Eintraege kuerzen
ReDim Preserve arrData(3, iCnt - 1)
'Array in Bereich ab Zeile 2 eintragen
Cells(2, 1).Resize(iCnt - 1, 4).Value = WorksheetFunction.Transpose(arrData)
Columns("A:D").AutoFit
'Hyperlink-Formel
Range(Cells(2, 5), Cells(iCnt - 1, 5)).FormulaR1C1 = "=HYPERLINK(RC[-4]&RC[-3],""zur Datei"")"
End Sub

AW: Datei Attribute auslesen
Piet
Hallo

ich habe mal meine Datei zum Auflisten im Angebot. - Eine eigenwillige Auflistung, mir gefällt sie.
Die Eigenschaften Betreff, Kategorie und Kommentare kann man direkt auflisten, ohne eine For Next Schleife.
Es ist eine alte Excvel 2003 Datei, mit altem Dir Code, der aber schneller ist als das moderne FSO System!
https://www.herber.de/bbs/user/169155.xls

mfg Piet
AW: Datei Attribute auslesen
schauan
Hallöchen,
@Piet - jupp, Arrays statt einzelner Zellzugriffe sind schon sehr relevant, wird mE viel zu wenig genutzt...
"Richttige" Hyperlinks sind auch nicht unbedingt immer erste Wahl, per Formel in einen Bereich eintragen geht's zudem schneller.

Hier mal mein Vorschlag / Ansatz für die ursprüngliche Problemstellung. Ordnerwahl usw. überlasse ich dem TE zwecks Einprogrammierung :-)

Sub Dateiliste()

Dim objShell As Object, objPath As Object, objFile As Object
Dim arrData, iCnt%
Set objShell = CreateObject("Shell.Application")
Set objPath = objShell.Namespace("c:\test")
ReDim arrData(3, 1000)
'Überschriften eintragen
Range("A1:D1").Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")
'Schleife ueber alle Files
For Each objFile In objPath.Items
'Daten in Array uebernehmen
arrData(0, iCnt) = Replace(objFile.Path, objFile.Name, "")
arrData(1, iCnt) = objFile.Name
arrData(2, iCnt) = objPath.GetDetailsOf(objFile, 24)
arrData(3, iCnt) = objPath.GetDetailsOf(objFile, 25)
'Zaehler fuer Arrayndex hochsetzen
iCnt = iCnt + 1
'Ende Schleife ueber alle Files
Next
'Array entsprechend Anzahl Eintraege kuerzen
ReDim Preserve arrData(3, iCnt - 1)
'Array in Bereich ab Zeile 2 eintragen
Cells(2, 1).Resize(iCnt - 1, 4).Value = WorksheetFunction.Transpose(arrData)
Columns("A:D").AutoFit
'Hyperlink-Formel
Range(Cells(2, 5), Cells(iCnt - 1, 5)).FormulaR1C1 = "=HYPERLINK(RC[-4]&RC[-3],""zur Datei"")"
End Sub

AW: Datei Attribute auslesen
Oppawinni
Ich hab mal dein Dingens und das "Rosel"-Teil laufen lassen.
Gut der Vergleich ist vielleicht nicht ganz fair, weil ja unterschiedliche Daten ermittelt und ausgegeben werden.
Bei dem "Rosel"-Teil ist dann auch ein DoEvents und Kontrollausgaben eingebaut, sieht dann auch nicht halb tot aus, wenn es läuft.
Unter dem Strich bei ca. 3000 Dateien ein kaum feststellbarer Laufzeit-Unterschied. Laufzeit von 15 Sekunden quetsch.
AW: Datei Attribute auslesen
schauan
Hallöchen,
@Piet - jupp, Arrays statt einzelner Zellzugriffe sind schon sehr relevant, wird mE viel zu wenig genutzt...
"Richttige" Hyperlinks sind auch nicht unbedingt immer erste Wahl, per Formel in einen Bereich eintragen geht's zudem schneller.

Hier mal mein Vorschlag / Ansatz für die ursprüngliche Problemstellung. Ordnerwahl usw. überlasse ich dem TE zwecks Einprogrammierung :-)

Sub Dateiliste()

Dim objShell As Object, objPath As Object, objFile As Object
Dim arrData, iCnt%
Set objShell = CreateObject("Shell.Application")
Set objPath = objShell.Namespace("c:\test")
ReDim arrData(3, 1000)
'Überschriften eintragen
Range("A1:D1").Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")
'Schleife ueber alle Files
For Each objFile In objPath.Items
'Daten in Array uebernehmen
arrData(0, iCnt) = Replace(objFile.Path, objFile.Name, "")
arrData(1, iCnt) = objFile.Name
arrData(2, iCnt) = objPath.GetDetailsOf(objFile, 24)
arrData(3, iCnt) = objPath.GetDetailsOf(objFile, 25)
'Zaehler fuer Arrayndex hochsetzen
iCnt = iCnt + 1
'Ende Schleife ueber alle Files
Next
'Array entsprechend Anzahl Eintraege kuerzen
ReDim Preserve arrData(3, iCnt - 1)
'Array in Bereich ab Zeile 2 eintragen
Cells(2, 1).Resize(iCnt - 1, 4).Value = WorksheetFunction.Transpose(arrData)
Columns("A:D").AutoFit
'Hyperlink-Formel
Range(Cells(2, 5), Cells(iCnt - 1, 5)).FormulaR1C1 = "=HYPERLINK(RC[-4]&RC[-3],""zur Datei"")"
End Sub

AW: Doch lahm
Oppawinni
Also nein, ich denke nicht, dass es an FSO liegt.
Bei dem Rosel-Code wurde ja nur für bestimmte Dateiarten diese Attribute gelesen und da genau liegt der Hund begraben.
Ich hab nämlich wenig Medien-Dateien und dann ist das ja gar kein Thema.
Wenn ich aber für alle Dateien diese Meta-Daten abfrage, dann zieht das die Geschwindigkeit dramatisch runter.
Das muss ich mir bei Gelegenheit nochmal anschauen. Das sollte nicht so viel langsamer sein.
Gut was dein alter Code macht hab ich mir im Detail auch noch nicht angesehen.
Also Piet, ich gestehe, aktuell gewinnt dein alter Code auf jeden Fall das Rennen.
AW: Doch lahm
schauan
Hallöchen,
@Piet - jupp, Arrays statt einzelner Zellzugriffe sind schon sehr relevant, wird mE viel zu wenig genutzt...
"Richttige" Hyperlinks sind auch nicht unbedingt immer erste Wahl, per Formel in einen Bereich eintragen geht's zudem schneller.

Hier mal mein Vorschlag / Ansatz für die ursprüngliche Problemstellung. Ordnerwahl usw. überlasse ich dem TE zwecks Einprogrammierung :-)

Sub Dateiliste()

Dim objShell As Object, objPath As Object, objFile As Object
Dim arrData, iCnt%
Set objShell = CreateObject("Shell.Application")
Set objPath = objShell.Namespace("c:\test")
ReDim arrData(3, 1000)
'Überschriften eintragen
Range("A1:D1").Value = Array("Datei", "Ordner", "Kategorie", "Kommentar")
'Schleife ueber alle Files
For Each objFile In objPath.Items
'Daten in Array uebernehmen
arrData(0, iCnt) = Replace(objFile.Path, objFile.Name, "")
arrData(1, iCnt) = objFile.Name
arrData(2, iCnt) = objPath.GetDetailsOf(objFile, 24)
arrData(3, iCnt) = objPath.GetDetailsOf(objFile, 25)
'Zaehler fuer Arrayndex hochsetzen
iCnt = iCnt + 1
'Ende Schleife ueber alle Files
Next
'Array entsprechend Anzahl Eintraege kuerzen
ReDim Preserve arrData(3, iCnt - 1)
'Array in Bereich ab Zeile 2 eintragen
Cells(2, 1).Resize(iCnt - 1, 4).Value = WorksheetFunction.Transpose(arrData)
Columns("A:D").AutoFit
'Hyperlink-Formel
Range(Cells(2, 5), Cells(iCnt - 1, 5)).FormulaR1C1 = "=HYPERLINK(RC[-4]&RC[-3],""zur Datei"")"
End Sub

Setzt es bei dir aus, oder was?
Oppawinni
Ganz abgesehen davon, dass dein paar µs die du da holen kannst nicht das Problem sind.
Dein Beitrag sicher nicht so wichtig, dass du den gleich X-fach hier herumstreuen musst, du Streuposter.
Ein bisschen Trollen liegt dir schon im Blut, oder ?