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

Zusammenführen von Daten mit Dateiname

Zusammenführen von Daten mit Dateiname
17.11.2017 11:07:51
Daten
Guten Tag liebe Excel-Freunde,
Ich hatte bei folgendem Thread bereits Hilfe erhalten und würde dieses Makro gern noch erweitern.
https://www.herber.de/cgi-bin/callthread.pl?index=1588122#1588122
Es ging darum Daten aller Dateien von einem Pfad inkl. Unterordner in einer Datei zusammenzuführen. Dies klappt auch wunderbar. Jetzt würde ich gern noch jede Zeile mit dem Dateinamen erweitern, aus welcher dieser Datensatz stammt.
Das Ausgangsmakro wäre also wie folgt
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

Vorab schon mal vielen Dank für die Bemühungen und Eure Hilfe.
Gruß Benni

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zusammenführen von Daten mit Dateiname
17.11.2017 12:52:28
Daten
Hallo Benny,
das Einfügen des Dateinamens musst du in dein Makro "CopyData" einbauen.
Da dieses Makro in deiner Frage fehlt kann eine genaue Hilfe nicht gegeben werden.
Mögliche Anweisung:
   ActiveSheet.Cells(z, Spalte).Value = Mid(Fullname, InstrRev(Fullname,"\")+1)

Für Spalte musst dann die passende Nummer der Spalte angeben wo der Dateiname stehen soll.
Gruß
Franz
Ergänzung CopyData
17.11.2017 13:41:57
Benji
Hallo Franz,
ja man sollte nicht immer alles schnell nebenbei schreiben =)
zur Ergänzung:
Sub CopyData(FullName As String, MitKopfzeile As Boolean, z As Integer)
Dim wbkImp As Workbook, wbkDst As Workbook
Dim wksImp As Worksheet, wksDst As Worksheet
Dim fRow As Integer
Dim lRow As Long, lCol As Integer
Dim wbk As Workbook
Dim aData()
On Error GoTo ErrorHandler
Call EventsOff ' Meldungen unterdrücken
If MitKopfzeile Then    '1. Durchlauf mit Kopfzeilen, dann ohne
fRow = IIf(z = 0, 1, 2)
Else     'Keine Kopfzeile vorhanden, also immer ab 1. Zeile
fRow = 11
End If
'Quelldatei öffnen und Daten in Array kopieren
Set wbkDst = ActiveWorkbook
Set wksDst = ActiveSheet
Workbooks.Open Filename:=FullName
Set wbkImp = ActiveWorkbook
Set wksImp = wbkImp.Sheets(1) 'Bei Bedarf anpasen
lRow = LastRowAll(wksImp)
lCol = LastColAll(wksImp)
aData = wksImp.Range(Cells(fRow, 1), Cells(lRow, lCol))
wbkImp.Close
Set wbkImp = Nothing
'In die Zieldatei schreiben
lRow = LastRowAll(wksDst) + Abs(CInt(z > 0))
wksDst.Range("A" & lRow).Resize(UBound(aData), lCol) = aData()
ErrorHandler:
If Not wbk Is Nothing Then
Workbooks(wbkImp).Close
End If
Call EventsOn ' Meldungen aktivieren
End Sub
Gruß Benni
Anzeige
AW: Ergänzung CopyData
17.11.2017 15:50:46
fcs
Hallo Benny,
Ergänzung Dateiname sollte so funktionieren
Zeile in die ggf. ein zusätzlicher Spaltentitel eingetragen werden soll = ?
Scheint wohl davon abzuhängen, ob mit oder ohne Kopfzeilen importiert wird - aber ich hab keine Zeit das jetzt noch auszutüfteln.
Gruß
Franz
Sub CopyData(FullName As String, MitKopfzeile As Boolean, z As Integer)
Dim wbkImp As Workbook, wbkDst As Workbook
Dim wksImp As Worksheet, wksDst As Worksheet
Dim fRow As Integer
Dim lRow As Long, lCol As Integer
Dim wbk As Workbook
Dim aData()
Dim sName As String
On Error GoTo ErrorHandler
Call EventsOff ' Meldungen unterdrücken
If MitKopfzeile Then    '1. Durchlauf mit Kopfzeilen, dann ohne
fRow = IIf(z = 0, 1, 2)
Else     'Keine Kopfzeile vorhanden, also immer ab 1. Zeile
fRow = 11
End If
'Quelldatei öffnen und Daten in Array kopieren
Set wbkDst = ActiveWorkbook
Set wksDst = ActiveSheet
Workbooks.Open Filename:=FullName
Set wbkImp = ActiveWorkbook
Set wksImp = wbkImp.Sheets(1) 'Bei Bedarf anpasen
lRow = LastRowAll(wksImp)
lCol = LastColAll(wksImp)
aData = wksImp.Range(Cells(fRow, 1), Cells(lRow, lCol))
sName = wbkImp.Name 'Dateiname Import-Datei merken
wbkImp.Close
Set wbkImp = Nothing
'In die Zieldatei schreiben
lRow = LastRowAll(wksDst) + Abs(CInt(z > 0))
wksDst.Range("A" & lRow).Resize(UBound(aData), lCol) = aData()
'Dateinamen ergänzen
With wksDst
'.Cells(1, lCol + 1).Value = "Dateiname" 'Spaltentitel nachtragen Zeile?
.Range(.Cells(lRow, lCol + 1), .Cells(lRow + UBound(aData) - 1, lCol + 1)).Value =  _
sName
.Columns(lCol + 1).AutoFit
End With
ErrorHandler:
If Not wbk Is Nothing Then
Workbooks(wbkImp).Close
End If
Call EventsOn ' Meldungen aktivieren
End Sub

Anzeige
Genau so. Besten Dank!
20.11.2017 17:43:42
Benji
Hallo Franz,
bin leider erst jetzt dazu gekommen.
Funktioniert so einwandfrei für mich. Die Kopfzeilen benötige ich für den aktuellen Fall, bei dem Ich es anwende, nicht.
Vielen Dank & Gruß
Benni

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige