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

Inhalte aller .xls* in einem Blatt zusammenführen

Inhalte aller .xls* in einem Blatt zusammenführen
27.10.2017 00:19:54
Benji
Sehr geehrte Excel-Freunde,
Ich habe mal wieder ein Problem bei dem Ich auch nach mehreren Versuchen und längerem Suchen nicht wirklich weiter komme. (Wahrscheinlich stell Ich mich nur etwas dämlich).
Ich nutze folgenden Code um alle .xls* Dateien in einem Blatt zusammenzuführen.
Sub Import()
' Alle *.xls* eines Verzeichnisses in 1 (das aktuelle) Sheet importieren
Dim FullName As String
Dim wbkZiel As Workbook
Dim z As Integer  'Zähler für Durchläufe
On Error GoTo ErrorHandler
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.AskToUpdateLinks = False
.DisplayAlerts = False
.EnableEvents = False
End With
Const Pfad = "C:\Test\" '*** ANPASSEN ***
Const Extension = "*.xls*"       '*** ANPASSEN ***
Const MitKopfzeile = False        '*** ANPASSEN ***
FullName = Dir(Pfad & Extension)
'Prüfung, ob Ziel-Sheet leer ist
If WorksheetFunction.CountA(Cells) > 0 Then
If MsgBox("Das Tabellenblatt ist nicht leer," & vbCrLf _
& "sollen die Daten gelöscht werden?", vbCritical + vbYesNo, _
"Warn-Hinweis") = vbYes Then
Cells.Delete
Else
z = 1
End If
End If
Do While FullName  ""
Call CopyData(Pfad & FullName, MitKopfzeile, z)
FullName = Dir
z = z + 1
Loop
ErrorHandler:
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.AskToUpdateLinks = True
.DisplayAlerts = True
.EnableEvents = True
End With
Dim intRow As Integer, intLastRow As Integer
intLastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
For intRow = intLastRow To 1 Step -1
If Application.CountA(Rows(intRow)) = 0 Then
intLastRow = intLastRow - 1
Else
Exit For
End If
Next intRow
For intRow = intLastRow To 1 Step -1
If IsEmpty(Cells(intRow, 1)) Then
Rows(intRow).Delete
End If
Next intRow
End Sub
Das funktioniert soweit auch wunderbar. Allerdings nur in dem angegeben Ordner.
Ich würde gerne wissen wie Ich das ganze umbauen kann, sodass die Unterordner mit einbezogen werden?
Bin auf folgenden Lösungsansatz gestossen

Const sSourcePath As String = "C:\Test"
Dim fso as Object, oFile as Object
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oFile In fso.GetFolder(sSourcePath).Files
If LCase(Right(oFile.Name, 4)) = ".xls" Then
Application.Workbooks.Open (oFile.Path)
End If
Next
Allerdings stell ich mich leider zu dumm, als dass Ich diesen Vorschlag auf mein Problem anwenden könnte. Ich bin für jede Hilfe dankbar.
Grüße Benni

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Inhalte aller .xls* in einem Blatt zusammenführen
27.10.2017 05:54:32
fcs
Hallo Benni,
mit der "einfachen" Variante von dir erfasst man die Unterordner noch nicht. Dazu muss dieses Makro rekursiv mit den Unterordnern aufgerufen werden.
Hier ist es "einfacher" die Namen der gesuchten Dateien in einem Datenarray zu sammeln und dann diese Dateiliste abzuarbeiten.
Gruß
Franz
Option Explicit
'Quelle: https://www.herber.de/forum
'Modifiziert: fcs 2017-10-27
Public glngFile As Long, garrFiles() As String
Sub ListFilesInFolder(ByVal SourceFolderName As String, _
Optional DateiFormat As String = "*.*", _
Optional IncludeSubfolders As Boolean = False)
'Makro erstellt entsprechend den Parametern ein Daten-Array mit den Namen _
der Dateien im Verzeichnis, ggf. inkl. Unterverzeichnissen
'1.Parameter Ordner, wo soll gesucht werden?
'2.Parameter Dateifilter, ggf. * als Platzhalter verwenden
'3.Parameter mit Unterordner = True, False ist ohne
'Erstellt gemäß Suchkriterien ein Array mit den Dateinamen - inklusive Pfad
Dim FSO As Object, SourceFolder As Object, SubFolder As Object
Dim FileItem
Dim Status As Integer
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.GetFolder(SourceFolderName)
On Error GoTo Err_Zugriff: 'sollte Ordner geschützt sein
For Each FileItem In SourceFolder.Files
If LCase(FileItem.Name) Like LCase(DateiFormat) Then
glngFile = glngFile + 1
ReDim Preserve garrFiles(1 To glngFile)
'Pfad\Dateiname
garrFiles(glngFile) = FileItem.Path
End If
Next FileItem
If IncludeSubfolders Then
For Each SubFolder In SourceFolder.SubFolders
ListFilesInFolder SubFolder.Path, DateiFormat, IncludeSubfolders
Next SubFolder
End If
Err_Zugriff:
Set FileItem = Nothing: Set SourceFolder = Nothing: Set FSO = Nothing
End Sub
Sub Import()
' Alle *.xls* eines Verzeichnisses in 1 (das aktuelle) Sheet importieren
Dim FullName As String
Dim wbkZiel As Workbook
Dim z As Integer  'Zähler für Durchläufe
Dim lngFile As Long
On Error GoTo ErrorHandler
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.AskToUpdateLinks = False
.DisplayAlerts = False
.EnableEvents = False
End With
Const Pfad = "C:\Test\" '*** ANPASSEN ***
Const Extension = "*.xls*"       '*** ANPASSEN ***
Const MitKopfzeile = False        '*** ANPASSEN ***
'Dateiliste zurücksetzen
glngFile = 0
Erase garrFiles
'Dateiliste erstellen
Call ListFilesInFolder(SourceFolderName:=Pfad, _
DateiFormat:=Extension, _
IncludeSubfolders:=True)
If glngFile = 0 Then
MsgBox "Keine Excel-Dateien im Verzeichnis """ & Pfad & """ gefunden!"
goto ErrorHandler
End If
'Prüfung, ob Ziel-Sheet leer ist
If WorksheetFunction.CountA(Cells) > 0 Then
If MsgBox("Das Tabellenblatt ist nicht leer," & vbCrLf _
& "sollen die Daten gelöscht werden?", vbCritical + vbYesNo, _
"Warn-Hinweis") = vbYes Then
Cells.Delete
Else
z = 1
End If
End If
'Dateiliste abarbeiten
For lngFile = 1 To glngFile
FullName = garrFiles(lngFile)
Call CopyData(FullName, MitKopfzeile, z)
z = z + 1
Next
'Dateiliste zurücksetzen
glngFile = 0
Erase garrFiles
ErrorHandler:
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.AskToUpdateLinks = True
.DisplayAlerts = True
.EnableEvents = True
End With
Dim intRow As Integer, intLastRow As Integer
intLastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
For intRow = intLastRow To 1 Step -1
If Application.CountA(Rows(intRow)) = 0 Then
intLastRow = intLastRow - 1
Else
Exit For
End If
Next intRow
For intRow = intLastRow To 1 Step -1
If IsEmpty(Cells(intRow, 1)) Then
Rows(intRow).Delete
End If
Next intRow
End Sub

Anzeige
Besten Dank!
27.10.2017 14:57:53
Benji
Hallo Franz,
vielen Dank für deine Mühe und die schnelle Antwort.
Ich wär da nie drauf gekommen. Es fehlen mir dann leider doch die Kenntnisse.
Funktioniert einwandfrei!
besten Dank,
Benni

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige