anderer Ansatz
17.06.2015 13:22:55
Michael
Hallo zusammen,
mein allererster Gedanke in der Sache war, in der DOS-Box einen dir-Befehl einzugeben und das Ganze in eine Datei ausgeben zu lassen, z.B. so:
C:\>dir /s >dir.txt bzw. C:\Users\DeinName>dir \ /s >dir.txt
Die dir.txt hätte man wiederum in Excel öffnen und mit =Länge() auswerten können.
Die Parameter von dir kann man sich mit dir /? anzeigen lassen: /s bedeutet z.B., daß UVs mit einbezogen werden.
Das Ganze geht auch über die Shell, aber ich hatte gestern einen Wurm drin und deshalb zunächst die recherchierte Lösung gepostet.
Hier nun nachträglich der Code (ohne das "Alles, außer") mit dem Nachteil, daß der DOS-Zeichensatz zu unschönen Ausgaben führt (kann man natürlich noch korrigieren, aber zum Zählen der Längen isses egal):
Option Explicit
Sub Auslesen()
Dim zeile As Long, p As Long, z As Long, x As Long
Dim myShell As Object, myExec As Object
Dim aufruf As String, datei As String, pfad As String
Dim tzeile As Variant
Dim ausgabe As Boolean, vz As Boolean
Cells.Clear
aufruf = "cmd.exe /C dir C:\Forum /s"
Set myShell = CreateObject("WScript.Shell")
Set myExec = myShell.Exec(aufruf)
tzeile = Split(myExec.StdOut.ReadAll, vbCrLf)
Set myShell = Nothing
z = 1: x = 1 ' x = Wert für Länge ...
For zeile = LBound(tzeile) To UBound(tzeile)
ausgabe = False: vz = False
If Len(tzeile(zeile)) > 0 Then
If Mid(tzeile(zeile), 1, 1) = " " Then
p = InStr(tzeile(zeile), "\")
If p > 0 Then
pfad = Mid(tzeile(zeile), p - 2) & "\"
'ausgabe = True
End If
Else
datei = Mid(tzeile(zeile), 37) ' 37 = Standard?
If datei "." And datei ".." Then ausgabe = True
If Mid(tzeile(zeile), 26, 1) " " Then
vz = True ' = Verzeichnis;
ausgabe = False ' nach Bedarf auskommentieren
' wenn Vz = "d" ausgegeben werden soll
End If
End If
If ausgabe And Len(pfad) + Len(datei) > x Then
Cells(z, 1).Value = pfad
Cells(z, 3).Value = datei
If vz Then Cells(z, 2).Value = "d"
z = z + 1
End If
End If
Next
End Sub
Hier wird der "Kommandoprozessor" cmd.exe aufgerufen (das Programm, das Eingaben in der DOS-Box auswertet; Befehle wie "dir" werden von cmd direkt ausgeführt, andere DOS-/Windows-Befehle wie z.B. ping sind eigenständige Programme (ping.exe)), und die Ausgabe wird direkt in VBA weiterverarbeitet.
Das Programm sieht bei weitem nicht so "elegant" aus wie das erste, tut aber auch brav. *Vorsicht*, es löscht und überschreibt das gerade geöffnete Blatt.
Ok, ok, die Frage ist bereits beantwortet, aber es hat mich gejuckt, diesen Ansatz auszutesten, vielleicht kann's mal jemand brauchen.
Schöne Grüße,
Michael
P.S.: der Vollständigkeit halber der aufs Wesentliche reduzierte Code für ping (der Befehl benötigt einige Sekunden, keine Panik):
Sub Ping_Test()
Dim myShell As Object, myExec As Object
Dim aufruf As String
aufruf = "ping.exe www.DeineTestSeite.de"
Set myShell = CreateObject("WScript.Shell")
Set myExec = myShell.Exec(aufruf)
MsgBox myExec.StdOut.ReadAll
Set myShell = Nothing
End Sub