Supportnet / Forum / Tabellenkalkulation
Makro zum Öffnen von Unterordnern
Frage
Tach an alle!
Habe folgendendes Problem, welches ich nicht mehr haben möchte:
In einem bestimmten Ordner befinden sich Unterordner (ohne weitere Unterordner) mit ExcelDateien.
Nun möchte ich die Unterordner, deren Namen variabel sind (Namen ändern sich) nacheinander per makro öffnen und die jeweiligen ExcelDateien bearbeiten (dafür habe ich schon ein makro).
Wie muß das Makro aussehen, um die Unterordner nacheinander zu öffnen und wieder zu schließen?
Wenn jemand eine Lösung dafür findet - das wäre Klasse!
Gruß
mckott
Antwort 1 von mckott
Hi - ich bins nochmal,
um mein Problem zu spezifizieren - es ist eigentlich eine Knobelaufgabe und ich weiß nicht, ob es überhaupt geht:
Also - es gibt einen Ordner mit Namen, der rund 30 Unterordner besitzt, deren Namen variieren (ich weiß die Namen noch nicht)
In den Unterordnern befinden sich Excel Dateien unterschiedlichen Namens und keine weiteren Unterordner.
Die Dateien/Mappen/Daten möchte ich zugehörig zu jedem Unterordner in einer neuen Mappe zusammenfassen und unter dem Namen "Liste & Name des Unterordners" im jeweiligen Unterordner speichern und dann nochmals in einem festgelegten Ordner speichern (dessen Namen ich festlegen kann), in dem dann alle entstandenen Listen/Mappen der Unterordner sich befinden sollen. (sprich 2x in verschiedenen Ordnern Speichern)
Zum Zusammenfassen der Mappen hat nighty mir schon ein Makro geschrieben (Dank nochmals!):
Sub liste_erstellen()
Application.DisplayAlerts = False
Dim i, zaehler1, zaehler2, a, alta, lzeile, lspalte
Dim lastcell As Range
With Application.FileSearch
.NewSearch
.LookIn = "L:\Experimentierordner\Testdateien"
.SearchSubFolders = False
.Filename = "*.xls"
If .Execute() > 0 Then
For i = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(i)
Set lastcell = ActiveSheet.Cells.SpecialCells(xlLastCell)
alta = lastcell.Row
a = lastcell.Row
Do While Application.CountA(Rows(a)) = 0 And a <> 1
a = a - 1
Loop
alta = a
lzeile = alta
For zaehler2 = 1 To lzeile
zaehler1 = zaehler1 + 1
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
Next zaehler2
Workbooks(2).Close
Next i
End If
End With
Application.DisplayAlerts = True
End Sub
Das Makro funktioniert einwandfrei - nur der Haken bei der Sache ist jetzt -> wie änder ich den Pfad darin ab für das ".LookIn" wo ich doch die Namen der Unterordner nicht weiß, da sie sich ändern?
So sieht's aus.
Ich grüble nun schon Tage über diese Sache.
Und da ich mich erst vor kurzem mit VBA beschäftige, geht mir das nicht so schnell von der Hand (wenn überhaupt...)
Vielleicht ist das ja für jemanden ein Leichtes.
Bin gespannt auf Eure Antworten!
cu
mckott
um mein Problem zu spezifizieren - es ist eigentlich eine Knobelaufgabe und ich weiß nicht, ob es überhaupt geht:
Also - es gibt einen Ordner mit Namen, der rund 30 Unterordner besitzt, deren Namen variieren (ich weiß die Namen noch nicht)
In den Unterordnern befinden sich Excel Dateien unterschiedlichen Namens und keine weiteren Unterordner.
Die Dateien/Mappen/Daten möchte ich zugehörig zu jedem Unterordner in einer neuen Mappe zusammenfassen und unter dem Namen "Liste & Name des Unterordners" im jeweiligen Unterordner speichern und dann nochmals in einem festgelegten Ordner speichern (dessen Namen ich festlegen kann), in dem dann alle entstandenen Listen/Mappen der Unterordner sich befinden sollen. (sprich 2x in verschiedenen Ordnern Speichern)
Zum Zusammenfassen der Mappen hat nighty mir schon ein Makro geschrieben (Dank nochmals!):
Sub liste_erstellen()
Application.DisplayAlerts = False
Dim i, zaehler1, zaehler2, a, alta, lzeile, lspalte
Dim lastcell As Range
With Application.FileSearch
.NewSearch
.LookIn = "L:\Experimentierordner\Testdateien"
.SearchSubFolders = False
.Filename = "*.xls"
If .Execute() > 0 Then
For i = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(i)
Set lastcell = ActiveSheet.Cells.SpecialCells(xlLastCell)
alta = lastcell.Row
a = lastcell.Row
Do While Application.CountA(Rows(a)) = 0 And a <> 1
a = a - 1
Loop
alta = a
lzeile = alta
For zaehler2 = 1 To lzeile
zaehler1 = zaehler1 + 1
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
Next zaehler2
Workbooks(2).Close
Next i
End If
End With
Application.DisplayAlerts = True
End Sub
Das Makro funktioniert einwandfrei - nur der Haken bei der Sache ist jetzt -> wie änder ich den Pfad darin ab für das ".LookIn" wo ich doch die Namen der Unterordner nicht weiß, da sie sich ändern?
So sieht's aus.
Ich grüble nun schon Tage über diese Sache.
Und da ich mich erst vor kurzem mit VBA beschäftige, geht mir das nicht so schnell von der Hand (wenn überhaupt...)
Vielleicht ist das ja für jemanden ein Leichtes.
Bin gespannt auf Eure Antworten!
cu
mckott
Antwort 2 von nighty
hi mckott :))
hier eine sehr schoene variante von einem anderen netten user :)))
gruss nighty
hier eine sehr schoene variante von einem anderen netten user :)))
gruss nighty
Option Explicit
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pIDList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Dim Verzeichnisse()
Dim Dateien()
Dim Anzdateien As Long
Sub Einlesen()
Dim Ordnername
Dim Pfad1 As String
Dim Obergrenze As Long
Dim Anzordner As Long
Dim i As Long
Const cVerzeichnistiefe = 5
Dim intVerzeichnistiefe As Integer
Dim Start As Long
Rem der zu untersuchende pfad
Ordnername = "C:\briefe"
If Ordnername = False Then Exit Sub
ChDir Ordnername
ChDir ".."
If Ordnername <> "" Then
Anzdateien = 0
intVerzeichnistiefe = 0
Pfad1 = Ordnername
If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
ReDim Verzeichnisse(0)
Verzeichnisse(0) = Pfad1
Obergrenze = UBound(Verzeichnisse)
ReDim Dateien(0)
Rekursion:
For i = Start To Obergrenze
Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
intVerzeichnistiefe = intVerzeichnistiefe + 1
Start = Start + 1
Obergrenze = UBound(Verzeichnisse)
If intVerzeichnistiefe < cVerzeichnistiefe Then GoTo Rekursion
intVerzeichnistiefe = intVerzeichnistiefe - 1
Next
Anzordner = Obergrenze + 1
If Anzordner = 0 Then
MsgBox "Es gibt nichts zu tun!", vbInformation + vbOKOnly, "Keine Ordner"
Else
Rem ausgabe der directorys :)))
For i = 0 To Anzordner - 1
Cells(i + 1, 1).Value = Verzeichnisse(i)
Next
End If
End If
End Sub
Private Sub Verzeichnisse_suchen(ByVal Pfad As String, ByVal Arraygrenze As Long)
Dim Name1 As String
Name1 = Dir(Pfad, vbDirectory)
Do While Name1 <> ""
If Name1 <> "." And Name1 <> ".." Then
If (GetAttr(Pfad & Name1) And vbDirectory) = vbDirectory Then
Arraygrenze = Arraygrenze + 1
ReDim Preserve Verzeichnisse(Arraygrenze)
Verzeichnisse(Arraygrenze) = Pfad & Name1 & "\"
End If
End If
Name1 = Dir
Loop
End Sub
Antwort 3 von nighty
hi mckott :))
schniff ein wenig gross geworden :))
nicht getestet,probier :))
gruss nighty
schniff ein wenig gross geworden :))
nicht getestet,probier :))
gruss nighty
Option Explicit
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pIDList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Dim Verzeichnisse()
Dim Dateien()
Dim Anzdateien As Long
Sub Einlesen()
Dim Ordnername
Dim Pfad1 As String
Dim Obergrenze As Long
Dim Anzordner As Long
Dim i As Long
Const cVerzeichnistiefe = 5
Dim intVerzeichnistiefe As Integer
Dim Start As Long
Dim zaehler, zaehler1, zaehler2, a, alta, lzeile, lspalte
Dim lastcell As Range
Rem der zu untersuchende pfad bzw. laufwerk
Ordnername = "C:\briefe"
If Ordnername = False Then Exit Sub
ChDir Ordnername
ChDir ".."
If Ordnername <> "" Then
Anzdateien = 0
intVerzeichnistiefe = 0
Pfad1 = Ordnername
If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
ReDim Verzeichnisse(0)
Verzeichnisse(0) = Pfad1
Obergrenze = UBound(Verzeichnisse)
ReDim Dateien(0)
Rekursion:
For i = Start To Obergrenze
Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
intVerzeichnistiefe = intVerzeichnistiefe + 1
Start = Start + 1
Obergrenze = UBound(Verzeichnisse)
If intVerzeichnistiefe < cVerzeichnistiefe Then GoTo Rekursion
intVerzeichnistiefe = intVerzeichnistiefe - 1
Next
Anzordner = Obergrenze + 1
If Anzordner = 0 Then
MsgBox "Es gibt nichts zu tun!", vbInformation + vbOKOnly, "Keine Ordner"
Else
For i = 0 To Anzordner - 1
neueordner = Verzeichnisse(i)
Application.DisplayAlerts = False
With Application.FileSearch
.NewSearch
.LookIn = neueordner
.SearchSubFolders = False
.Filename = "*.xls"
If .Execute() > 0 Then
For zaehler = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(zaehler)
Set lastcell = ActiveSheet.Cells.SpecialCells(xlLastCell)
alta = lastcell.Row
a = lastcell.Row
Do While Application.CountA(Rows(a)) = 0 And a <> 1
a = a - 1
Loop
alta = a
lzeile = alta
For zaehler2 = 1 To lzeile
zaehler1 = zaehler1 + 1
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
Next zaehler2
Workbooks(2).Close
Next zaehler
End If
End With
Application.DisplayAlerts = True
Next
End If
End If
End Sub
Private Sub Verzeichnisse_suchen(ByVal Pfad As String, ByVal Arraygrenze As Long)
Dim Name1 As String
Name1 = Dir(Pfad, vbDirectory)
Do While Name1 <> ""
If Name1 <> "." And Name1 <> ".." Then
If (GetAttr(Pfad & Name1) And vbDirectory) = vbDirectory Then
Arraygrenze = Arraygrenze + 1
ReDim Preserve Verzeichnisse(Arraygrenze)
Verzeichnisse(Arraygrenze) = Pfad & Name1 & "\"
End If
End If
Name1 = Dir
Loop
End Sub
Antwort 4 von nighty
hi alle :)
wie immer :(
ueber diese zeile
Rem der zu untersuchende pfad bzw. laufwerk
buedde dies noch einfuegen ,hab noch getestet :)
gruss nighty
wie immer :(
ueber diese zeile
Rem der zu untersuchende pfad bzw. laufwerk
buedde dies noch einfuegen ,hab noch getestet :)
dim neueordner as stringgruss nighty
Antwort 5 von nighty
hi alle :)
noch schnell eine kurzbeschreibung falls noch andere interesse haben sollten :)
es werden ab dem zielverzeichnis bzw. laufwerk alle directory eingelesen und dessen inhalt auf *.xls abgetastet ,somit alle excel dateien die gefunden werden geoeffnet werden und obige benannte zellen nach dem workbooks(1) kopiert,datei geschlossen und die naechste wenn vorhanden,es erfolgt eine automatische abtastung des directorybaumes wie der anzahl der jeweiligen tabellen :)))
gruss nighty
p.s.
uebrigens eines meiner lieblingsmakros,es ist ein cooler stil des programmierers :))))
hoffentlich hab ich nichts vergessen ?
ausserdem ist es zu heiss heut hier in spandau :)
noch schnell eine kurzbeschreibung falls noch andere interesse haben sollten :)
es werden ab dem zielverzeichnis bzw. laufwerk alle directory eingelesen und dessen inhalt auf *.xls abgetastet ,somit alle excel dateien die gefunden werden geoeffnet werden und obige benannte zellen nach dem workbooks(1) kopiert,datei geschlossen und die naechste wenn vorhanden,es erfolgt eine automatische abtastung des directorybaumes wie der anzahl der jeweiligen tabellen :)))
gruss nighty
p.s.
uebrigens eines meiner lieblingsmakros,es ist ein cooler stil des programmierers :))))
hoffentlich hab ich nichts vergessen ?
ausserdem ist es zu heiss heut hier in spandau :)
Antwort 6 von mckott
hi nighty -
hoffe, es ist wieder ein bißchen kühler in spandau?
danke erstmal für deine hilfe!
habe makro ausprobiert - bekomme eine zusammengefaßte liste aller daten der excel dateien der unterordner. das ist schon mal gut.
alles verstehe ich nicht was im macro steht aber es funktioniert...
einige fragen habe ich jedoch noch:
1.) wennn ich im obigen macro, was von dir war? bei dem befehl
.LookIn = "L:\Experimentierordner\Testdateien"
.SearchSubFolders = False
statt False - True mache -> dann komm ich doch auf das gleiche ergebnis wie bei dem letzten macro?! oder nicht?
2.) habe in einer zelle text stehen, der mehr als 255 zeichen hat -> dieser wird nicht kopiert, in der kopierten zelle steht dann: #WERT! -> wie kann ich das umgehen?
3.) das eine liste erstellt wird von allen excel dateien der unterordner ist ja gut aber: - wie kann ich in das macro einfügen, daß folgendes geschieht:
1 ersten unterordner öffnen
2 neue mappe erstellen
3 in der erstellten mappe die daten der excel dateien dieses unterordners zusammenfassen (denke das wird ähnlich obigem macro sein)
4 diese mappe in hiesigem unterordner unter dem namen "liste & namen des unterordners" abspeichern
5 die gleiche mappe in einem festgelegten ordner abspeichern wo dann alle anderen listen der folgenden unterordner auch abgespeichert werden
6 mappe schließen
7 schleife zum zweiten unterordner (bis alle rund 30 unterordner abgearbeitet sind)
8 dann eine liste erstellen wo alle daten der listen der unterordner zusammengefaßt sind (sprich das wäre dann mein testergebnis des makro des programmierers was dir so gut gefällt ;) )
wenn in dem macro was du mir zuletzt gegeben hast die schritte 1 bis 7 (ohne 6) zu integrieren wären - dann ist das auch fein :)
so - ich hoffe du verstehst was ich meine?
und ich hoffe, daß dich das nicht nochmehr zum schwitzen bringt...
was meinst du?
cu
mckott
hoffe, es ist wieder ein bißchen kühler in spandau?
danke erstmal für deine hilfe!
habe makro ausprobiert - bekomme eine zusammengefaßte liste aller daten der excel dateien der unterordner. das ist schon mal gut.
alles verstehe ich nicht was im macro steht aber es funktioniert...
einige fragen habe ich jedoch noch:
1.) wennn ich im obigen macro, was von dir war? bei dem befehl
.LookIn = "L:\Experimentierordner\Testdateien"
.SearchSubFolders = False
statt False - True mache -> dann komm ich doch auf das gleiche ergebnis wie bei dem letzten macro?! oder nicht?
2.) habe in einer zelle text stehen, der mehr als 255 zeichen hat -> dieser wird nicht kopiert, in der kopierten zelle steht dann: #WERT! -> wie kann ich das umgehen?
3.) das eine liste erstellt wird von allen excel dateien der unterordner ist ja gut aber: - wie kann ich in das macro einfügen, daß folgendes geschieht:
1 ersten unterordner öffnen
2 neue mappe erstellen
3 in der erstellten mappe die daten der excel dateien dieses unterordners zusammenfassen (denke das wird ähnlich obigem macro sein)
4 diese mappe in hiesigem unterordner unter dem namen "liste & namen des unterordners" abspeichern
5 die gleiche mappe in einem festgelegten ordner abspeichern wo dann alle anderen listen der folgenden unterordner auch abgespeichert werden
6 mappe schließen
7 schleife zum zweiten unterordner (bis alle rund 30 unterordner abgearbeitet sind)
8 dann eine liste erstellen wo alle daten der listen der unterordner zusammengefaßt sind (sprich das wäre dann mein testergebnis des makro des programmierers was dir so gut gefällt ;) )
wenn in dem macro was du mir zuletzt gegeben hast die schritte 1 bis 7 (ohne 6) zu integrieren wären - dann ist das auch fein :)
so - ich hoffe du verstehst was ich meine?
und ich hoffe, daß dich das nicht nochmehr zum schwitzen bringt...
was meinst du?
cu
mckott
Antwort 7 von nighty
hi mckott :)
sag mir deine email,ich schick dir dann wenn fertig ist :)
gruss nighty
sag mir deine email,ich schick dir dann wenn fertig ist :)
gruss nighty
Antwort 8 von mckott
hi nighty,
habe dir soeben eine mail geschickt und meine mailadresse öffentlich gemacht...
danke dir!
cu
mckott
habe dir soeben eine mail geschickt und meine mailadresse öffentlich gemacht...
danke dir!
cu
mckott
Antwort 9 von mckott
tach nighty und alle die es lesen,
hast du meine email nicht bekommen oder keine zeit oder einen hitzeschlag erlitten? ;)
hab mir ne rübe gemacht und habe in den code reingebastelt, daß in jedem unterordner eine neue excel mappe/datei mit dem namen des unterordners kreiert wird (das ist alles nur geklaut...)
ABER wie kann ich den code ändern, daß die ausgelesenen tabellen eines unterordners in die zugehörigen kreierten mappen kopiert werden?
UND wie löse ich das wenn-zellenwert-mehr-als-255-zeichen-dann-wird-es-nicht-kopiert-problem?
eine hilfreiche antwort darauf würde mir schon reichen ;)
hat vielleicht noch ein/e fachkundige/fachkundige außer nighty eine lösung parat?
nochmal den aktuellen code:
Option Explicit
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pIDList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Dim Verzeichnisse()
Dim Dateien()
Dim Anzdateien As Long
Sub Einlesen()
Dim Ordnername
Dim Pfad1 As String
Dim Obergrenze As Long
Dim Anzordner As Long
Dim i As Long
Const cVerzeichnistiefe = 5
Dim intVerzeichnistiefe As Integer
Dim Start As Long
Dim zaehler, zaehler1, zaehler2, a, alta, lzeile, lspalte
Dim lastcell As Range
Dim neueordner As String
Rem der zu untersuchende pfad bzw. laufwerk
Ordnername = "L:\Experimentierordner\Testdateien"
If Ordnername = False Then Exit Sub
ChDir Ordnername
ChDir ".."
If Ordnername <> "" Then
Anzdateien = 0
intVerzeichnistiefe = 0
Pfad1 = Ordnername
If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
ReDim Verzeichnisse(0)
Verzeichnisse(0) = Pfad1
Obergrenze = UBound(Verzeichnisse)
ReDim Dateien(0)
Rekursion:
For i = Start To Obergrenze
Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
intVerzeichnistiefe = intVerzeichnistiefe + 1
Start = Start + 1
Obergrenze = UBound(Verzeichnisse)
If intVerzeichnistiefe < cVerzeichnistiefe Then GoTo Rekursion
intVerzeichnistiefe = intVerzeichnistiefe - 1
Next
Anzordner = Obergrenze + 1
If Anzordner = 0 Then
MsgBox "Es gibt nichts zu tun!", vbInformation + vbOKOnly, "Keine Ordner"
Else
For i = 0 To Anzordner - 1
neueordner = Verzeichnisse(i)
Rem habe hier den Mappe erstellen Code eingefügt
Dim strFolderName As String
Dim fldVar As Variant
Dim objFSO As Object
Dim objFolder As Object
Dim fname As String
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(neueordner)Workbooks.Add
fname = neueordner & "Liste " & objFolder.Name & " .xls"
ActiveWorkbook.SaveAs fname
Application.DisplayAlerts = False
With Application.FileSearch
.NewSearch
.LookIn = neueordner
.SearchSubFolders = False
.Filename = "*.xls"
If .Execute() > 0 Then
For zaehler = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(zaehler)
ActiveSheet.Unprotect
Set lastcell = ActiveSheet.Cells.SpecialCells(xlLastCell)
alta = lastcell.Row
a = lastcell.Row
Do While Application.CountA(Rows(a)) = 0 And a <> 1
a = a - 1
Loop
alta = a
lzeile = alta
For zaehler2 = 1 To lzeile
zaehler1 = zaehler1 + 1
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
Workbooks(1).Sheets(1).Cells(zaehler1, 4) = Workbooks(2).Sheets(1).Cells(zaehler2, 4)
Workbooks(1).Sheets(1).Cells(zaehler1, 5) = Workbooks(2).Sheets(1).Cells(zaehler2, 5)
Next zaehler2
Workbooks(2).Close
Next zaehler
End If
End With
Application.DisplayAlerts = True
Next
End If
End If
End Sub
Private Sub Verzeichnisse_suchen(ByVal Pfad As String, ByVal Arraygrenze As Long)
Dim Name1 As String
Name1 = Dir(Pfad, vbDirectory)
Do While Name1 <> ""
If Name1 <> "." And Name1 <> ".." Then
If (GetAttr(Pfad & Name1) And vbDirectory) = vbDirectory Then
Arraygrenze = Arraygrenze + 1
ReDim Preserve Verzeichnisse(Arraygrenze)
Verzeichnisse(Arraygrenze) = Pfad & Name1 & "\"
End If
End If
Name1 = Dir
Loop
End Sub
so. - und jetzt?
Gruß
mckott
hast du meine email nicht bekommen oder keine zeit oder einen hitzeschlag erlitten? ;)
hab mir ne rübe gemacht und habe in den code reingebastelt, daß in jedem unterordner eine neue excel mappe/datei mit dem namen des unterordners kreiert wird (das ist alles nur geklaut...)
ABER wie kann ich den code ändern, daß die ausgelesenen tabellen eines unterordners in die zugehörigen kreierten mappen kopiert werden?
UND wie löse ich das wenn-zellenwert-mehr-als-255-zeichen-dann-wird-es-nicht-kopiert-problem?
eine hilfreiche antwort darauf würde mir schon reichen ;)
hat vielleicht noch ein/e fachkundige/fachkundige außer nighty eine lösung parat?
nochmal den aktuellen code:
Option Explicit
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pIDList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Dim Verzeichnisse()
Dim Dateien()
Dim Anzdateien As Long
Sub Einlesen()
Dim Ordnername
Dim Pfad1 As String
Dim Obergrenze As Long
Dim Anzordner As Long
Dim i As Long
Const cVerzeichnistiefe = 5
Dim intVerzeichnistiefe As Integer
Dim Start As Long
Dim zaehler, zaehler1, zaehler2, a, alta, lzeile, lspalte
Dim lastcell As Range
Dim neueordner As String
Rem der zu untersuchende pfad bzw. laufwerk
Ordnername = "L:\Experimentierordner\Testdateien"
If Ordnername = False Then Exit Sub
ChDir Ordnername
ChDir ".."
If Ordnername <> "" Then
Anzdateien = 0
intVerzeichnistiefe = 0
Pfad1 = Ordnername
If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
ReDim Verzeichnisse(0)
Verzeichnisse(0) = Pfad1
Obergrenze = UBound(Verzeichnisse)
ReDim Dateien(0)
Rekursion:
For i = Start To Obergrenze
Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
intVerzeichnistiefe = intVerzeichnistiefe + 1
Start = Start + 1
Obergrenze = UBound(Verzeichnisse)
If intVerzeichnistiefe < cVerzeichnistiefe Then GoTo Rekursion
intVerzeichnistiefe = intVerzeichnistiefe - 1
Next
Anzordner = Obergrenze + 1
If Anzordner = 0 Then
MsgBox "Es gibt nichts zu tun!", vbInformation + vbOKOnly, "Keine Ordner"
Else
For i = 0 To Anzordner - 1
neueordner = Verzeichnisse(i)
Rem habe hier den Mappe erstellen Code eingefügt
Dim strFolderName As String
Dim fldVar As Variant
Dim objFSO As Object
Dim objFolder As Object
Dim fname As String
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(neueordner)Workbooks.Add
fname = neueordner & "Liste " & objFolder.Name & " .xls"
ActiveWorkbook.SaveAs fname
Application.DisplayAlerts = False
With Application.FileSearch
.NewSearch
.LookIn = neueordner
.SearchSubFolders = False
.Filename = "*.xls"
If .Execute() > 0 Then
For zaehler = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(zaehler)
ActiveSheet.Unprotect
Set lastcell = ActiveSheet.Cells.SpecialCells(xlLastCell)
alta = lastcell.Row
a = lastcell.Row
Do While Application.CountA(Rows(a)) = 0 And a <> 1
a = a - 1
Loop
alta = a
lzeile = alta
For zaehler2 = 1 To lzeile
zaehler1 = zaehler1 + 1
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
Workbooks(1).Sheets(1).Cells(zaehler1, 4) = Workbooks(2).Sheets(1).Cells(zaehler2, 4)
Workbooks(1).Sheets(1).Cells(zaehler1, 5) = Workbooks(2).Sheets(1).Cells(zaehler2, 5)
Next zaehler2
Workbooks(2).Close
Next zaehler
End If
End With
Application.DisplayAlerts = True
Next
End If
End If
End Sub
Private Sub Verzeichnisse_suchen(ByVal Pfad As String, ByVal Arraygrenze As Long)
Dim Name1 As String
Name1 = Dir(Pfad, vbDirectory)
Do While Name1 <> ""
If Name1 <> "." And Name1 <> ".." Then
If (GetAttr(Pfad & Name1) And vbDirectory) = vbDirectory Then
Arraygrenze = Arraygrenze + 1
ReDim Preserve Verzeichnisse(Arraygrenze)
Verzeichnisse(Arraygrenze) = Pfad & Name1 & "\"
End If
End If
Name1 = Dir
Loop
End Sub
so. - und jetzt?
Gruß
mckott
Antwort 10 von nighty
hi mckott :)
bis montag abend spaetestens ist fertig,tut mir leid das diesmal etwas laenger dauert,brauche ruhe dafuer,die mir momentan genommen wird grrrr
gruss nighty
p.s.
allen noch ein schoenes wochenende
schon mal vorweg :)
1.) wennn ich im obigen macro, was von dir war? bei dem befehl
.LookIn = "L:\Experimentierordner\Testdateien"
.SearchSubFolders = False
setzt du hier true ein so ist keine begrenzung der verzeichnistiefe
2.) habe in einer zelle text stehen, der mehr als 255 zeichen hat
waere wohl schoen mehr als 255 zeichen,mach bill gates ein angebot :)
3.)
diese ,deine wuensche,werden umgesetzt
1 ersten unterordner öffnen
2 neue mappe erstellen
3 in der erstellten mappe die daten der excel dateien dieses unterordners zusammenfassen (denke das wird ähnlich obigem macro sein)
4 diese mappe in hiesigem unterordner unter dem namen "liste & namen des unterordners" abspeichern
5 die gleiche mappe in einem festgelegten ordner abspeichern wo dann alle anderen listen der folgenden unterordner auch abgespeichert werden
6 mappe schließen
7 schleife zum zweiten unterordner (bis alle rund 30 unterordner abgearbeitet sind)
8 dann eine liste erstellen wo alle daten der listen der unterordner zusammengefaßt sind (sprich das wäre dann mein testergebnis des makro des programmierers
bis montag abend spaetestens ist fertig,tut mir leid das diesmal etwas laenger dauert,brauche ruhe dafuer,die mir momentan genommen wird grrrr
gruss nighty
p.s.
allen noch ein schoenes wochenende
schon mal vorweg :)
1.) wennn ich im obigen macro, was von dir war? bei dem befehl
.LookIn = "L:\Experimentierordner\Testdateien"
.SearchSubFolders = False
setzt du hier true ein so ist keine begrenzung der verzeichnistiefe
2.) habe in einer zelle text stehen, der mehr als 255 zeichen hat
waere wohl schoen mehr als 255 zeichen,mach bill gates ein angebot :)
3.)
diese ,deine wuensche,werden umgesetzt
1 ersten unterordner öffnen
2 neue mappe erstellen
3 in der erstellten mappe die daten der excel dateien dieses unterordners zusammenfassen (denke das wird ähnlich obigem macro sein)
4 diese mappe in hiesigem unterordner unter dem namen "liste & namen des unterordners" abspeichern
5 die gleiche mappe in einem festgelegten ordner abspeichern wo dann alle anderen listen der folgenden unterordner auch abgespeichert werden
6 mappe schließen
7 schleife zum zweiten unterordner (bis alle rund 30 unterordner abgearbeitet sind)
8 dann eine liste erstellen wo alle daten der listen der unterordner zusammengefaßt sind (sprich das wäre dann mein testergebnis des makro des programmierers
Antwort 11 von nighty
hi mckott :)
war nicht so leicht :)
die tabelle sollte nur zum starten des makros benutzt werden,da sich der woorkbookNamen staendig aendert.
erklaeren brauch ich ja wohl nix da in obigen alles steht was so gewerkelt wird,ich hoffe du hast nicht so einen lansamen rechner.
gruss nighty
p.s.
an unsere lehrer :)
fremden code umzugestalten ist nicht einfach,daher buedde um nachsicht
war nicht so leicht :)
die tabelle sollte nur zum starten des makros benutzt werden,da sich der woorkbookNamen staendig aendert.
erklaeren brauch ich ja wohl nix da in obigen alles steht was so gewerkelt wird,ich hoffe du hast nicht so einen lansamen rechner.
gruss nighty
p.s.
an unsere lehrer :)
fremden code umzugestalten ist nicht einfach,daher buedde um nachsicht
Option Explicit
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pIDList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Dim Verzeichnisse()
Dim Dateien()
Dim Anzdateien As Long
Sub start()
Rem zusammenfassung
Einlesen
Rem directorys
Einlesen1
End Sub
Sub Einlesen()
Dim Ordnername
Dim Pfad1 As String
Dim Obergrenze As Long
Dim Anzordner As Long
Dim i As Long
Const cVerzeichnistiefe = 5
Dim intVerzeichnistiefe As Integer
Dim start As Long
Dim zaehler, zaehler1, zaehler2, a, alta, lzeile, lspalte
Dim lastcell As Range
Dim neueordner, neueordner1
Range("A1:iv65535").Clear
zweite:
Rem zielpfad zusammenfassung
Ordnername = "C:\test\"
If Ordnername = False Then Exit Sub
ChDir Ordnername
ChDir ".."
If Ordnername <> "" Then
Anzdateien = 0
intVerzeichnistiefe = 0
Pfad1 = Ordnername
If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
ReDim Verzeichnisse(0)
Verzeichnisse(0) = Pfad1
Obergrenze = UBound(Verzeichnisse)
ReDim Dateien(0)
Rekursion:
For i = start To Obergrenze
Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
intVerzeichnistiefe = intVerzeichnistiefe + 1
start = start + 1
Obergrenze = UBound(Verzeichnisse)
If intVerzeichnistiefe < cVerzeichnistiefe Then GoTo Rekursion
intVerzeichnistiefe = intVerzeichnistiefe - 1
Next
Anzordner = Obergrenze + 1
If Anzordner = 0 Then
MsgBox "Es gibt nichts zu tun!", vbInformation + vbOKOnly, "Keine Ordner"
Else
For i = 0 To Anzordner - 1
neueordner = Verzeichnisse(i)
Application.DisplayAlerts = False
With Application.FileSearch
.NewSearch
.LookIn = neueordner
.SearchSubFolders = False
.Filename = "*.xls"
If .Execute() > 0 Then
For zaehler = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(zaehler)
Set lastcell = ActiveSheet.Cells.SpecialCells(xlLastCell)
alta = lastcell.Row
a = lastcell.Row
Do While Application.CountA(Rows(a)) = 0 And a <> 1
a = a - 1
Loop
alta = a
lzeile = alta
For zaehler2 = 1 To lzeile
zaehler1 = zaehler1 + 1
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
Next zaehler2
Workbooks(2).Close
Next zaehler
End If
End With
If Len(neueordner) > Len(Ordnername) Then
Rem speicherpfad der zusammenfassung
ActiveWorkbook.SaveAs Filename:="c:\test3\" & "zusammenfassung.xls", FileFormat:=xlNormal _
, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
End If
Next
End If
End If
Application.DisplayAlerts = True
End Sub
Sub Einlesen1()
Dim Ordnername
Dim Pfad1 As String
Dim Obergrenze As Long
Dim Anzordner As Long
Dim i As Long
Const cVerzeichnistiefe = 5
Dim intVerzeichnistiefe As Integer
Dim start As Long
Dim zaehler, zaehler1, zaehler2, a, alta, lzeile, lspalte
Dim lastcell As Range
Dim neueordner, neueordner1
Range("A1:iv65535").Clear
Rem zielpfad der zusammenfassung einzelner directorys
Ordnername = "C:\test\"
If Ordnername = False Then Exit Sub
ChDir Ordnername
ChDir ".."
If Ordnername <> "" Then
Anzdateien = 0
intVerzeichnistiefe = 0
Pfad1 = Ordnername
If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
ReDim Verzeichnisse(0)
Verzeichnisse(0) = Pfad1
Obergrenze = UBound(Verzeichnisse)
ReDim Dateien(0)
Rekursion:
For i = start To Obergrenze
Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
intVerzeichnistiefe = intVerzeichnistiefe + 1
start = start + 1
Obergrenze = UBound(Verzeichnisse)
If intVerzeichnistiefe < cVerzeichnistiefe Then GoTo Rekursion
intVerzeichnistiefe = intVerzeichnistiefe - 1
Next
Anzordner = Obergrenze + 1
If Anzordner = 0 Then
MsgBox "Es gibt nichts zu tun!", vbInformation + vbOKOnly, "Keine Ordner"
Else
For i = 0 To Anzordner - 1
neueordner = Verzeichnisse(i)
Application.DisplayAlerts = False
With Application.FileSearch
.NewSearch
.LookIn = neueordner
.SearchSubFolders = False
.Filename = "*.xls"
If .Execute() > 0 Then
For zaehler = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(zaehler)
Set lastcell = ActiveSheet.Cells.SpecialCells(xlLastCell)
alta = lastcell.Row
a = lastcell.Row
Do While Application.CountA(Rows(a)) = 0 And a <> 1
a = a - 1
Loop
alta = a
lzeile = alta
For zaehler2 = 1 To lzeile
zaehler1 = zaehler1 + 1
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
Next zaehler2
Workbooks(2).Close
Next zaehler
End If
End With
If Len(neueordner) > Len(Ordnername) Then
For zaehler1 = Len(neueordner) - 1 To 1 Step -1
If Mid$(neueordner, zaehler1, 1) = "\" Then
neueordner1 = Mid$(neueordner, zaehler1 + 1, Len(neueordner) - zaehler1 - 1)
zaehler1 = 1
End If
Next zaehler1
Rem speicherpfad der zusammenfassung einzelner directorys
ActiveWorkbook.SaveAs Filename:="c:\test3\" & neueordner1 & ".xls", FileFormat:=xlNormal _
, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
End If
Next
Application.DisplayAlerts = True
End If
End If
End Sub
Private Sub Verzeichnisse_suchen(ByVal Pfad As String, ByVal Arraygrenze As Long)
Dim Name1 As String
Name1 = Dir(Pfad, vbDirectory)
Do While Name1 <> ""
If Name1 <> "." And Name1 <> ".." Then
If (GetAttr(Pfad & Name1) And vbDirectory) = vbDirectory Then
Arraygrenze = Arraygrenze + 1
ReDim Preserve Verzeichnisse(Arraygrenze)
Verzeichnisse(Arraygrenze) = Pfad & Name1 & "\"
End If
End If
Name1 = Dir
Loop
End Sub
Antwort 12 von nighty
hi mckott :)
war nicht so leicht :)
die tabelle sollte nur zum starten des makros benutzt werden,da sich der woorkbookNamen staendig aendert.
erklaeren brauch ich ja wohl nix da in obigen alles steht was so gewerkelt wird,ich hoffe du hast nicht so einen lansamen rechner.
gruss nighty
p.s.
an unsere lehrer :)
fremden code umzugestalten ist nicht einfach,daher buedde um nachsicht
war nicht so leicht :)
die tabelle sollte nur zum starten des makros benutzt werden,da sich der woorkbookNamen staendig aendert.
erklaeren brauch ich ja wohl nix da in obigen alles steht was so gewerkelt wird,ich hoffe du hast nicht so einen lansamen rechner.
gruss nighty
p.s.
an unsere lehrer :)
fremden code umzugestalten ist nicht einfach,daher buedde um nachsicht
Option Explicit
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pIDList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Dim Verzeichnisse()
Dim Dateien()
Dim Anzdateien As Long
Sub start()
Rem zusammenfassung
Einlesen
Rem directorys
Einlesen1
End Sub
Sub Einlesen()
Dim Ordnername
Dim Pfad1 As String
Dim Obergrenze As Long
Dim Anzordner As Long
Dim i As Long
Const cVerzeichnistiefe = 5
Dim intVerzeichnistiefe As Integer
Dim start As Long
Dim zaehler, zaehler1, zaehler2, a, alta, lzeile, lspalte
Dim lastcell As Range
Dim neueordner, neueordner1
Range("A1:iv65535").Clear
zweite:
Rem zielpfad zusammenfassung
Ordnername = "C:\test\"
If Ordnername = False Then Exit Sub
ChDir Ordnername
ChDir ".."
If Ordnername <> "" Then
Anzdateien = 0
intVerzeichnistiefe = 0
Pfad1 = Ordnername
If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
ReDim Verzeichnisse(0)
Verzeichnisse(0) = Pfad1
Obergrenze = UBound(Verzeichnisse)
ReDim Dateien(0)
Rekursion:
For i = start To Obergrenze
Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
intVerzeichnistiefe = intVerzeichnistiefe + 1
start = start + 1
Obergrenze = UBound(Verzeichnisse)
If intVerzeichnistiefe < cVerzeichnistiefe Then GoTo Rekursion
intVerzeichnistiefe = intVerzeichnistiefe - 1
Next
Anzordner = Obergrenze + 1
If Anzordner = 0 Then
MsgBox "Es gibt nichts zu tun!", vbInformation + vbOKOnly, "Keine Ordner"
Else
For i = 0 To Anzordner - 1
neueordner = Verzeichnisse(i)
Application.DisplayAlerts = False
With Application.FileSearch
.NewSearch
.LookIn = neueordner
.SearchSubFolders = False
.Filename = "*.xls"
If .Execute() > 0 Then
For zaehler = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(zaehler)
Set lastcell = ActiveSheet.Cells.SpecialCells(xlLastCell)
alta = lastcell.Row
a = lastcell.Row
Do While Application.CountA(Rows(a)) = 0 And a <> 1
a = a - 1
Loop
alta = a
lzeile = alta
For zaehler2 = 1 To lzeile
zaehler1 = zaehler1 + 1
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
Next zaehler2
Workbooks(2).Close
Next zaehler
End If
End With
If Len(neueordner) > Len(Ordnername) Then
Rem speicherpfad der zusammenfassung
ActiveWorkbook.SaveAs Filename:="c:\test3\" & "zusammenfassung.xls", FileFormat:=xlNormal _
, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
End If
Next
End If
End If
Application.DisplayAlerts = True
End Sub
Sub Einlesen1()
Dim Ordnername
Dim Pfad1 As String
Dim Obergrenze As Long
Dim Anzordner As Long
Dim i As Long
Const cVerzeichnistiefe = 5
Dim intVerzeichnistiefe As Integer
Dim start As Long
Dim zaehler, zaehler1, zaehler2, a, alta, lzeile, lspalte
Dim lastcell As Range
Dim neueordner, neueordner1
Range("A1:iv65535").Clear
Rem zielpfad der zusammenfassung einzelner directorys
Ordnername = "C:\test\"
If Ordnername = False Then Exit Sub
ChDir Ordnername
ChDir ".."
If Ordnername <> "" Then
Anzdateien = 0
intVerzeichnistiefe = 0
Pfad1 = Ordnername
If Right(Ordnername, 1) <> "\" Then Pfad1 = Pfad1 & "\"
ReDim Verzeichnisse(0)
Verzeichnisse(0) = Pfad1
Obergrenze = UBound(Verzeichnisse)
ReDim Dateien(0)
Rekursion:
For i = start To Obergrenze
Verzeichnisse_suchen Verzeichnisse(i), Obergrenze
intVerzeichnistiefe = intVerzeichnistiefe + 1
start = start + 1
Obergrenze = UBound(Verzeichnisse)
If intVerzeichnistiefe < cVerzeichnistiefe Then GoTo Rekursion
intVerzeichnistiefe = intVerzeichnistiefe - 1
Next
Anzordner = Obergrenze + 1
If Anzordner = 0 Then
MsgBox "Es gibt nichts zu tun!", vbInformation + vbOKOnly, "Keine Ordner"
Else
For i = 0 To Anzordner - 1
neueordner = Verzeichnisse(i)
Application.DisplayAlerts = False
With Application.FileSearch
.NewSearch
.LookIn = neueordner
.SearchSubFolders = False
.Filename = "*.xls"
If .Execute() > 0 Then
For zaehler = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(zaehler)
Set lastcell = ActiveSheet.Cells.SpecialCells(xlLastCell)
alta = lastcell.Row
a = lastcell.Row
Do While Application.CountA(Rows(a)) = 0 And a <> 1
a = a - 1
Loop
alta = a
lzeile = alta
For zaehler2 = 1 To lzeile
zaehler1 = zaehler1 + 1
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
Next zaehler2
Workbooks(2).Close
Next zaehler
End If
End With
If Len(neueordner) > Len(Ordnername) Then
For zaehler1 = Len(neueordner) - 1 To 1 Step -1
If Mid$(neueordner, zaehler1, 1) = "\" Then
neueordner1 = Mid$(neueordner, zaehler1 + 1, Len(neueordner) - zaehler1 - 1)
zaehler1 = 1
End If
Next zaehler1
Rem speicherpfad der zusammenfassung einzelner directorys
ActiveWorkbook.SaveAs Filename:="c:\test3\" & neueordner1 & ".xls", FileFormat:=xlNormal _
, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
End If
Next
Application.DisplayAlerts = True
End If
End If
End Sub
Private Sub Verzeichnisse_suchen(ByVal Pfad As String, ByVal Arraygrenze As Long)
Dim Name1 As String
Name1 = Dir(Pfad, vbDirectory)
Do While Name1 <> ""
If Name1 <> "." And Name1 <> ".." Then
If (GetAttr(Pfad & Name1) And vbDirectory) = vbDirectory Then
Arraygrenze = Arraygrenze + 1
ReDim Preserve Verzeichnisse(Arraygrenze)
Verzeichnisse(Arraygrenze) = Pfad & Name1 & "\"
End If
End If
Name1 = Dir
Loop
End Sub
Antwort 13 von nighty
hi alle :)
telekom war abgestuerzt,jetzt ist er zweimal da :(
gruss nighty
telekom war abgestuerzt,jetzt ist er zweimal da :(
gruss nighty
Antwort 14 von nighty
hi mckott :)
diese ist der start,nicht das uebersehen wird :)
Sub start()
Rem zusammenfassung
Einlesen
Rem directorys
Einlesen1
End Sub
gruss nighty
diese ist der start,nicht das uebersehen wird :)
Sub start()
Rem zusammenfassung
Einlesen
Rem directorys
Einlesen1
End Sub
gruss nighty
Antwort 15 von mckott
...respect.
genau so wie ich es haben wollte. :)
es hat mich fast erschlagen als ich das viele blau sah...
hab alles ausprobiert - und es haut!
danke dir nighty!
ABER noch was ... mich beschäftigt das problem mit dem 255er limit- das muß doch gehen! ich lass nicht locker.
habe gelesen, daß es möglich ist, den inhalt einer steuerelement textbox zu kopieren und die textbox kann auf alle fälle mehr als 255 zeichen enthalten und es hört hinter dem 255sten zeichen nicht mehr auf nach dem kopieren - stimmt das?
wenn ja dann mal angenommen:
in den auszulesenden/zusammenzufassenden excel dateien (die ja alle gleich in der struktur sind) ist jeweils eine steuerelement textbox mit der der, ich sag einfach mal, zelle B6 verknüft.
ist es möglich die inhalte der textboxen aller excel dateien/mappen in einem blatt in die zellen der spalte A untereinander einzulesen/oder auszulesen?
wenn ja - läßt sich das auch nach obigem system (sprich pro unterordner eine zusammenfassung desselben und eine zusammenfassung für alle) umsetzen?
...da raucht der kopf schon wieder...
gruß
mckott
genau so wie ich es haben wollte. :)
es hat mich fast erschlagen als ich das viele blau sah...
hab alles ausprobiert - und es haut!
danke dir nighty!
ABER noch was ... mich beschäftigt das problem mit dem 255er limit- das muß doch gehen! ich lass nicht locker.
habe gelesen, daß es möglich ist, den inhalt einer steuerelement textbox zu kopieren und die textbox kann auf alle fälle mehr als 255 zeichen enthalten und es hört hinter dem 255sten zeichen nicht mehr auf nach dem kopieren - stimmt das?
wenn ja dann mal angenommen:
in den auszulesenden/zusammenzufassenden excel dateien (die ja alle gleich in der struktur sind) ist jeweils eine steuerelement textbox mit der der, ich sag einfach mal, zelle B6 verknüft.
ist es möglich die inhalte der textboxen aller excel dateien/mappen in einem blatt in die zellen der spalte A untereinander einzulesen/oder auszulesen?
wenn ja - läßt sich das auch nach obigem system (sprich pro unterordner eine zusammenfassung desselben und eine zusammenfassung für alle) umsetzen?
...da raucht der kopf schon wieder...
gruß
mckott
Antwort 16 von mckott
ich nochmal...
wo hab ich die info her?
http://xlfaq.herber.de/
zitat anfang:
Gründe für den Einsatz von TextBoxes:
- Es muss damit gerechnet werden, dass das Tabellenblatt kopiert wird. Beim Kopieren von Arbeitsblättern gehen Zellinhalte, die über 255 Zeichen hinausgehen, verloren. Dieser Effekt tritt bei TextBoxes - egal welcher Art sie sind - nicht auf.
- Der TextBoxes soll ein Makro zugewiesen werden, dass beim TextBox-Klick gestartet wird. In diesem Fall ist eine TextBox aus der Zeichnen-Symbolleiste einzusetzen.
- Die TextBox soll auf Ereignisse reagieren; beispielsweise soll nur die Eingabe von Ganzzahlen zulässig sein. In diesem Fall ist eine TextBox aus der Steuerelement-ToolBox einzusetzen.
Zeichenbegrenzungen in TextBoxes:
Arbeitsblatt LongText
Es gibt versionsabhängige Beschränkungen der Anzahl der Zeichen in TextBoxes, die jedoch in der Praxis keine Rolle spielen, da die Elemente mehr Zeichen aufnehmen können, als auf einer Seite bei normalem Zoom darstellbar sind.
Während die Daten einer Steuerelement-TextBox über VBA ohne Beschränkung ein- und ausgelesen werden können, gibt es bei der Zeichnen-TextBox eine Limitation von 255 Zeichen, die allerdings wie folgt umgangen werden kann:
Einlesen in die TextBox
Der Code ist nur in der Vollversion verfügbar
Hier können Sie das Tutorial bestellen
Auslesen aus der TextBox
Der Code ist nur in der Vollversion verfügbar
Hier können Sie das Tutorial bestellen
zitat ende.
ich möchte kein tutorial bestellen weil mich die zeichnen-textbox nicht interessiert.
und zum kopieren von der steuerelement-textbox habe ich keine ahnung und auch sonst im web nichts (für mich) brauchbares gefunden...
cu
mckott
wo hab ich die info her?
http://xlfaq.herber.de/
zitat anfang:
Gründe für den Einsatz von TextBoxes:
- Es muss damit gerechnet werden, dass das Tabellenblatt kopiert wird. Beim Kopieren von Arbeitsblättern gehen Zellinhalte, die über 255 Zeichen hinausgehen, verloren. Dieser Effekt tritt bei TextBoxes - egal welcher Art sie sind - nicht auf.
- Der TextBoxes soll ein Makro zugewiesen werden, dass beim TextBox-Klick gestartet wird. In diesem Fall ist eine TextBox aus der Zeichnen-Symbolleiste einzusetzen.
- Die TextBox soll auf Ereignisse reagieren; beispielsweise soll nur die Eingabe von Ganzzahlen zulässig sein. In diesem Fall ist eine TextBox aus der Steuerelement-ToolBox einzusetzen.
Zeichenbegrenzungen in TextBoxes:
Arbeitsblatt LongText
Es gibt versionsabhängige Beschränkungen der Anzahl der Zeichen in TextBoxes, die jedoch in der Praxis keine Rolle spielen, da die Elemente mehr Zeichen aufnehmen können, als auf einer Seite bei normalem Zoom darstellbar sind.
Während die Daten einer Steuerelement-TextBox über VBA ohne Beschränkung ein- und ausgelesen werden können, gibt es bei der Zeichnen-TextBox eine Limitation von 255 Zeichen, die allerdings wie folgt umgangen werden kann:
Einlesen in die TextBox
Der Code ist nur in der Vollversion verfügbar
Hier können Sie das Tutorial bestellen
Auslesen aus der TextBox
Der Code ist nur in der Vollversion verfügbar
Hier können Sie das Tutorial bestellen
zitat ende.
ich möchte kein tutorial bestellen weil mich die zeichnen-textbox nicht interessiert.
und zum kopieren von der steuerelement-textbox habe ich keine ahnung und auch sonst im web nichts (für mich) brauchbares gefunden...
cu
mckott
Antwort 17 von nighty
hi mckott :)
dies ueber textboxen zu gestalten ist auch recht umfangreich,zudem ich damit noch nie gearbeitet habe,daher muss ich leider passen.
vielleicht haben ja andere user noch ideen
gruss nighty
dies ueber textboxen zu gestalten ist auch recht umfangreich,zudem ich damit noch nie gearbeitet habe,daher muss ich leider passen.
vielleicht haben ja andere user noch ideen
gruss nighty
Antwort 18 von mckott
hi nighty!
weißt du warum ich mich mit dem gedanken der textbox verrannt habe?
habe mich noch beim herberforum erkundigt und bekam die erkenntnis, dass hinter
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
ein .value fehlt...........
und wenn das dann so aussieht:
Workbooks(1).Sheets(1).Cells(zaehler1, 1).Value = Workbooks(2).Sheets(1).Cells(zaehler2, 1).Value
Workbooks(1).Sheets(1).Cells(zaehler1, 2).Value = Workbooks(2).Sheets(1).Cells(zaehler2, 2).Value
Workbooks(1).Sheets(1).Cells(zaehler1, 3).Value = Workbooks(2).Sheets(1).Cells(zaehler2, 3).Value
----> dann wird auch alles kopiert und die zeichen nicht hinter dem 255sten abgeschnitten!
...und die ganze sache mit der steuerbox hat sich erledigt.
gruß
mckott
weißt du warum ich mich mit dem gedanken der textbox verrannt habe?
habe mich noch beim herberforum erkundigt und bekam die erkenntnis, dass hinter
Workbooks(1).Sheets(1).Cells(zaehler1, 1) = Workbooks(2).Sheets(1).Cells(zaehler2, 1)
Workbooks(1).Sheets(1).Cells(zaehler1, 2) = Workbooks(2).Sheets(1).Cells(zaehler2, 2)
Workbooks(1).Sheets(1).Cells(zaehler1, 3) = Workbooks(2).Sheets(1).Cells(zaehler2, 3)
ein .value fehlt...........
und wenn das dann so aussieht:
Workbooks(1).Sheets(1).Cells(zaehler1, 1).Value = Workbooks(2).Sheets(1).Cells(zaehler2, 1).Value
Workbooks(1).Sheets(1).Cells(zaehler1, 2).Value = Workbooks(2).Sheets(1).Cells(zaehler2, 2).Value
Workbooks(1).Sheets(1).Cells(zaehler1, 3).Value = Workbooks(2).Sheets(1).Cells(zaehler2, 3).Value
----> dann wird auch alles kopiert und die zeichen nicht hinter dem 255sten abgeschnitten!
...und die ganze sache mit der steuerbox hat sich erledigt.
gruß
mckott
Antwort 19 von nighty
hi mckott :)
soweit ich weiss ist dies eigentlich nur fuer excel 95 zwingend :)
hast du etwa dieses MUSEUMSTUECK :)))
na dann hast du ja glueck,viel spass dann noch :))
gruss nighty
soweit ich weiss ist dies eigentlich nur fuer excel 95 zwingend :)
hast du etwa dieses MUSEUMSTUECK :)))
na dann hast du ja glueck,viel spass dann noch :))
gruss nighty
Antwort 20 von mckott
hi nighty,
excel 2000 zwingt dich und mich zu solchen aktionen...
dir auch noch viel spaß!
cu
mckott
excel 2000 zwingt dich und mich zu solchen aktionen...
dir auch noch viel spaß!
cu
mckott
Antwort 21 von nighty
hi mckott :)
gut zu wissen,moechtest du nicht meine ca. 230 makros umschreiben grrrr,also wieder was gelernt,demnaechst alle mit value :))))
gruss nighty
gut zu wissen,moechtest du nicht meine ca. 230 makros umschreiben grrrr,also wieder was gelernt,demnaechst alle mit value :))))
gruss nighty

