Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1944to1948
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

Doppelte in Excel einlesen aus Netzwerkverzeichnis

Doppelte in Excel einlesen aus Netzwerkverzeichnis
25.08.2023 12:31:19
marcus
Hallo Forumsmitglieder,

Habe einen Code der mir aus Netzwerkordner nur die doppelten Dateien in Excel einlesen soll.

Habe zwar die doppelten aber auch die unikate werden eingelesen, komme nicht darauf warum.

Kann jemand von euch da mal darauf schauen.

Option Explicit
Sub ReadFilesAndFilterDuplicates()
Dim strPath As String
Dim objFSO As Object
Dim objFolder As Object
Dim wsDup As Worksheet
Dim fileNameList As Object
Dim iRowDup As Long

' Dialogfeld zum Öffnen eines Netzwerkordners anzeigen
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Netzwerkordner auswählen doppelte Dateien"
If .Show = -1 Then
strPath = .SelectedItems(1)
Else
Exit Sub
End If
End With

' Objekte erstellen und initialisieren
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strPath)
Set fileNameList = CreateObject("Scripting.Dictionary")

' Neues Tabellenblatt für Duplikate erstellen
Set wsDup = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
wsDup.Name = "Duplikate_" & Format(Now(), "dd_mm_yyyy_hh_mm_ss")

' Überschriften einfügen
wsDup.Range("A1").Value = "Dateiname"
wsDup.Range("B1").Value = "Dateiverzeichnis"
wsDup.Range("C1").Value = "Erstelldatum"
wsDup.Range("D1").Value = "Änderungsdatum"
wsDup.Range("E1").Value = "Eingelesen am"
wsDup.Range("F1").Value = "Grösse in KB"
wsDup.Range("G1").Value = "Letzter Zugriff"
wsDup.Range("H1").Value = "Löschen mit x"
wsDup.Range("I1").Value = "Alter"
wsDup.Range("J1").Value = "Dateityp"

' Überschriften formatieren
wsDup.Range("A1:J1").Font.Bold = True

iRowDup = 2
Application.StatusBar = "Einlesen des Verzeichnisses läuft. Bitte warten..."

' Schleife für Dateien im Hauptverzeichnis durchführen
Dim objFile As Object
For Each objFile In objFolder.Files
ProcessFile objFile, objFSO, wsDup, fileNameList, iRowDup
Next objFile

' Schleife für Dateien in Unterordnern durchführen
ReadFilesAndFilterByDateAndCopyDuplicates objFSO, objFolder, iRowDup, wsDup, fileNameList

Application.StatusBar = False

' Entferne leere Zeilen in der Tabelle "Duplikate"
RemoveEmptyRows wsDup

' Tabellenblatt "Duplikate" formatieren
wsDup.Columns("A:G").AutoFit
wsDup.Columns("C:E").NumberFormat = "dd.mm.yyyy hh:mm:ss"
wsDup.Columns("F:F").NumberFormat = "0.00"
wsDup.Columns("H:H").ColumnWidth = 14
wsDup.Columns("H").HorizontalAlignment = xlCenter
wsDup.Columns("H").Font.Color = RGB(255, 0, 0)
wsDup.Rows("1:1").AutoFilter

' Spalte I (Alter) mit Textausgabe füllen
FillColumnWithAgeInfo wsDup

' Spalte J (Dateityp) mit Dateityp füllen
FillColumnWithFileTypes wsDup

MsgBox "Verzeichnis erfolgreich eingelesen.", vbInformation, "Einlesen abgeschlossen"
End Sub
Sub ProcessFile(ByVal objFile As Object, ByVal objFSO As Object, ByVal wsDup As Worksheet, ByRef fileNameList As Object, ByRef iRowDup As Long)
Dim fileSizeKB As Double
Dim fileCreateDate As Date
Dim fileModifyDate As Date
Dim fileLastAccessDate As Date

' Dateiinformationen abrufen
fileSizeKB = objFile.Size / 1024 ' Größe in KB umrechnen
fileCreateDate = objFile.DateCreated
fileModifyDate = objFile.DateLastModified
fileLastAccessDate = objFile.DateLastAccessed

' Überprüfen, ob die Datei bereits in der Liste vorhanden ist
If FileNameExistsInList(fileNameList, objFile.Name) Then
' Datei ist doppelt, in wsDup einfügen
wsDup.Cells(iRowDup, 1).Value = objFile.Name
wsDup.Hyperlinks.Add _
Anchor:=wsDup.Cells(iRowDup, 1), _
Address:=objFile.Path, _
TextToDisplay:=objFile.Name ' Hyperlink erstellen

wsDup.Cells(iRowDup, 2).Value = objFSO.GetParentFolderName(objFile.Path)
wsDup.Cells(iRowDup, 3).Value = fileCreateDate
wsDup.Cells(iRowDup, 4).Value = fileModifyDate
wsDup.Cells(iRowDup, 5).Value = Format(Now(), "dd.mm.yyyy hh:mm:ss")
wsDup.Cells(iRowDup, 6).Value = fileSizeKB / 1024
wsDup.Cells(iRowDup, 7).Value = fileLastAccessDate

' Dropdown-Feld für Löschen mit x hinzufügen
With wsDup.Cells(iRowDup, 8).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="x"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = True
.ShowError = True
End With

iRowDup = iRowDup + 1
Else
' Wenn der Dateiname nicht in der Liste vorhanden ist, füge ihn der Liste hinzu
fileNameList.Add objFile.Name, 0
End If
End Sub
Sub ReadFilesAndFilterByDateAndCopyDuplicates(ByVal objFSO As Object, ByVal objFolder As Object, ByRef iRowDup As Long, ByVal wsDup As Worksheet, ByRef fileNameList As Object)
Dim objFile As Object
Dim fileSizeKB As Double
Dim fileCreateDate As Date
Dim fileModifyDate As Date
Dim fileLastAccessDate As Date
Dim subFolder As Object ' Variable für Unterordner definieren

' Schleife für alle Dateien im aktuellen Ordner durchführen
For Each objFile In objFolder.Files
' Dateiinformationen abrufen
fileSizeKB = objFile.Size / 1024 ' Größe in KB umrechnen
fileCreateDate = objFile.DateCreated
fileModifyDate = objFile.DateLastModified
fileLastAccessDate = objFile.DateLastAccessed

' Überprüfen, ob die Datei bereits in der Liste vorhanden ist
If FileNameExistsInList(fileNameList, objFile.Name) Then
' Datei ist doppelt, in wsDup einfügen
wsDup.Cells(iRowDup, 1).Value = objFile.Name
wsDup.Hyperlinks.Add _
Anchor:=wsDup.Cells(iRowDup, 1), _
Address:=objFile.Path, _
TextToDisplay:=objFile.Name ' Hyperlink erstellen

wsDup.Cells(iRowDup, 2).Value = objFSO.GetParentFolderName(objFile.Path)
wsDup.Cells(iRowDup, 3).Value = fileCreateDate
wsDup.Cells(iRowDup, 4).Value = fileModifyDate
wsDup.Cells(iRowDup, 5).Value = Format(Now(), "dd.mm.yyyy hh:mm:ss")
wsDup.Cells(iRowDup, 6).Value = fileSizeKB / 1024
wsDup.Cells(iRowDup, 7).Value = fileLastAccessDate

' Dropdown-Feld für Löschen mit x hinzufügen
With wsDup.Cells(iRowDup, 8).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="x"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = True
.ShowError = True
End With

iRowDup = iRowDup + 1
Else
' Wenn der Dateiname nicht in der Liste vorhanden ist, füge ihn der Liste hinzu
fileNameList.Add objFile.Name, 0
End If
Next objFile

' Schleife für alle Unterordner durchführen
On Error Resume Next ' Fehlerbehandlung aktivieren
For Each subFolder In objFolder.SubFolders
ReadFilesAndFilterByDateAndCopyDuplicates objFSO, subFolder, iRowDup, wsDup, fileNameList
Next subFolder
On Error GoTo 0 ' Fehlerbehandlung ausschalten
End Sub

Function FileNameExistsInList(ByRef fileNameList As Object, ByVal fileName As String) As Boolean
On Error Resume Next
FileNameExistsInList = fileNameList.Exists(fileName)
On Error GoTo 0
End Function

Sub RemoveEmptyRows(ByVal ws As Worksheet)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

' Schleife zum Löschen der leeren Zeilen
If lastRow > 1 Then
Dim I As Long
For I = lastRow To 2 Step -1
If ws.Cells(I, 1).Value = "" Then
ws.Rows(I).EntireRow.Delete
End If
Next I
End If
End Sub
Sub FillColumnWithAgeInfo(ByVal ws As Worksheet)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

' Schleife zum Befüllen der Spalte I (Alter)
If lastRow > 1 Then
Dim I As Long
For I = 2 To lastRow
Dim modifyDate As Date
modifyDate = ws.Cells(I, 4).Value
If modifyDate DateAdd("yyyy", -11, Date) Then
ws.Cells(I, 9).Value = "> 11 Jahre"
ElseIf modifyDate DateAdd("yyyy", -2, Date) Then
ws.Cells(I, 9).Value = "> 2 Jahre"
Else
ws.Cells(I, 9).Value = ""
End If
Next I
End If
End Sub
Sub FillColumnWithFileTypes(ByVal ws As Worksheet)
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

' Schleife zum Befüllen der Spalte J (Dateityp)
If lastRow > 1 Then
Dim I As Long
For I = 2 To lastRow
ws.Cells(I, 10).Value = Right(ws.Cells(I, 1).Value, Len(ws.Cells(I, 1).Value) - InStrRev(ws.Cells(I, 1).Value, "."))
Next I
End If
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Doppelte in Excel einlesen aus Netzwerkverzeichnis
25.08.2023 13:15:07
Matthias
Moin!
Also m.E. liest du (zumindest den Startordner) zweimal aus.
Zuerst in Sub ReadFilesAndFilterDuplicates()
Dim objFile As Object
For Each objFile In objFolder.Files
ProcessFile objFile, objFSO, wsDup, fileNameList, iRowDup
Next objFile

Dann soll eigentlich dass passier - ' Schleife für Dateien in Unterordnern durchführen - zumindest hast du es so im Code.

Dort rufst du in Sub ReadFilesAndFilterByDateAndCopyDuplicates
am Anfang aber keinen Unterordner auf, sondern läufst nochmal durch den übergebenen Ordner. Den hast du ja aber schon mal ausgelesen. Beim ersten Auslesen kamen dabei alle Dateien in deine fileNameList und sind somit beim zweiten Auslesen ein Duplikat. Der Unterordner wird erst am Ende nochmal aufgerufen und übergeben.
Ich würde in der Startprozedur einfach die Unterordner mit durchlaufen und die mit in Processfile abarbeiten. ODer du nimmst an Stelle von Processfile nur die ReadFile... . Die am Anfang einmal aufrufen. Damit werden dann ja der Startordner und die Unterordner ausgelesen.
VG
Anzeige
AW: Doppelte in Excel einlesen aus Netzwerkverzeichnis
25.08.2023 14:42:11
Rudi Maintaire
Hallo,
das liest, wenn auch mit weniger Informationen, nur Duplikate und ist erheblich kompakter:
Option Explicit

Dim FSO As Object

Sub DateiListe()
Dim oFolder As Object, oDictF As Object, oObj, Tmp, iCounter As Long, arrOUT()
Dim strFolder As String, wksListe As Worksheet
Dim j As Integer
Application.ScreenUpdating = False

With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Ordner wählen"
.AllowMultiSelect = False
If .Show = -1 Then
strFolder = .SelectedItems(1)
End If
End With

If strFolder = "" Then Exit Sub

Set FSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = FSO.GetFolder(strFolder)
Set oDictF = CreateObject("Scripting.dictionary")

prcFiles oFolder, oDictF
prcSubFolders oFolder, oDictF

On Error Resume Next
Set wksListe = ThisWorkbook.Sheets("DateiListe")
On Error GoTo 0
If wksListe Is Nothing Then
Set wksListe = Worksheets.Add(before:=Sheets(1))
wksListe.Name = "DateiListe"
End If

For Each oObj In oDictF
Tmp = Split(oDictF(oObj), "|")
If UBound(Tmp) = 1 Then
oDictF.Remove (oObj)
Else
iCounter = iCounter + UBound(Tmp)
End If
Next

If oDictF.Count Then
ReDim arrOUT(1 To iCounter, 1 To 2)
iCounter = 0
For Each oObj In oDictF
Tmp = Split(oDictF(oObj), "|")
For j = 1 To UBound(Tmp)
iCounter = iCounter + 1
arrOUT(iCounter, 1) = oObj
arrOUT(iCounter, 2) = Tmp(j)
Next
Next
With wksListe
.Cells.Clear
.Cells(1, 1) = "Datei"
.Cells(1, 2) = "Pfad"
.Cells(2, 1).Resize(iCounter, 2) = arrOUT
.Columns.AutoFit
End With
Else
MsgBox "Keine doppelten"
End If
End Sub

Sub prcFiles(oFolder, oDictF)
Dim oFile As Object ', sEXT As String
For Each oFile In oFolder.Files
With oFile
oDictF(.Name) = oDictF(.Name) & "|" & oFile
End With
Next
End Sub

Sub prcSubFolders(oFolder, oDictF)
Dim oSubFolder As Object
For Each oSubFolder In oFolder.SubFolders
prcFiles oSubFolder, oDictF
prcSubFolders oSubFolder, oDictF
Next
End Sub

Gruß
Rudi
Anzeige
AW: Doppelte in Excel einlesen aus Netzwerkverzeichnis
25.08.2023 15:18:23
marcus
Hallo Rudi,
vielen Dank werden ich noch testen und an meine vorgaben ausbauen
AW: Doppelte in Excel einlesen aus Netzwerkverzeichnis
25.08.2023 14:25:59
marcus
Hallo Matthias,

kannst du diesen Code auf so zusammenstellen, bin gerade auf den schlauch.
Vielen Dank im Voraus

Sub ReadFilesAndFilterDuplicates()
Dim strPath As String
Dim objFSO As Object
Dim objFolder As Object
Dim wsDup As Worksheet
Dim fileNameList As Object
Dim iRowDup As Long

' Dialogfeld zum Öffnen eines Ordners anzeigen
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Ordner auswählen für die Suche nach doppelten Dateien"
If .Show = -1 Then
strPath = .SelectedItems(1)
Else
Exit Sub
End If
End With

' Objekte erstellen und initialisieren
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strPath)
Set fileNameList = CreateObject("Scripting.Dictionary")

' Neues Tabellenblatt für Duplikate erstellen
Set wsDup = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
wsDup.Name = "Duplikate_" & Format(Now(), "dd_mm_yyyy_hh_mm_ss")

' Überschriften einfügen
wsDup.Range("A1").Value = "Dateiname"
wsDup.Range("B1").Value = "Dateiverzeichnis"
wsDup.Range("C1").Value = "Erstelldatum"
wsDup.Range("D1").Value = "Änderungsdatum"
wsDup.Range("E1").Value = "Eingelesen am"
wsDup.Range("F1").Value = "Grösse in KB"
wsDup.Range("G1").Value = "Letzter Zugriff"
wsDup.Range("H1").Value = "Löschen mit x"
wsDup.Range("I1").Value = "Alter"
wsDup.Range("J1").Value = "Dateityp"

' Überschriften formatieren
wsDup.Range("A1:J1").Font.Bold = True

iRowDup = 2
Application.StatusBar = "Einlesen des Verzeichnisses läuft. Bitte warten..."

' Schleife für Dateien in Hauptverzeichnis und Unterordnern durchführen
ReadFilesAndFilterByDateAndCopyDuplicatesRecursively objFSO, objFolder, wsDup, fileNameList, iRowDup

Application.StatusBar = False

' Entferne leere Zeilen in der Tabelle "Duplikate"
RemoveEmptyRows wsDup

' Tabellenblatt "Duplikate" formatieren
wsDup.Columns("A:G").AutoFit
wsDup.Columns("C:E").NumberFormat = "dd.mm.yyyy hh:mm:ss"
wsDup.Columns("F:F").NumberFormat = "0.00"
wsDup.Columns("H:H").ColumnWidth = 14
wsDup.Columns("H").HorizontalAlignment = xlCenter
wsDup.Columns("H").Font.Color = RGB(255, 0, 0)
wsDup.Rows("1:1").AutoFilter

' Spalte I (Alter) mit Textausgabe füllen
FillColumnWithAgeInfo wsDup

' Spalte J (Dateityp) mit Dateityp füllen
FillColumnWithFileTypes wsDup

MsgBox "Verzeichnis erfolgreich eingelesen.", vbInformation, "Einlesen abgeschlossen"
End Sub

Sub ProcessFile(ByVal objFile As Object, ByVal objFSO As Object, ByVal wsDup As Worksheet, ByRef fileNameList As Object, ByRef iRowDup As Long)
Dim fileSizeKB As Double
Dim fileCreateDate As Date
Dim fileModifyDate As Date
Dim fileLastAccessDate As Date

' Dateiinformationen abrufen
fileSizeKB = objFile.Size / 1024 ' Größe in KB umrechnen
fileCreateDate = objFile.DateCreated
fileModifyDate = objFile.DateLastModified
fileLastAccessDate = objFile.DateLastAccessed

' Datei ist doppelt, in wsDup einfügen
wsDup.Cells(iRowDup, 1).Value = objFile.Name
wsDup.Hyperlinks.Add _
Anchor:=wsDup.Cells(iRowDup, 1), _
Address:=objFile.Path, _
TextToDisplay:=objFile.Name ' Hyperlink erstellen

wsDup.Cells(iRowDup, 2).Value = objFSO.GetParentFolderName(objFile.Path)
wsDup.Cells(iRowDup, 3).Value = fileCreateDate
wsDup.Cells(iRowDup, 4).Value = fileModifyDate
wsDup.Cells(iRowDup, 5).Value = Format(Now(), "dd.mm.yyyy hh:mm:ss")
wsDup.Cells(iRowDup, 6).Value = fileSizeKB / 1024
wsDup.Cells(iRowDup, 7).Value = fileLastAccessDate

' Dropdown-Feld für Löschen mit x hinzufügen
With wsDup.Cells(iRowDup, 8).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="x"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = True
.ShowError = True
End With

iRowDup = iRowDup + 1
' Dateiname zur Liste hinzufügen, um doppelte Dateien zu erkennen
' fileNameList.Add objFile.Name, 0
End Sub

Sub ReadFilesAndFilterByDateAndCopyDuplicates()
Dim objFile As Object
Dim fileSizeKB As Double
Dim fileCreateDate As Date
Dim fileModifyDate As Date
Dim fileLastAccessDate As Date
Dim subFolder As Object ' Variable für Unterordner definieren

' Schleife für alle Dateien im aktuellen Ordner durchführen
For Each objFile In objFolder.Files
' Dateiinformationen abrufen
fileSizeKB = objFile.Size / 1024 ' Größe in KB umrechnen
fileCreateDate = objFile.DateCreated
fileModifyDate = objFile.DateLastModified
fileLastAccessDate = objFile.DateLastAccessed

' Überprüfen, ob die Datei bereits in der Liste vorhanden ist
If FileNameExistsInList(fileNameList, objFile.Name) Then
' Datei ist doppelt, in wsDup einfügen
wsDup.Cells(iRowDup, 1).Value = objFile.Name
wsDup.Hyperlinks.Add _
Anchor:=wsDup.Cells(iRowDup, 1), _
Address:=objFile.Path, _
TextToDisplay:=objFile.Name ' Hyperlink erstellen

wsDup.Cells(iRowDup, 2).Value = objFSO.GetParentFolderName(objFile.Path)
wsDup.Cells(iRowDup, 3).Value = fileCreateDate
wsDup.Cells(iRowDup, 4).Value = fileModifyDate
wsDup.Cells(iRowDup, 5).Value = Format(Now(), "dd.mm.yyyy hh:mm:ss")
wsDup.Cells(iRowDup, 6).Value = fileSizeKB / 1024
wsDup.Cells(iRowDup, 7).Value = fileLastAccessDate

' Dropdown-Feld für Löschen mit x hinzufügen
' With wsDup.Cells(iRowDup, 8).Validation
' .Delete
' .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
' xlBetween, Formula1:="x"
' .IgnoreBlank = True
' .InCellDropdown = True
' .ShowInput = True
' .ShowError = True
' End With

iRowDup = iRowDup + 1
Else
' Wenn der Dateiname nicht in der Liste vorhanden ist, füge ihn der Liste hinzu
fileNameList.Add objFile.Name, 0
End If
Next objFile


' Schleife für alle Unterordner durchführen
On Error Resume Next ' Fehlerbehandlung aktivieren
For Each subFolder In objFolder.SubFolders
ReadFilesAndFilterByDateAndCopyDuplicatesRecursively objFSO, subFolder, wsDup, fileNameList, iRowDup
Next subFolder
On Error GoTo 0 ' Fehlerbehandlung ausschalten
End Sub
Sub ReadFilesAndFilterByDateAndCopyDuplicatesRecursively(ByVal objFSO As Object, ByVal objFolder As Object, ByRef wsDup As Worksheet, ByRef fileNameList As Object, ByRef iRowDup As Long)
Dim objFile As Object
Dim subFolder As Object

' Schleife für Dateien im aktuellen Ordner durchführen
For Each objFile In objFolder.Files
ProcessFile objFile, objFSO, wsDup, fileNameList, iRowDup
Next objFile

' Schleife für alle Unterordner durchführen
For Each subFolder In objFolder.SubFolders
ReadFilesAndFilterByDateAndCopyDuplicatesRecursively objFSO, subFolder, wsDup, fileNameList, iRowDup
Next subFolder
End Sub




Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige