Anzeige
Archiv - Navigation
284to288
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
284to288
284to288
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Verzeichnisse und Unterverzeichnisse auslesen

Verzeichnisse und Unterverzeichnisse auslesen
22.07.2003 23:40:31
Lydia
Hi, :-)
Schon wieder mal, aber leider scheine ich die gefundenen Progs falsch anzuwenden. Immerhin bin ich mit diesem hier schon so weit gekommen, das es mir *.xls ausliest aus Dokumente und Einstellungen.
Option Explicit
Dim StrNewDir As String
Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Declare

Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Declare 

Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
'Aufruf des Dialogs zur Ordnerauswahl

Function GetDirectory(Optional msg) As String
Dim bInfo As BROWSEINFO
Dim Path As String
Dim r As Long, x As Long, pos As Integer
bInfo.pidlRoot = 0&
If IsMissing(msg) Then
bInfo.lpszTitle = "Wählen Sie bitte einen Ordner aus."
Else
bInfo.lpszTitle = msg
End If
bInfo.ulFlags = &H1
x = SHBrowseForFolder(bInfo)
Path = Space$(512)
r = SHGetPathFromIDList(ByVal x, ByVal Path)
If r Then
pos = InStr(Path, Chr$(0))
GetDirectory = Left(Path, pos - 1)
Else
GetDirectory = ""
End If
End Function

' Hauptprozedur

Sub DirImport()
Application.ScreenUpdating = False
StrNewDir = GetDirectory("Wählen Sie bitte einen Ordner aus:")
If StrNewDir = "" Then Exit Sub
If Right(StrNewDir, 1) <> "\" Then
StrNewDir = StrNewDir & "\"
End If
Call DirChange(StrNewDir)
Application.ScreenUpdating = True
End Sub

'Rekursive Ermittlung aller Dateien des eingestellten Verzeichnisse
'inklusive aller Unterverzeichnisse

Function DirChange(Optional StrNewDir As String)
Dim rngCell As Range
Dim FileArray() As String, DirArray() As String
Dim strFileName As String, strExtLink As String
Dim intCounter As Integer, intDirNr As Integer
Dim intDirMax As Integer, intPos As Integer
'Bildschrimaktualisierung ausschalten
Application.ScreenUpdating = False
'Array für Unterverzeichnisse dimensionieren
intDirMax = 20: ReDim DirArray(intDirMax)
'1. Dateinamen einlesen
strFileName = Dir(StrNewDir, 0 + 1 + 2 + 4 + 16)
'Do-Loop-Schleife bis FileName = ""
Do While strFileName <> ""
If strFileName <> "." And strFileName <> ".." Then
'Aktuelle Datei in Statuszeile anzeigen
Application.StatusBar = StrNewDir & strFileName & " wird bearbeitet..."
If GetAttr(StrNewDir & strFileName) <> vbDirectory And _
Right(strFileName, 3) = "xls" Then
'Wenn kein Ordner vorliegt und die Datei die Endung "xls" aufweist,
'Pfad & Dateinamen (zur Kontrolle) in Spalte A eintragen.
ThisWorkbook.Worksheets("Tabelle1").Range("A" & Range("A65536") _
.End(xlUp).Row + 1) = StrNewDir & strFileName
'Anzeige der Statuszeile zurücksetzen.
Application.StatusBar = False
ElseIf GetAttr(StrNewDir & strFileName) = vbDirectory Then 'Verzeichnis
'Befindet sich in der Variablen ein Verzeichnisname, wird
'die Anzeige der Statuszeile zurückgesetzt,
Application.StatusBar = False
'der Verzeichnisname in das Verzeichnisarray eingelesen und
DirArray(intDirNr) = strFileName: intDirNr = intDirNr + 1
'wenn die Verzeichnisanzahl > der oben festgelegten Maximalanzahl
'ist, wird das Array neu dimensioniert.
If intDirNr > intDirMax Then
intDirMax = intDirMax + 20: ReDim Preserve DirArray(intDirMax)
End If
End If
End If
'Nächsten Dateinamen einlesen.
strFileName = Dir()
Loop
' Unterverzeichnisse rekursiv durcharbeiten
For intCounter = 0 To intDirNr - 1
DirChange (StrNewDir & DirArray(intCounter) & "\")
Next intCounter
'Bildschirmaktualisierung wieder einschalten.
Application.ScreenUpdating = True
End Function

aber ich möchte gerne nicht nur die Dateien "Eigene Dateien" und *.xls auslesen, sondern auch die anderen Verzeichnisse und andere Datei Endungen. Aber leider sind meine VBA Kenntnisse immer noch gleich null und wenn ich etwas ändere geht gar nix mehr. Ich hatte vor die "xls" endungen in * zu ändern und ich glaub auch das eingestellte Verzeichnis irgendwie, aber wie?
Kann mir jemand helfen, bitte?
PS:
Und vielleicht weiß auch jemand ein gutes Buch mit dem ich lernen kann. Ich brauch eins, in dem der Autor nicht davon ausgeht ich versteh blah blah sofort (und davon gibt es viele und hab auch schon so eins), sondern etwas das mich mit vielen Beispielen die ich selber nachvollziehen kann an die Materie ranführt.(?)

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Verzeichnisse und Unterverzeichnisse auslesen
23.07.2003 00:48:38
Nepumuk
Hallo Lydia,
deine Frage ist die breiteste die mir bisher begegnet ist. Aus deine Anfrage geht leider nicht hervor, welche Dateitypen du alles aufgelistet haben willst, deswegen mal alle des gewählten Verzeichnisses inklusive Unterverzeichnisse:

Option Explicit
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As InfoT) As Long
Private Declare Function CoTaskMemFree Lib "ole32" (ByVal hMem As Long) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pList As Long, ByVal lpBuffer As String) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassname As String, ByVal lpWindowName As String) As Long
Private Type InfoT
hwnd As Long
Root As Long
DisplayName As Long
Title As Long
Flags As Long
FName As Long
lParam As Long
Image As Long
End Type
Public Sub Dateiliste()
Dim index As Long
With Application.FileSearch
.LookIn = GetAOrdner
.FileType = msoFileTypeAllFiles
.SearchSubFolders = True
If .Execute > 0 Then
On Error Resume Next
For index = 1 To .FoundFiles.Count
Cells(index, 1) = .FoundFiles(index)
Next
End If
End With
End Sub
Private Function GetAOrdner() As String
Dim xl As InfoT, IDList As Long, RVal As Long, FolderName As String
With xl
.hwnd = FindWindow("xlmain", vbNullString)
.Title = lstrcat("Bitte wählen Sie ein Verzeichnis", "")
.Flags = 1
End With
IDList = SHBrowseForFolder(xl)
If IDList <> 0 Then
FolderName = Space(256)
RVal = SHGetPathFromIDList(IDList, FolderName)
CoTaskMemFree (IDList)
FolderName = Trim(FolderName)
FolderName = Left(FolderName, Len(FolderName) - 1)
End If
GetAOrdner = FolderName
End Function


Code eingefügt mit: Excel Code Jeanie
Mit Büchertipps halte ich mich als reinen Autodidakten zurück. Schau dich hier im Forum um und dieses ist beileibe nicht das einzige. Hier kannst du lernen ohne Ende.
Gruß
Nepumuk

Anzeige
AW: Verzeichnisse und Unterverzeichnisse auslesen
23.07.2003 08:01:00
Lydia
@Nepumuk (Du heißt wirklich so? cool)
Tausend Dank - freu - :-)))))
Es klappt super und ich bin begeistert. Hab es natürlich auch gleich getestet und hat funktioniert bis auf complett c: - hehe, hat mein Computer nicht so gut gefunden, aber ich muss ja auch nicht gleich übertreiben oder?
Aber: Zwei Fragen hätt ich noch -
1.) Wie kann ich die Dateien die ich dann ausgewählt und in einen Hyperlink umgewandelt habe, dazu bringen, dass man beim anklicken direkt auf die Datei gelangt? (Irgendwie lande ich nur in der in der obersten Zeile derselben Tabelle - oder hab ich nur was übersehen??)
2.) Geht es auch das die einzelnen Dateien in separaten Tabellenspalten (in der Zeile) angezeigt werden? (also nicht der ganze Text in einer Zelle - sondern ab / in der nächsten
Und hab heute morgen schon herzlich gelacht wegen: Quote: Hallo Lydia,
deine Frage ist die breiteste die mir bisher begegnet ist. Unquote
Hat etwas gedauert bis ich verstanden hab was du mit breiteste meinst. *giggle*
Aber du hast recht, weiß leider auch nicht was passiert ist. *noch mehr giggle + kicher*

Anzeige
AW: Verzeichnisse und Unterverzeichnisse auslesen
23.07.2003 09:23:07
Nepumuk
Hallo Lydia,
zu 1.
Die umwandlung in einen Hyperlink läßt sich per Programm erledigen. Aber dazu muss Punkt 2 genauer wissen.
zu 2.
Ab welchen Backslash soll der Ausgabestring getrennt werden? Nach dem Laufwerksbuchstaben oder vor dem Dateiname?
Die Auflistung von C funktionierte bei mir beim ersten mal auch nicht. Erst der zweit Versuch bracht das gewünschte? Ergebnis (44.648 Dateien).
Gruß
Nepumuk (Maximilian, Günther, Nepumuk, um genau zu sein)

AW: Verzeichnisse und Unterverzeichnisse auslesen
23.07.2003 09:33:54
Lydia
Hi Nepumuk :-)
also im Moment sieht es ja etwa so aus:
C:\\DateienEigeneEinstellung\lydia\infotestfolder\*.pdf
C:\\DateienEigeneEinstellung\lydia\infotestfolder\*.xls
C:\\DateienEigeneEinstellung\lydia\infotestfolder\*.doc
C:\\DateienEigeneEinstellung\lydia\infotestfolder\zusatzfolder\*.gif
C:\\DateienEigeneEinstellung\lydia\infotestfolder\zusatzfolder\*.jpg
C:\\DateienEigeneEinstellung\lydia\infotestfolder\zusatzfolder\*.doc
usw. usw. (hatte Datei schon zu und jetzt aus dem Kopf), also ich muss per Hyperlink auf die jeweilige Datei zugreifen können (also die mit dem *.doc,*.xls usw.(in Tabellenblatt 1))und wenn das geht dann auch noch die Dateien in anderem Tabellenblatt (Tabellenblatt2)also zweimal eingelesen) sortiert in Spalten nach jeweiligen /
Spalte A / Spalte B / Spalte C usw
DateienEigeneEinstellung / lydia / infotestfolder............usw.
Wenn das auch noch geht bin ich echt froh
Lieber Gruß an Maximilian, Günther, Nepumuk :-)

Anzeige
AW: Verzeichnisse und Unterverzeichnisse auslesen
23.07.2003 11:08:42
Nepumuk
Hallo Lydia,
Da sich gerade auf dem Laufwerk C sehr viele Dateien befinden die sowieso nicht geöffnet werden können, sollten wir uns auf die konzentrieren, die du überhaupt benötigst. Ich werden das über einen String prüfen, so dass Änderungen deinerseits relativ einfach sind. Ich müsste nur noch wissen, in welcher Tabelle (1 oder 2) der Hyperlink erstellt werden soll.
Das geänderte Ausgabeprogramm:

Public Sub Dateiliste()
Dim index1 As Long, index2 As Long, Dateiendung As String, Zeile As Long, Datei As String, Spalte As Integer
With Application
.Cursor = xlWait
.ScreenUpdating = False
End With
With Worksheets(1).Cells
.Clear
.NumberFormat = "@"
End With
With Worksheets(2).Cells
.Clear
.NumberFormat = "@"
End With
Zeile = 1
Dateiendung = ".xls.doc.mdb.jpg.bmp.gif.pps.wav.mp3.mpeg.avi" 'hier kannst du die benötigten Dateien wählen
With Application.FileSearch
.LookIn = GetAOrdner
.FileType = msoFileTypeAllFiles
.SearchSubFolders = True
If .Execute > 0 Then
On Error Resume Next
For index1 = 1 To .FoundFiles.Count
If InStr(1, LCase(Dateiendung), LCase(Right(.FoundFiles(index1), 4))) > 0 Or InStr(1, LCase(Dateiendung), LCase(Right(.FoundFiles(index1), 5))) > 0 Then
If Err.Number <> 0 Then GoTo weiter
Spalte = 1
Worksheets(1).Cells(Zeile, 1) = .FoundFiles(index1)
Datei = Mid(.FoundFiles(index1), 4)
Do
Worksheets(2).Cells(Zeile, Spalte) = Left(Datei, InStr(1, Datei, "\") - 1)
Datei = Mid(Datei, InStr(1, Datei, "\") + 1)
Spalte = Spalte + 1
If InStr(1, Datei, "\") = 0 Then Worksheets(2).Cells(Zeile, Spalte) = Datei
Loop Until InStr(1, Datei, "\") = 0
If Err.Number = 0 Then Zeile = Zeile + 1
End If
weiter:         Err.Clear
Next
End If
End With
Worksheets(1).Columns.AutoFit
Worksheets(2).Columns.AutoFit
With Application
.Cursor = xlDefault
.ScreenUpdating = True
End With
End Sub


Gruß
Nepumuk

Anzeige
AW: Verzeichnisse und Unterverzeichnisse auslesen
23.07.2003 19:46:24
Lydia
Hi
da hast du dir sehr viel Mühe gemacht - ich habs jetzt noch nicht ausprobiert - aber vielleicht frag ich auch erst besser - wennder Text rot ist muss dann dort was geändert werden, und was? (abgesehen von den Dateiendungen, da war ja eine Erklärung von Dir). Also die roten @ Zeichen und die roten "/" Zeichen.
in Tabelle 1 die Hyperlinks und in Tabelle 2 die eingelesenen Gesamt. Und füge ich das alles in ein normales Modul ein?
Geez, und das alles kann ich lernen? Welche Zeitspanne sollte ich da denn wohl mal einplanen? Bei mir auf der Arbeit denkt man, ich geh mal eben zu einem VHS Kurs (im Herbst) und schon ist die Sache gebongt, phewwwww *schwitz*
Weiss gar nicht wie ich dir danken soll - aber ich tu's @DANK an -NEPUMUK- *:-)*
Gruss Lydia

Anzeige
AW: Verzeichnisse und Unterverzeichnisse auslesen
23.07.2003 23:09:41
Nepumuk
Hallo Lydia,
dass mache Zeichen in Rot erscheinen liegt an meinem Syntaxhighlighter, bedeutet aber nichts anderes, als das es sich in der Darstellung um Zeichenketten (ersichtlich an den führenden und folgenden Anführungszeichen) handelt.
Das ganze kommt in ein normales Modul, wie du richtig vermutest.
Der Part mit den Hyperlinks kommt in das Klassenmodul der entsprechenden Tabelle.
Damit du auch etwas lernst dabei, will ich mal etwas weiter ausholen. Klassenmodule sind Module, die bestimmte, vordefinierte Ereignisse Klassen behandeln. Klassen sind Ereignisse von Objekten. Die oberste Klasse ist das Application-Object. Eine Application ist z.B. Word oder Excel oder Access aber ohne Inhalt (nicht zu verwechseln mit einer leeren Tabelle oder einem leeren Blatt in Word). Diese Objet hat verschiedene Eigenschaften, die du per Programm ändern kannst (z.B. die Visible-Eigenschaft). Ein Objekt kann sichtbar - Visible = True oder unsichtbar - Visible = False sein. Außerdem kannst du auf Objekte bestimmte Methoden anwenden z.B. die Quit-Methode die das Applications-Objekt schließt (Application.Quit). Des weiteren gibt es verschiedene Ereignisse für das Objekt (z.B. das New_Workbook-Ereignis, das in dem Moment eintritt, in dem du in Excel eine neue Mappe öffnest). Das nächst niedrigere Objekt in Excel ist das Workbook. Dann kommen Scheets und wenn ich jetzt nicht aufhöre, dann hättest du die nächsten drei Monate zu lesen.
Also, es geht um die Klasse Worksheets, die eine Tabelle darstellt. Du wirst auch der Klasse der Sheets begegnen, die aber alle Arten von Arbeitsblättern darstellt (Tabellen, Diagramme, Excel4.0-Makrovorlagen, Internationale Makrovorlagen sowie den Excel5.0-Dialog). Aber wir konzentrieren uns auf Tabellen. Wenn du im Projektexplorer (das ist das kleine Fenster links im VBA-Editor), auf, in unserm Fall Tabelle1, einen Doppelklick machst, wird ein leeres Editor-Fenser geöffnet. Das stellt das Klassenmodul der Tabelle dar. In diesem kannst du Ereignisse der Klasse Tabelle, aber nur dieser Tabelle, verarbeiten. Es gibt auch allgemeine Klassenmodule, in dem du Objekte deiner Wahl vereinen kannst, aber das ist dann 10.Klasse, wir sind noch in der Grundschule.
Die Klasse der Tabellen kennt verschiedene Ereignisse. Den Doppelklick, den Rechtsklick, das ändern einer Zelle, das wechseln von einer Zelle zur anderen um einige Beispiele zu nennen. Wir benutzen zum erstelle des Hyperlinks den Doppelklick. Und das geht so:

Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
ActiveSheet.Hyperlinks.Add Anchor:=Cells(Target.Row, 2), Address:=Cells(Target.Row, 1)
Cells(Target.Row + 1, 2).Select
Cancel = True
End Sub


Code eingefügt mit: Excel Code Jeanie
Wir wollen bei der ganzen Sache natürlich nicht übertreiben, deswegen erst mal große Pause und zu deiner Anfrage.
Zweifellos kannst du das alles lernen und wenn du nicht doof bist und davon gehe ich aus, da du sonst niemals den Weg hieher gefunden hättest, brauchst du sicher nicht länger wie ich (ich mache das seit ungefähr 6 oder 7 Jahren, gebe aber zu, vorher fast 20 Jahre in anderen Sprachen programmiert zu haben). Also die Rechnung deines Chefs, mit ein paar Wochen VHS wird wohl nicht ganz aufgehen. Ehrlich gesagt, wenn ich mir heute Programme ansehe die ich vor drei Jahren geschrieben habe, könnte ich mich kringeln vor lachen, über meinen damaligen Dilettantismus. Aber nur nicht den Mut verlieren, dafür opfern Leute wie ich und viele andere ihre Freizeit um mit viel Spaß an der Sache Menschen wie dir die Sache näher zu bringen.
Wenn du weiter Fragen hast, stehe ich dir, soweit es meine Zeit erlaubt, natürlich gerne zur Verfügung. Bedenke aber immer dabei, dass viele andere Leute auch viele Fragen haben und sie diese natürlich auch beantwotret haben wollen.
Liebe Grüße
Nepumuk

Anzeige

46 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige