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

Daten in Excel anordnen

Daten in Excel anordnen
22.01.2024 12:48:36
Peter24
Hallo Leute
Ich möchte eine Ordnerstruktur auslesen und in Excel einfügen.
Das mit dem Auslesen krieg ich hin, nur sieht das in Excel nicht so aus wie
ich es haben will.
Hier ist die Beispieldatei wie ich es haben will mit Code.
https://www.herber.de/bbs/user/166247.xlsm
Vorab schon mal Danke

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten in Excel anordnen
22.01.2024 13:51:56
Pappawinni
Ich hatte da mal etwas ähnliches gebastelt.
Es werden alle Dateien gelistet, ab dem Verzeichnis in dem das Excel steht.
Dateinamen liste ich aber nicht separat, aber vielleicht hilft das ja trotzdem weiter.

https://www.herber.de/bbs/user/166254.xlsm
AW: Daten in Excel anordnen
23.01.2024 12:29:42
Peter24
Hallo Pappawinni
Nein, es hilft mir leider nicht. Aber Danke.
Wie gesagt. Das mit dem Auslesen ist kein Problem.
Ich wähle einen Ordner über das Menü aus und will dann den Ordner in Spalte 1 eintragen und
alle Dateien die der Ordner enthält, in Spalte 5 untereinander eintragen.
Danach der erste Unterordner in Spalte 2 und alle Dateien des Unterordners in Spalte 5
daneben und untereinander
Ich kann es leider nicht so wie ich es in der Beispieldatei angegeben habe in Excel auflisten.

Hat noch jemand eine Idee.
Gruß Peter
Anzeige
AW: Daten in Excel anordnen
23.01.2024 13:40:19
Pappawinni
Bei der Ausgabe der Dateien machst du nen merkwürdigen Klimmzug.
Du hast doch eine globale Variable "Zeile".
Die solltest du dann halt auch bei der Dateiausgabe verwenden...

 Private Sub ordnerAusgeben(ByVal f As Object)

Dim pfadTiefe As Long, verz As Object
Dim Pfad As String

Pfad = f
zeile = zeile + 1
pfadTiefe = UBound(Split(f.Path, "\")) - pfadTiefeBasis + 1
Cells(zeile, pfadTiefe).Formula = "=HYPERLINK(""" & f.Path & """,""" & f.Name & """)"
For Each verz In f.SubFolders
ordnerAusgeben verz
Call Dateienauslesen(verz)
Next
End Sub

Sub Dateienauslesen(verz As Object)

'Variablen definieren
Dim fso As Object
Dim datei As Object
Dim LetzteZeile As Long
Dim Pfad As String
Dim blnFirst As Boolean
Set fso = CreateObject("Scripting.FileSystemObject")

Pfad = verz
blnFirst = True

'Schleife
For Each datei In fso.GetFolder(Pfad).Files

If Not blnFirst Then zeile = zeile + 1
blnFirst = False
'Ergebnisse ins Tabellenblatt einfügen
ActiveSheet.Hyperlinks.Add anchor:=Cells(zeile, 5), Address:=datei.Path, TextToDisplay:=datei.Name

Next datei

End Sub
Anzeige
AW: Daten in Excel anordnen
23.01.2024 14:13:49
Pappawinni
Ach und Ordner auslesen sollte wohl auch anderes laufen.
In deiner Variante werden die Dateien des angegebenen Ordners nicht gelistet, sondern nur die Unterordner.
Soviel zu: "kann ich schon"



Private Sub ordnerAusgeben(ByVal f As Object)
Dim pfadTiefe As Long, verz As Object
Dim Pfad As String

Pfad = f
zeile = zeile + 1
pfadTiefe = UBound(Split(f.Path, "\")) - pfadTiefeBasis + 1
Cells(zeile, pfadTiefe).Formula = "=HYPERLINK(""" & f.Path & """,""" & f.Name & """)"
Dateienauslesen f
For Each verz In f.SubFolders
ordnerAusgeben verz
Next
End Sub
Anzeige
AW: Daten in Excel anordnen
24.01.2024 13:33:47
Peter24
Hallo Pappawinni

Zu deinem Vorwurf:
Ach und Ordner auslesen sollte wohl auch anderes laufen.
In deiner Variante werden die Dateien des angegebenen Ordners nicht gelistet, sondern nur die Unterordner.
Soviel zu: "kann ich schon"

Ja, kann ich schon. Hättest du den Code mal ausgeführt wüsstest du das in Zeile 5 alle Dateien zwar aufgelistet
werden aber auch überschrieben werden. Das ist mein einziges Problem.
Und nichts was du vorgeschlagen hast funktioniert.
Vielen Dank für die Zurechtweisung
AW: Daten in Excel anordnen
24.01.2024 13:58:11
Pappawinni
Keine Ahnung was du falsch machst.
Der Code funktioniert bei mir.
Und es ist FAKT, dass du die Dateien des gewählten Verzeichnisses nicht gelistet hattest.
Der Code ist im Grunde gar nicht so viel anders als das was ich schon gemacht hatte.
Es ist im wesentlichen eine Rekursion mit der die Verzeichnisse durchgeackert werden.
Aber egal. Du willst es halt besser wissen.
Anzeige
AW: Daten in Excel anordnen
24.01.2024 14:18:11
Pappawinni
Und hier mal die von mir zuletzt verwendete Version deines Codes, die bei mir das tut, was sie soll.



Option Explicit

Private zeile As Long, pfadTiefeBasis As Long

Sub OrdnerAuflisten()
Dim shFolder As Object, fsoFolder As Object
Dim Pfad As String

Application.ScreenUpdating = False
Set shFolder = CreateObject("Shell.Application").BrowseForFolder(0&, "Inhaltsverzeichnis erstellen für:", 0)
Set fsoFolder = CreateObject("Scripting.FileSystemObject").GetFolder(shFolder.self.path)
Pfad = fsoFolder
Worksheets.Add after:=Sheets(Sheets.Count)
zeile = 2
pfadTiefeBasis = UBound(Split(fsoFolder.path, Application.PathSeparator))
Set shFolder = Nothing
ordnerAusgeben fsoFolder
Application.CutCopyMode = False

'Spaltenbreite automatisch anpassen
Columns("A:E").AutoFit

End Sub

Private Sub ordnerAusgeben(ByVal f As Object)
Dim pfadTiefe As Long, verz As Object
Dim Pfad As String

Pfad = f
zeile = zeile + 1
pfadTiefe = UBound(Split(f.path, "\")) - pfadTiefeBasis + 1
Cells(zeile, pfadTiefe).Formula = "=HYPERLINK(""" & f.path & """,""" & f.Name & """)"
Dateienauslesen f
For Each verz In f.SubFolders
ordnerAusgeben verz
Next
End Sub

Sub Dateienauslesen(verz As Object)

'Variablen definieren
Dim fso As Object
Dim datei As Object
Dim LetzteZeile As Long
Dim Pfad As String
Dim blnFirst As Boolean
Set fso = CreateObject("Scripting.FileSystemObject")

Pfad = verz
blnFirst = True

'Schleife
For Each datei In fso.GetFolder(Pfad).Files

If Not blnFirst Then zeile = zeile + 1
blnFirst = False
'Ergebnisse ins Tabellenblatt einfügen
ActiveSheet.Hyperlinks.Add anchor:=Cells(zeile, 5), Address:=datei.path, TextToDisplay:=datei.Name

Next datei

End Sub
Anzeige
AW: Daten in Excel anordnen
25.01.2024 12:47:14
Peter24
Hallo Pappawinni

Erstmal muss ich mich bei Dir entschuldigen.
Ich habe Deinen Code in ein neues Arbeitsblatt eingefügt und es ist GENAU das was ich wollte.
Ich habe aber auch, weil ich von Copy and Paste nichts halte, meinen Code so umgeschrieben
wie du es gemacht hast. Funktioniert leider nicht. Ich kriege auch keine Fehlermeldung.
Ich weiss nicht woran es liegt. Da ich MCP bin, habe ich Microsoft angeschrieben (Mit beiden Dateien)
mit der Bitte um Hilfe.

Nochmals Vielen Dank
Gruß Peter
AW: Daten in Excel anordnen
25.01.2024 14:45:14
Pappawinni
Kein Thema, ich hab mir sowas gedacht.
Ich würde allerdings dann eher nicht Microsoft anschreiben, sondern selbst versuchen das Problem einzugrenzen.
Dazu würde ich aber tatsächlich mit copy und paste einzelne Subs in deinem Code ersetzen und schauen, ob das etwas ändert.
Vielleicht reicht es aber auch, wenn du zum Beispiel überflüssig gewordene Variable entfernst, wie beispielsweise
Dim LetzteZeile As Long
in der sub Dateienauslesen.
Die hab ich halt stehen lassen, weil ich ja erst mal nur die Funktion herstellen wollte.
Vielleicht hast du beim Abschreiben einfach nur eine Änderung übersehen.

Anzeige
AW: Daten in Excel anordnen
27.01.2024 19:03:36
Pappawinni
Was mich von Anfang an gestört hat war, dass du eine feste Spalte für die Dateien vorgesehen hast.
Das ist vielleicht für deine Anwendung gut und schön, aber halt für ne allgemeine Anwendung nicht so ideal.
Mitunter hat es halt dann auch lesegeschützte Ordner oder System / Hidden, die dann Probleme machen.
Das wäre auch zu vermeiden.
Ich hab daher mal etwas mit meiner Lösung herumgespielt und was dabei herausgekommen ist, zeige ich unten.
Zunächst lasse ich mal ermitteln, wie tief die Unterordner gehen und lege davon abhängig die Spalte für die Dateinamen fest,
die aber mindestens Spalte "E" ist. Müsste also insoweit auch deinen Anforderungen genügen, es sei denn, die Subfolder sind
tiefer geschachtelt.



Option Explicit

Public Sub StartListingFiles()

Dim wsWorksheet As Worksheet
Dim strSourceFolderName As String
Dim objFileDialog As FileDialog
Dim lRowNew As Long
Dim lngRow As Long
Dim lngCol As Long
Dim lngFileCol As Long

Application.ScreenUpdating = False

Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
With objFileDialog
.AllowMultiSelect = False
.InitialFileName = Application.DefaultFilePath
.InitialView = msoFileDialogViewDetails
.Title = "Bitte den Ordner auswählen"
If .Show Then strSourceFolderName = .SelectedItems(1)
End With
Set objFileDialog = Nothing
If strSourceFolderName = "" Then
Exit Sub
End If
'
Set wsWorksheet = ThisWorkbook.Worksheets.Add(after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))

lngRow = 3
lngCol = 1
lngFileCol = WorksheetFunction.Max(4 + lngCol, getSubFolderDepth(strSourceFolderName) + 1 + lngCol)

lRowNew = ListAllFilesInFolder(strSourceFolderName, wsWorksheet, lngRow, lngCol, lngFileCol)

wsWorksheet.Columns.AutoFit

MsgBox "Read " & lRowNew - lngRow & " lines"

End Sub

Function ListAllFilesInFolder(ByVal SourceFolderName As String, _
wsWorksheet As Worksheet, lngRow As Long, lngCol As Long, ByVal lngFle As Long) As Long

'Listet rekursiv die Dateien des Folders SourceFolderName und dessen Subfolder im Arbeitsblatt wsWorksheet,
'den Dateinamen in spalte lngFle und die zugehörigen Folder hierarchisch ab Zeile lngRow und Spalte lngCol jeweils als Hyperlinks

Dim fso As Object, SourceFolder As Object, SubFolder As Object
Dim FileItem
Dim lngRows As Long
Dim lngCols As Long
Dim lRowNew As Long
Dim blnFirst As Boolean

Set fso = CreateObject("Scripting.FileSystemObject")

If fso.GetDrive(fso.GetDriveName(SourceFolderName)).Path = SourceFolderName Then
Set SourceFolder = fso.GetDrive(fso.GetDriveName(SourceFolderName)).RootFolder
Else
Set SourceFolder = fso.GetFolder(SourceFolderName)
End If

On Error Resume Next
If Not (SourceFolder.Files.Count >= 0) Then
ListAllFilesInFolder = -1
Exit Function
End If
On Error GoTo 0

' DoEvents

lngRows = lngRow
lngCols = lngCol

blnFirst = True
createHyperlink wsWorksheet, lngRows, lngCol, SourceFolder.Name, SourceFolder.Path

For Each FileItem In SourceFolder.Files
If Not blnFirst Then lngRows = lngRows + 1
blnFirst = False
createHyperlink wsWorksheet, lngRows, lngFle, FileItem.Name, FileItem.Path
Next FileItem
lngRows = lngRows + 1
lngCols = lngCols + 1
lRowNew = lngRows

For Each SubFolder In SourceFolder.SubFolders
If Not ((SubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
lRowNew = ListAllFilesInFolder(SubFolder.Path, wsWorksheet, lngRows, lngCols, lngFle)
lngRows = lRowNew
End If
Next SubFolder

ListAllFilesInFolder = lRowNew

End Function


Sub createHyperlink(ByVal wsWorksheet As Worksheet, lngRow As Long, lngCol As Long, strName As String, strPath As String)

wsWorksheet.Cells(lngRow, lngCol).Hyperlinks.Add Anchor:=wsWorksheet.Cells(lngRow, lngCol), Address:=strPath, TextToDisplay:=strName

End Sub

Function getSubFolderDepth(ByVal SourceFolderName As String) As Long

'Ermittet für einen Pfad die Tiefe der Unterverzeichnise

Dim fso As Object, SourceFolder As Object, SubFolder As Object
Dim Result As Long, Result1 As Long

Result = 0

' DoEvents

Set fso = CreateObject("Scripting.FileSystemObject")

If fso.GetDrive(fso.GetDriveName(SourceFolderName)).Path = SourceFolderName Then
Set SourceFolder = fso.GetDrive(fso.GetDriveName(SourceFolderName)).RootFolder
Else
Set SourceFolder = fso.GetFolder(SourceFolderName)
End If

'check for ReadAccess
On Error Resume Next
If Not (SourceFolder.Files.Count >= 0) Then
getSubFolderDepth = -1 'delivers -1, not to count a subfolder without read permission
Exit Function
End If
On Error GoTo 0

For Each SubFolder In SourceFolder.SubFolders
If Not ((SubFolder.Attributes And (vbSystem Or vbHidden)) > 0) Then
Result1 = 1
Result1 = Result1 + getSubFolderDepth(SubFolder.Path)
End If
If Result1 > Result Then Result = Result1
Next SubFolder

getSubFolderDepth = Result

End Function
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige