Datenabgleich 1000+ *.xlsx files
09.05.2018 11:36:16
David
durch einen Arbeitskollegen habe ich den Tipp bekommen in diesem Forum Hilfe zu suchen da unsere VBA Profis nicht weiter wissen....
Folgende Aufgabenstellung:
In einem Ordner in unserem Netzwerklaufwerk ist für jeden Artikel ein Ordner angelegt. Dieser kann 1 oder mehrere Unterordner haben. In diesem/n Unterordner/n ist ein Festgelegtes Benennungsschema vorhanden (wenigstens dort).
Ich muss jeden der Unterordner nach *.xlsx Dateien durchsuchen. Falls vorhanden, öffnen und kontrollieren ob in Zelle "II" ein bestimmter Text steht.
Falls ja: Text aus Zelle C6 und C9 (Oder Ordnername) nebeneinander in ein Sheet schreiben mit der Bemerkung "Vorhanden"
Falls Nein: Ordnernamen des ersten Unterordners in ein Sheet schreiben und die Bemerkung "Nicht vorhanden" dazuschreiben.
Warum der Ordnername? Produktnummern sind ausschließlich numerisch und treffen, zum glück, immer zu (in Bezug auf Richtigkeit der Daten) weshalb der Ordnername zur Identifikation genutzt werden kann.
Beispiel:
...\Produkte\1234567\Lieferant1\PPAP\*.xlsx (die die ich benötige)
...\Produkte\1234567\Lieferant2\PPAP\ (LEER)
...\Produkte\7654321\Lieferant1\PPAP\*.PDF
...\Produkte\7654321\Lieferant1\PPAP\*.xlsx (eine andere Datei)
Ich hoffe ich konnte das verständlich erklären!
z.Z. arbeite ich mit FSO und einer sich selbst aufrufenden Funktion.
Sub ListFolders(SourceFolderName As String)
Dim FSO As Object
Dim SourceFolder As Object
Dim SubFolder As Object
Dim r As Long
Dim strfile As String
Dim wb As Workbook
Dim ThisSheet As Worksheet
Dim thiswb As Workbook
Set ThisSheet = Workbooks("WorkInstruction Masscheck.xlsm").Worksheets("Tabelle1")
Set thiswb = Workbooks("WorkInstruction Masscheck.xlsm")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.GetFolder(SourceFolderName)
On Error Resume Next
iColumn = iColumn + 1
thiswb.ThisSheet.Cells.Offset(1).Select
With Cells(ActiveCell.Row, iColumn)
If IsNumeric(SourceFolder.Name) = True Then
.Formula = SourceFolder.Name
End If
.Font.ColorIndex = 11
.Font.Bold = True
.Select
End With
strfile = Dir(SourceFolder.Path & "\*.*")
If strfile vbNullString Then
thiswb.ThisSheet.ActiveCell.Offset(0, 1).Select
Do While strfile vbNullString
thiswb.ThisSheet.ActiveCell.Offset(1).Select
If Right(strfile, 4) = "xlsx" Then
wb = Workbooks.Open(SourceFolder.Path & "\" & strfile, ReadOnly:=True)
thiswb.ThisSheet.ActiveCell.Value = wb.Worksheets(1).Range("I1")
Workbooks(strfile).Close
End If
'ThisSheet.ActiveCell.Value = strfile
strfile = Dir
'Workbooks(strfile).Close
Loop
thiswb.ThisSheet.ActiveCell.Offset(0, -1).Select
End If
For Each SubFolder In SourceFolder.SubFolders
ListFolders SubFolder.Path, True
iColumn = iColumn - 1
Next SubFolder
Set SubFolder = Nothing
Set SourceFolder = Nothing
Set FSO = Nothing
End Sub
Sub testfunc()"...\Produkte\"
End Sub
z.Z. befinden sich einige patchworks im Code daher etwas unsauber und nicht mehr ganz rein zielführend. Aber der Grundsatz sollte erkennbar sein.
Für Ideen zu anderen Vorgehensweisen bin ich ebenfalls sehr dankbar. (Die Runtime beträgt z. Z. 7h+).