Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1800to1804
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Dateieigenschaften auslesen

Dateieigenschaften auslesen
01.01.2021 08:27:20
Wolfgang
Hallo
Steh mal wieder vor einem Problem
Habe 2 VBA codes:
der 1. listet mir Dateinamen und Verzeichnisse auf
der 2. listet Dateieigenschaften aus vordefiniertem Verzeichnis auf
=============================
Code1:
Sub Versuch_DateienAuflisten()
Dim lngZeile As Long
Dim objFileSystem As Object
Dim objVerzeichnis As Object
Dim objDateienliste As Object
Dim objDatei As Object
'Dim strPfad
Set objFileSystem = CreateObject("scripting.FileSystemObject")
'strPfad = InputBox(„Ordnerpfad“)
'Set objVerzeichnis = objFileSystem.GetFolder(strPfad)
Set objVerzeichnis = objFileSystem.GetFolder(Worksheets("Dateiliste_Expert").Cells(1, 2).Value)
Set objDateienliste = objVerzeichnis.Files
lngZeile = 4
For Each objDatei In objDateienliste
If Not objDatei Is Nothing Then
ActiveSheet.Cells(lngZeile, 1) = objDatei.Name
lngZeile = lngZeile + 1
End If
Next objDatei
Call UnterOrdnerAuslesen(objVerzeichnis)
End Sub
Sub UnterOrdnerAuslesen(ByVal strDateipfad As String)
Dim objFileSystem As Object
Dim objVerzeichnis As Object
Dim objUnterordner As Object
Dim objDatei As Object
Dim i As Long
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objVerzeichnis = objFileSystem.GetFolder(strDateipfad)
If Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
i = Cells(Rows.Count, 1).End(xlUp).Row + 1
Else
i = 4
End If
For Each objUnterordner In objVerzeichnis.subfolders
For Each objDatei In objUnterordner.Files
On Error Resume Next
If Not objDatei Is Nothing Then
' If Not objDatei Is Nothing And Not Right(objDatei.Name, 4) = ".jpg" Then
ActiveSheet.Cells(i, 1) = objDatei.Name
ActiveSheet.Cells(i, 2) = objUnterordner.Path
i = i + 1
End If
Next objDatei
Call UnterOrdnerAuslesen(objUnterordner.Path)
If Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
i = Cells(Rows.Count, 1).End(xlUp).Row + 1
Else
i = 1
End If
Next objUnterordner
End Sub
Sub Clear()
Range("A3:k999999").ClearContents
End Sub
Private Sub CommandButton1_Click()
Call Versuch_DateienAuflisten
End Sub
Private Sub CommandButton2_Click()
Call Clear
End Sub
===============================
code 2:
Public Sub Dateieigenschaften()
Const FOLDER_PATH As String = "D:\Music\" '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 300
Cells(1, lngColumn + lngIndex) = objFolder.GetDetailsOf(vntFileName, lngIndex)
Next
Rows(1).Font.Bold = True
lngRow = 2
For Each vntFileName In objFolder.Items
For lngIndex = 0 To 300
Cells(lngRow, lngColumn + lngIndex) = objFolder.GetDetailsOf(vntFileName, lngIndex)
Next
lngRow = lngRow + 1
Next
Columns.AutoFit
Application.ScreenUpdating = True
Set objFolder = Nothing
Set objShell = Nothing
End Sub

====================
Allerdings schaffe ich es nicht die Funktionen von Code 2 auf Code 1 umzuwälzen.
Ich hätte gerne dass bei code 1 ab Spalte 3 dann die Eigenschaften aufgelistet werden
die indizierung der Eigenschaften müsste folgendermaßen sein (würde mir gerne nur die rauspicken die ich brauche z.b. Spieldauer bei video oder Musikdateien...)
0 Name
1 Größe
2 Typ
3 Geändert am
4 Erstellt am
5 Letzter Zugriff am
6 Attribute
7 Status
8 Besitzer
9 Autor
10 Titel
11 Thema
12 Kategorie
13 Seiten
14 Kommentare
15 Copyright
16 Interpret
17 Albumtitel
18 Jahr
19 Titelnummer
20 Genre
21 Dauer
22 Bitrate
23 Geschützt
24 Kameramodell
25 Bild aufgenommen am
26 Abmessungen
27
28
29 Folgenname
30 Sendungsbeschreibung
31 Abtastgröße
32 Abtastrate
33 Kanäle
34 Firma
35 Beschreibung
36 Dateiversion
=====================
Hoffe jemand von euch hat des Rätsels lösung.
Besten Dank schonmal im Vorraus
Wolfgang

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dateieigenschaften auslesen
01.01.2021 10:44:37
Piet
Hallo
zunaechst einmal ein fröhliches und gesundes neues Jahr.
Hier mal mein Code mit dem ich Ordner von Viedos und MP3 Dateien aufliste. Habe ich mal probeweise umgeschrieben auf Dateieigenschaften ab Index 3. Ich hofde es klappt, sonst bitte selbst korrigieren.
Im Code werden System Ordner und unerwünsche Dateien übersprungen. Den Teil must du ggf. löschen!
Kleiner Schönheitsfehler: - das Programm kann keinen Einzelorner auflisten. Dann versagt es!!
mfg Piet
Option Explicit       '25.07.2019  Piet, Ankara
Dim fso, oFolder, Fil, sPfad
Dim objShell, objFolder, objFolderItem
Dim gMB, fe, ht, f, o, l, z As Long
Sub Auflisten_FSO_Prop()
f = 0: o = 0: fe = 0: l = 8: z = 7
[j1,j2] = Time
[d1] = [a1]: [d2] = [a2]  'Summen Copy
[a1:a5] = Empty      'Clr Verify Anzeige
[b3:c3] = Empty      'Clr HTML Anzeige
[c2:c4] = Empty      'Clr Error Anzeige
[f1,h1,i1] = Empty   'Clr Stand Anzeige
[a5:m20] = Empty     'Clr seitl. Ordner + Süre
Range("A10:M" & Rows.Count).Delete shift:=xlUp
Columns("E:E").NumberFormat = "#,##0"
Range("A8:M20").Font.ColorIndex = xlAutomatic
sPfad = [c1].Value   '"D:\Birkenbihl Ordner"
If InStr(sPfad, "  (") Then sPfad = Trim(Left(sPfad, InStr(sPfad, "  (") - 1))
Set objShell = CreateObject("Shell.Application")
Set fso = CreateObject("scripting.FileSystemObject")
Set oFolder = fso.GetFolder(sPfad)
'OHNE xls Dateien in Laufwerk D!!
Call RecursiveFolderProp(oFolder, 1)
[c7] = sPfad
[a1] = f   'Dateien
[a2] = o   'Ordner
[h1] = z   'LastZell
[j7] = o:  [k7] = "U-Ordner"
[f1] = "Stand:  " & CDate(Date)
[g1].Formula = "=SUM(G9:G" & z & ")"
[c2] = "OHNE - txt, doc, xls, pdf, ini, lnk, jpg"
If f = 0 Then MsgBox "Konnte nicht auflisten, keine Unterordnervorhanden"
ActiveWindow.ScrollRow = 1
[j2] = Time
Exit Sub
Fehler:   MsgBox "Fehler in:  Videos_auflisten_FSO"
End Sub
Sub RecursiveFolderProp(xFolder, TimeTest As Long)
Dim subfld As Object, Txt, ok As Variant
Application.ScreenUpdating = False
'On Error GoTo Fehler
On Error Resume Next
For Each subfld In xFolder.SubFolders
If InStr(subfld.Path, "System Volume") Then GoTo nx
If InStr(subfld.Path, "RECYCLE") Then GoTo nx
Set oFolder = fso.GetFolder(subfld)
Set objFolder = objShell.Namespace(subfld.Path)
Application.StatusBar = z & "  /  " & subfld.Path
z = z + 2:  o = o + 1:  l = l + 1
Cells(z, 3).Font.ColorIndex = 5
Cells(z, 3) = subfld.Path
Cells(z, 5) = subfld.Size
Cells(z, 6) = subfld.DateCreated
Cells(z, 2) = subfld.Files.Count & " Files"
Cells(l, 10) = subfld.Files.Count
Cells(l, 11) = subfld.Name
Cells(l, 12) = subfld.Size
For Each Fil In subfld.Files
'überspringt unerwünschte Datei Typen!
Txt = LCase(Fil.Name): If InStr(Txt, ".ini") Then GoTo ny
If InStr(Txt, ".jpg") Or InStr(Txt, ".lnk") Then GoTo ny
If InStr(Txt, ".txt") Or InStr(Txt, ".pdf") Then GoTo ny
If InStr(Txt, ".xls") Or InStr(Txt, ".doc") Then GoTo ny
Set objFolderItem = objFolder.ParseName(Fil.Name)
If Not objFolder Is Nothing Then
z = z + 1:  f = f + 1
Cells(z, 3) = "   " & Fil.Name
Cells(z, 4) = Mid(Fil.Name, InStrRev(Fil.Name, ".") + 1, 8)
Cells(z, 5) = Fil.Size
Cells(z, 6) = Fil.DateLastAccessed
'Video/ MP3 Laufzeit und Bitrate auflisten
'Cells(z, 7) = objFolder.GetDetailsOf(objFolderItem, 27)   '21
'Cells(z, 8) = objFolder.GetDetailsOf(objFolderItem, 28)   '22
'hier Dateieigenschaften selbst auspobieren!
For j = 3 To 36
Cells(z, j + 5) = objFolder.GetDetailsOf(objFolderItem, j)
Next j
ny:         End If
Next
Call RecursiveFolderProp(subfld, 1)
nx:     'überspringen
Next
Application.StatusBar = Empty
Exit Sub
Fehler:  fe = fe + 1
Cells(z, 9) = Error()
[c3] = fe & "  Fehler"
[c4] = subfld.Name
Application.ScreenUpdating = True
ok = MsgBox(subfld.Name & Chr(10) & Error(), vbOKCancel)
If ok = vbOK Then Resume Next
End Sub

Anzeige
AW: Dateieigenschaften auslesen
01.01.2021 11:53:30
Nepumuk
Hallo Wolfgang,
teste mal:
Option Explicit

Public Sub DateienAuflisten()
    
    Dim objShell As Object, objFolder As Object, objFile As Object
    Dim lngIndex As Long, lngColumn As Long, lngRow As Long
    Dim astrFolders() As String, strFolder As String, strFilename As String
    Dim ialngFolders As Long
    
    strFolder = ThisWorkbook.Worksheets("Dateiliste_Expert").Cells(1, 2).Value
    If Right$(strFolder, 1) <> "\" Then strFolder = strFolder & "\"
    
    Set objShell = CreateObject(Class:="Shell.Application")
    Set objFolder = objShell.Namespace(CVar(strFolder))
    
    lngColumn = 3
    lngRow = 3
    
    For lngIndex = 0 To 400
        Cells(1, lngColumn + lngIndex) = objFolder.GetDetailsOf(Empty, lngIndex)
    Next
    
    astrFolders = GetFolders(strFolder)
    
    Call QuickSort(LBound(astrFolders), UBound(astrFolders), astrFolders)
    
    For ialngFolders = LBound(astrFolders) To UBound(astrFolders)
        
        Set objFolder = objShell.Namespace(CVar(astrFolders(ialngFolders)))
        
        strFilename = Dir$(astrFolders(ialngFolders) & "*.*")
        
        Do Until strFilename = vbNullString
            
            Cells(lngRow, 1).Value = strFilename
            
            With objFolder
                
                Set objFile = .ParseName(strFilename)
                
                For lngIndex = 0 To 400
                    
                    Cells(lngRow, lngColumn + lngIndex) = .GetDetailsOf(objFile, lngIndex)
                    
                Next
            End With
            
            lngRow = lngRow + 1
            
            strFilename = Dir$
            
        Loop
    Next
    
    Set objFile = Nothing
    Set objFolder = Nothing
    Set objShell = Nothing
    
End Sub

Private Function GetFolders(ByVal pvstrPath As String) As String()
    Dim astrFolders() As String
    Dim strFolder As String, strPath As String
    Dim ialngIndex1 As Long, ialngIndex2 As Long
    Redim Preserve astrFolders(ialngIndex1)
    astrFolders(ialngIndex1) = pvstrPath
    ialngIndex1 = 1
    ialngIndex2 = 1
    strPath = pvstrPath
    Do
        strFolder = Dir$(PathName:=strPath & "*", Attributes:=vbDirectory)
        Do Until strFolder = vbNullString
            If strFolder <> "." And strFolder <> ".." Then
                If GetAttr(PathName:=strPath & strFolder) And vbDirectory Then
                    Redim Preserve astrFolders(0 To ialngIndex1)
                    astrFolders(ialngIndex1) = strPath & strFolder & "\"
                    ialngIndex1 = ialngIndex1 + 1
                End If
            End If
            strFolder = Dir$
        Loop
        If ialngIndex1 = ialngIndex2 Then Exit Do
        strPath = astrFolders(ialngIndex2)
        ialngIndex2 = ialngIndex2 + 1
    Loop
    GetFolders = astrFolders
End Function

Private Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUBound As Long, ByRef pvastrArray() As String)
    Dim lngIndex1 As Long, lngIndex2 As Long
    Dim strTemp As String, strBuffer As String
    lngIndex1 = pvlngLBound
    lngIndex2 = pvlngUBound
    strBuffer = pvastrArray(Fix(lngIndex1 + lngIndex2) / 2)
    Do
        Do While pvastrArray(lngIndex1) < strBuffer
            lngIndex1 = lngIndex1 + 1
        Loop
        Do While strBuffer < pvastrArray(lngIndex2)
            lngIndex2 = lngIndex2 - 1
        Loop
        If lngIndex1 <= lngIndex2 Then
            strTemp = pvastrArray(lngIndex1)
            pvastrArray(lngIndex1) = pvastrArray(lngIndex2)
            pvastrArray(lngIndex2) = strTemp
            lngIndex1 = lngIndex1 + 1
            lngIndex2 = lngIndex2 - 1
        End If
    Loop Until lngIndex1 > lngIndex2
    If pvlngLBound < lngIndex2 Then Call QuickSort(pvlngLBound, lngIndex2, pvastrArray)
    If lngIndex1 < pvlngUBound Then Call QuickSort(lngIndex1, pvlngUBound, pvastrArray)
End Sub

Gruß
Nepumuk
Anzeige
AW: Dateieigenschaften auslesen
01.01.2021 15:39:39
Wolfgang
Hallo Piet und Nepumuk, Danke für eure schnellen Antworten.
@Nepumuk:
Habe deinen Code ausprobiert. Er funktioniert gut, fast zu gut :)
nach kleinen Änderungen mit Zellzuweisung listet er mir ALLES an Eigenschaften auf, wirklich alles.
Habe den Eigenschaften Nummern (bei 0 startend) zugewiesen und brauche nur
0 = Dateiname
1 = Größe
27 = Länge
191 = Ordnerpfad
eine Kleinigkeit die mir aufgefallen ist, wenn ich direkt ein Laufwerk angebe, (z.B. D:) dann gibt er mir eine Fehlermeldung "Dateiname oder -nummer falsch" retour. Gebe ich D:\Unterordner an, listet er auf.
PS: habe eine Testdatei hochgeladen:
https://www.herber.de/bbs/user/142690.xlsm
Gruß
Wolfgang
PPS: Euch beiden ein Gutes neues Jahr 2021
Anzeige
AW: Dateieigenschaften auslesen
01.01.2021 18:46:31
Wolfgang
Hallo Nepumuk
Das einzig was jetzt noch verwundert, war dass ich einen Laufzeitfehler im Modul bekam, konnte dies mit einem Errorhandler aber "skippen".
Denke das Modul hat Probleme mit versteckten Systemordnern.
AW: Dateieigenschaften auslesen
01.01.2021 18:48:44
Nepumuk
Hallo Wolfgang,
kann ich natürlich nicht nachvollziehen.
Gruß
Nepumuk
AW: Dateieigenschaften auslesen
02.01.2021 12:45:55
Piet
Hallo Wolfgang
anstelle der For Next 0 To 400 solltest du den unteren Code verwenden. Der listet dir nur die Dateieigenschaften auf um die es dir geht! Und das in Spalten direkt nebeneinander, wo du nicht 325 Spalten ausblenden must! Vor allem wenn du ein ganzes Laufwerk auflisten willst ist es unsinnig für jede Datei alle 400 Dateieigenschaften jedesmal abzufragen!
In meinem Programm findest du Sprungbefehle WEGEN Systemordnern, wie "System Volume Information" oder "RECEYCLE", oder "Local Disk". Die sind nicht auf jedem Laufwerk drauf, stören aber dıe Array Abfrage von Nepumuk! Mit meinem Programm kannst du herausfinden wie diese Ordner ggf. heissen, sie werden als Laufzeitfehler in Spalte G angezeigt! Diese Ordner must du dann im Code von Nepumuk überspringen!
mfg Piet
                    Cells(lngRow, lngColumn + 0) = .GetDetailsOf(objFile, 0)
Cells(lngRow, lngColumn + 1) = .GetDetailsOf(objFile, 1)
Cells(lngRow, lngColumn + 2) = .GetDetailsOf(objFile, 27)
Cells(lngRow, lngColumn + 3) = .GetDetailsOf(objFile, 197)

Anzeige
AW: Dateieigenschaften auslesen
02.01.2021 17:10:29
Wolfgang
Hallo Piet
Danke für die Info, Das Array von Nepumuk in der letzten Version sieht vor nur die gewollten Nummern der Dateieigenschaften zu verwenden, ist somit beliebig erweiterbar, die Reihenfolge der Nummer sieht die Spalte vor in der die Eigenschaft dargestellt wird.
Das mit der Systemvolumeinformation dachte ich mir dass diese ein Problem darstellt. ein Simpler "On Error Resume Next" hat dies allerdings aus der Welt geschafft (Ich weiß solche Errorhandler können problematisch sein).
Euch beiden nochmals Danke für die Hilfe.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige