rogerschnufi
Goto Top

Excel 2016 VBA Dateiliste aus Excel in Laufwerk Verzeichnisse vergleichen und Hyperlinks generieren bei gefunden und kopieren

Hallo Zusammen,

ich benötige dringend eure Unterstützung, ich kaum VBA Erfahrung habe. Ich benutze Excel 2016.

Ich habe ein Excel mit einer Spalte ab Zelle A5 mit tausenden von Dateiennamen, welche nun in mehreren Laufwerken oder in bestimmten Verzeichnissen (inkl deren Unterverzeichnisse) suchen möchte.

Sozusagen so
etnweder die Dateiname suche in den Laufwerkern A und C oder auch in Laufwerk C innerhalb eines bestimmten Vereichnisses suchen, dabei alle darin enthaltenen Unterverzeichnisse mitberücksichtigenl.

Die allfällige gefundenen Dateien in einem LW/Verzeichnisse soll dann in der Spalte E mit einer URL (Laufwerk/Verzeichnis/Unterverzeichnissenamen) hinzugefügt werden.

Diese gefundene Datei soll dann zusätliche in ein bestimmtes zusätliches Verzeichnis kopiert oder verschoben werrden.

Gruss, Roger

Content-Key: 504041

Url: https://administrator.de/contentid/504041

Printed on: April 19, 2024 at 13:04 o'clock

Mitglied: 141320
Solution 141320 Oct 12, 2019 updated at 15:06:07 (UTC)
Goto Top
Zitat von @RogerSchnufi:
ich benötige dringend eure Unterstützung, ich kaum VBA Erfahrung habe. Ich benutze Excel 2016.
Dringend wollen viele, ohne ein Minimum an Code was du schon probiert hast hat das doch ein Gschmäkle face-confused ala macht mir doch bitte meine Arbeit die ich angenommen habe obwohl ich keine Ahnung davon habe.
Sozusagen so
etnweder die Dateiname suche in den Laufwerkern A und C oder auch in Laufwerk C innerhalb eines bestimmten Vereichnisses suchen, dabei alle darin enthaltenen Unterverzeichnisse mitberücksichtigenl.
Check.
Die allfällige gefundenen Dateien in einem LW/Verzeichnisse soll dann in der Spalte E mit einer URL (Laufwerk/Verzeichnis/Unterverzeichnissenamen) hinzugefügt werden.
"Allfällige"? Fallen die aus dem All oder was? Was soll passieren wenn mehr wie eine Datei gefunden wurde ?? Nebeneinander, untereinander, kreuz und quer??
Diese gefundene Datei soll dann zusätliche in ein bestimmtes zusätliches Verzeichnis kopiert oder verschoben werrden.
Erneut, was soll passieren wenn mehrere Dateien dieses Namens gefunden wurden? Eine überschreibt die andere?? Neuer Dateiname/ neues Verzeichnis??

Also nochmal überdenken und dann nochmal ganz genau beschreiben.

p.s. Google würgen hilft übrigens auch am Samstag
https://stackoverflow.com/questions/30511217/optimize-speed-of-recursive ...
Member: RogerSchnufi
RogerSchnufi Oct 13, 2019 at 07:16:38 (UTC)
Goto Top
Hallo hey sorry, dass ich scheinbar nicht genügend klar ausgedrückt habe und sorry, dass ich kaum Ahnung habe. Das ist ja der Grund wieso ich mich melden.

Anyway, hier mehr detailliert

a) konfigurierbare Parameter ein Laufwerksbuchstaben oder bestimmtes Hauptverzeichnis jeweils Suche inkl. deren Unterverzeichnisse sowie ein Verzeichnis, welche die gefundene Datei kopiert werden soll.

Ich gehe aus Performance Gründen davon aus, es ist einfacher zuerst alle Dateien aus den obigen Laufwerken/Verzeichnisse auslesen und dann erst mit der eigentlichen Dateiliste zu vergleichen, somit

1. Suche alle Dateien in den obigen parametersierten Laufwerken/Verzeichnisse
2. Vergleiceh die gefundenen Dateinamen mit dereren Dateinamen in der Tabelle "Dateiliste" ab A6 bis zum Ende (ca. 15'000 Dateien)

2.1. sind beiden Dateinamen gleich, dann in der Spalten E auf der gleichen Zeile ein Hyperlink des Verzeichnisses generieren
2.2. kopiere oder verschiebe (ggf. auch parametriesierbar) die gefunden Datei in ein parametrisieres Verzeichnis (siehe a)
2.3. schreib dann auch in der Spalte F den Hyperlink mit dem Verzeichnigs/Dateinamen des neuen Ortes
2.4. sind allfällilge doppelte Dateinamen gefunden worden und ist zuvor bereits eine kopiert/verschoeben worden, also die Spalte F bereits befüllt, dann nichts unternehmen (sollte eigentlich nur 1 mal vorkommen)

ist das nun ausführlicher?
Member: RogerSchnufi
RogerSchnufi Oct 13, 2019 at 08:07:48 (UTC)
Goto Top
Habe diesen Code aber folgende Probleme

a) es werden nicht alle Unterverzeichnisse aufgerufen sonder nur auf einem Unterverzeichnis, es sind aber viele weitere unter unter unter verzeichnisse Ebenen vorhanden


Sub Beispielaufruf_fListFiles_Versuch1()

Dim sourceFolder As String
sourceFolder = "C:\temp\Testverzeichnis\Source"

fListFilesTest sourceFolder, True, , "*"

End Sub

Sub fListFilesTest(ByVal sPath As String, _
Optional ByVal bSubfolders As Boolean = False, _
Optional ByVal sFilenameFilter As String = "*", _
Optional ByVal sExtensionFilter As String = "*")

Dim oFS As Object
Dim oFolder As Object
Dim oSubfolder As Object
Dim oFile As Object

Dim targetFolder As String
targetFolder = "C:\temp\Testverzeichnis\Traget\"

Set oFS = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFS.GetFolder(sPath)
For Each oFile In oFolder.Files

If oFile.Name Like sFilenameFilter & "." & sExtensionFilter Then

' ' Dateiendung
' Debug.Print oFS.GetExtensionName(oFile)

' ' Dateiname
' Debug.Print oFS.GetBaseName(oFile)

' ' Laufwerksname
' Debug.Print oFS.GetDriveName(oFile)

' gesamter Pfad
Debug.Print oFile.Path

' ' Pfad
' Debug.Print oFile.ParentFolder

' Dateiname + Endung
Debug.Print oFile.Name

End If

i = 1
iT = 1

BisEndeSpalteA = (ThisWorkbook.Sheets("Dateiliste").Cells(1048576, 1).End(xlUp).Row - 6)
For iT = 1 To BisEndeSpalteA

Debug.Print "Vergleiche S: " & oFile.Name
Debug.Print "Vergleiche T: " & ThisWorkbook.Sheets("Dateiliste").Range("A6").Offset(iT, 0).Value

If ThisWorkbook.Sheets("Dateiliste").Range("A6").Offset(i, 0).Value = oFile.Name Then

'gefundene Dateinamen ab B6 einfügen
ThisWorkbook.Sheets("Dateiliste").Range("B6").Offset(i, 0) = oFile.Name

'gefundenes Verzeichnis ab C6 einfügen
ThisWorkbook.Sheets("Dateiliste").Range("C6").Offset(i, 0) = oFile.Path

'Hyperlink der gefundenen Datei und Verzeichnis ab D6 erstellen
With Worksheets("Dateiliste")
.Hyperlinks.Add Anchor:=.Range("D6").Offset(i, 0), _
Address:=oFile.Path, _
ScreenTip:="Teste URL", _
TextToDisplay:=oFile.Name
End With

'Alternativ verschieben
'oFS.movefile oFile.Path, targetFolder & oFile.Name
'Alternativ kopieren
oFS.copyfile oFile.Path, targetFolder & oFile.Name, True
'Debug.Print "Kopiert nach: " & targetFolder & oFile.Name

End If
i = i + 1
Next iT
Next

If bSubfolders Then
For Each oSubfolder In oFolder.SubFolders
fListFiles oSubfolder
Next
End If

Set oFile = Nothing
Set oSubfolder = Nothing
Set oFolder = Nothing
Set oFS = Nothing
End Sub
Member: RogerSchnufi
RogerSchnufi Oct 13, 2019 at 09:01:30 (UTC)
Goto Top
Sub SucheVergleich()

Dim sourceFolder As String
sourceFolder = "C:\temp\Testverzeichnis\Source"

'Call ClearImmediateWindow

'fListFilesTest sourceFolder, True, , "*"
fListFilesTest sourceFolder, True

End Sub
Sub ClearImmediateWindow()
Application.VBE.Windows("Direktbereich").Visible = True
Application.VBE.Windows("Direktbereich").SetFocus
SendKeys "^{HOME}+^{END}{DEL}", False
End Sub

Sub fListFilesTest(Optional ByVal sPath As String, _
Optional ByVal bSubfolders As Boolean = False, _
Optional ByVal sFilenameFilter As String = "*", _
Optional ByVal sExtensionFilter As String = "*")

'Sub fListFilesTest(ByVal sPath As String, _
' Optional ByVal bSubfolders As Boolean = False, _
' Optional ByVal sFilenameFilter As String = "*", _
' Optional ByVal sExtensionFilter As String = "*")

'sPath = "C:\temp\Testverzeichnis\Source"

Dim oFS As Object
Dim oFolder As Object
Dim oSubfolder As Object
Dim oFile As Object

Dim targetFolder As String
targetFolder = "C:\temp\Testverzeichnis\Target\"

Set oFS = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFS.GetFolder(sPath)
For Each oFile In oFolder.Files

If oFile.Name Like sFilenameFilter & "." & sExtensionFilter Then

Debug.Print "-----------------"
Debug.Print "Datei in LW gefunden"

' ' Dateiendung
' Debug.Print oFS.GetExtensionName(oFile)

' ' Dateiname
' Debug.Print oFS.GetBaseName(oFile)

' ' Laufwerksname
' Debug.Print oFS.GetDriveName(oFile)

' gesamter Pfad
Debug.Print oFile.Path

' ' Pfad
' Debug.Print oFile.ParentFolder

' Dateiname + Endung
Debug.Print oFile.Name
Debug.Print "-----------------"

End If

Call Vergleich(oFile.Name, oFile.Path, targetFolder)

Next

If bSubfolders Then
For Each oSubfolder In oFolder.SubFolders
'Call Vergleich("test", oFolder.SubFolders, targetFolder)
fListFiles oSubfolder
Next
End If

Set oFile = Nothing
Set oSubfolder = Nothing
Set oFolder = Nothing
Set oFS = Nothing
End Sub

Sub Vergleich(fileName As String, filePath As String, Optional targetFolder As String)

Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")

i = 1
iT = 1

BisEndeSpalteA = (ThisWorkbook.Sheets("Dateiliste").Cells(1048576, 1).End(xlUp).Row - 6)
For iT = 1 To BisEndeSpalteA

Debug.Print "Vergleiche S: " & fileName
Debug.Print "Vergleiche T: " & ThisWorkbook.Sheets("Dateiliste").Range("A6").Offset(iT, 0).Value

If ThisWorkbook.Sheets("Dateiliste").Range("A6").Offset(i, 0).Value = fileName Then

'gefundene Dateinamen ab B6 einfügen
ThisWorkbook.Sheets("Dateiliste").Range("B6").Offset(i, 0) = fileName

'gefundenes Verzeichnis ab C6 einfügen
ThisWorkbook.Sheets("Dateiliste").Range("C6").Offset(i, 0) = filePath

'Hyperlink der gefundenen Datei und Verzeichnis ab D6 erstellen
With Worksheets("Dateiliste")
.Hyperlinks.Add Anchor:=.Range("D6").Offset(i, 0), _
Address:=filePath, _
ScreenTip:="Teste URL", _
TextToDisplay:=fileName
End With

'Alternativ verschieben
'oFS.movefile oFile.Path, targetFolder & oFile.Name
'Alternativ kopieren
oFS.copyfile filePath, targetFolder & fileName, True

Debug.Print "---------------------------------------"
Debug.Print "Kopiert nach: " & targetFolder & fileName
Debug.Print "---------------------------------------"

'MsgBox "Gefunden: " & targetFolder & fileName

'TARGET - kopiertes Verzeichnis ab E6 einfügen
ThisWorkbook.Sheets("Dateiliste").Range("E6").Offset(i, 0) = targetFolder

'TARGET - Hyperlink der kopierten Datei und Verzeichnis ab F6 erstellen
With Worksheets("Dateiliste")
.Hyperlinks.Add Anchor:=.Range("F6").Offset(i, 0), _
Address:=targetFolder, _
ScreenTip:="Teste URL", _
TextToDisplay:=fileName
End With

End If
i = i + 1
Next iT
End Sub