Excel 2007 - Werte aus mehreren Dateien per Makro auslesen und in Übersichtstabelle einfügen
Hallo liebe Gemeinde, bitte um Mithilfe um grundlegende Daten aus mehreren Dateien in eine Übersicht zusammenzufassen...
Folgende Situation:
Im Zuge von Rechnungsprüfungen erhält jede Firma eine Prüfberichtsdatei. Diese liegen gesammelt in einem Ordner.
In einer neuen Datei (Kostenübersicht) sollten nun Informationen aus den Prüfberichtdateien zu einer Kostennummer zugeordnet werden.
Die Prüfberichtsdateien sind immer gleich aufgebaut. Alle relevanten Daten die zu übertragen sind, befinden sich in Tabelle 1.
In der Zeile H7 ist immer die zugeordnete Kostennummer eingetragen.
Nun sollen zusätzliche Information (Auftragsvolumen in H29, abgerechnete Kosten in H33 etc.) in die Kostenübersichtsdatei übertragen werden.
Die Kostenübersicht ist wie folgt aufgebaut.
Spalte A, pro Zeile immer eine Kostennummer, als Bsp. 0 - 1000.
Spalte B, C, sollte dann Informationen über Auftragsvolumen, abgerechnete Kosten beinhalten.
Das Makro sollte also, aufgrund der Kostennummer, als Beispiel, "500", alle Prüfberichte in einem separaten Ordner nach der Firma mit der Kostennummer "500" durchsuchen und die Werte von H29, H33 etc. in die richtige Zeile der Kostenverfolgungsdatei übertragen - sprich
A500 (Kostennummer 500) - B500 (Auftragsvolumen aus H29) - C500 (abgerechnete Kosten aus H33)
Ich hoffe das war mal so weit verständlich.
Was vlt. noch zusätzlich das Ganze verheikeln könnte, es kann vorkommen das 2 Firmen zu einer Kostennummer arbeiten - Ergot sollte in der Kostenverfolgungsdatei, dann z.B. unter 500 die Daten von Firma A & B addiert werden.
Falls die Dateinamen der Prüfberichte noch eine Relevanz spielen, diese sind immer gleich aufgebaut, da mittels Makro bezeichnet & abgespeichert:
Projektnummer_Prüfbericht_Kostennummer_KostennummeralsZahl_Kostennummerbeschreibung_Firmenname.xlsm
als Beispiel
105_Prüfbericht_Kostennummer_500_Sonstiges_Microsoft.xlsm
Ich bitte um eure Mithilfe, bin in VBA nicht wirklich bewandert. (Das automatische bezeichnen einer Datei und dem Speichern hab ich mir auch über Google holen müssen...)
Folgende Situation:
Im Zuge von Rechnungsprüfungen erhält jede Firma eine Prüfberichtsdatei. Diese liegen gesammelt in einem Ordner.
In einer neuen Datei (Kostenübersicht) sollten nun Informationen aus den Prüfberichtdateien zu einer Kostennummer zugeordnet werden.
Die Prüfberichtsdateien sind immer gleich aufgebaut. Alle relevanten Daten die zu übertragen sind, befinden sich in Tabelle 1.
In der Zeile H7 ist immer die zugeordnete Kostennummer eingetragen.
Nun sollen zusätzliche Information (Auftragsvolumen in H29, abgerechnete Kosten in H33 etc.) in die Kostenübersichtsdatei übertragen werden.
Die Kostenübersicht ist wie folgt aufgebaut.
Spalte A, pro Zeile immer eine Kostennummer, als Bsp. 0 - 1000.
Spalte B, C, sollte dann Informationen über Auftragsvolumen, abgerechnete Kosten beinhalten.
Das Makro sollte also, aufgrund der Kostennummer, als Beispiel, "500", alle Prüfberichte in einem separaten Ordner nach der Firma mit der Kostennummer "500" durchsuchen und die Werte von H29, H33 etc. in die richtige Zeile der Kostenverfolgungsdatei übertragen - sprich
A500 (Kostennummer 500) - B500 (Auftragsvolumen aus H29) - C500 (abgerechnete Kosten aus H33)
Ich hoffe das war mal so weit verständlich.
Was vlt. noch zusätzlich das Ganze verheikeln könnte, es kann vorkommen das 2 Firmen zu einer Kostennummer arbeiten - Ergot sollte in der Kostenverfolgungsdatei, dann z.B. unter 500 die Daten von Firma A & B addiert werden.
Falls die Dateinamen der Prüfberichte noch eine Relevanz spielen, diese sind immer gleich aufgebaut, da mittels Makro bezeichnet & abgespeichert:
Projektnummer_Prüfbericht_Kostennummer_KostennummeralsZahl_Kostennummerbeschreibung_Firmenname.xlsm
als Beispiel
105_Prüfbericht_Kostennummer_500_Sonstiges_Microsoft.xlsm
Ich bitte um eure Mithilfe, bin in VBA nicht wirklich bewandert. (Das automatische bezeichnen einer Datei und dem Speichern hab ich mir auch über Google holen müssen...)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 203811
Url: https://administrator.de/forum/excel-2007-werte-aus-mehreren-dateien-per-makro-auslesen-und-in-uebersichtstabelle-einfuegen-203811.html
Ausgedruckt am: 28.04.2025 um 13:04 Uhr
7 Kommentare
Neuester Kommentar

Hallo karatikus!
Um die Kostennummern in die richtigen Zeilen zu bringen, ist es sinnvoller, die Kostennummern als Zeilennummer zu verwenden bzw. Zeile = Kostennummer + Startzeile (Kostennummer ab 0).
Deine Anmerkung, dass die Kostennummer in die entsprechende Zeile soll, ist nicht ganz nachvollziehbar, da es zum ersten keine Zeile 0 (Kostennummer=0) gibt und zum anderen die Startzeile bei 7 beginnt?
In meinem Code werden die Kostennummern ab der Startzeile eingefügt, von daher ist es unerheblich, ob die Kostennummern nun bei 0 oder 1 beginnt. D.h. die Kostennummer 0 Landet in Zeile 7, die 1 in Zeile 8, die 500 Zeile 507...
Die Leerzeilen werden am Ende durch ein Sort nach Kostennummer eliminiert...
Gruß Dieter
Nun sollen zusätzliche Information (Auftragsvolumen in H29, abgerechnete Kosten in H33 etc.) in die Kostenübersichtsdatei übertragen werden.
Spalte B, C, sollte dann Informationen über Auftragsvolumen, abgerechnete Kosten beinhalten.
Dies ist unstimmig, weil die Zellen H29/H33 in Deinem Code in Zelle Spalte D/E landen.Spalte B, C, sollte dann Informationen über Auftragsvolumen, abgerechnete Kosten beinhalten.
Um die Kostennummern in die richtigen Zeilen zu bringen, ist es sinnvoller, die Kostennummern als Zeilennummer zu verwenden bzw. Zeile = Kostennummer + Startzeile (Kostennummer ab 0).
Deine Anmerkung, dass die Kostennummer in die entsprechende Zeile soll, ist nicht ganz nachvollziehbar, da es zum ersten keine Zeile 0 (Kostennummer=0) gibt und zum anderen die Startzeile bei 7 beginnt?
In meinem Code werden die Kostennummern ab der Startzeile eingefügt, von daher ist es unerheblich, ob die Kostennummern nun bei 0 oder 1 beginnt. D.h. die Kostennummer 0 Landet in Zeile 7, die 1 in Zeile 8, die 500 Zeile 507...
Die Leerzeilen werden am Ende durch ein Sort nach Kostennummer eliminiert...
Option Explicit
Option Compare Text
Const iStartZeile = 7
Const sFolder = "C:\Prüfberichte"
Sub GetBKPData()
Dim Wkb As Workbook, oFso As Object, oFile As Object
Dim aQCells As Variant, iEndZeile As Long, iZeile As Long, i As Integer
Set oFso = CreateObject("Scripting.FileSystemObject") 'Dateisystem-Operationen
With Application
.ScreenUpdating = False 'Bildschirmaktualisierung aus
.AskToUpdateLinks = False 'Verknüpfung (Name aus Übersicht) ohne Abfrage aktualisieren
.DisplayAlerts = False 'Fehlermeldung "Verknüpfung kann nicht..." unterdrücken
End With
'Zell-Adressen in Array splitten
aQCells = Split("H7,D7,D8,H29,H33,F46,H41,H42,H4", ",") 'Enspricht Spalte A, B, C, D, E, F, G, H, I
'Letzte Zeile in Spalte A ermitteln
iEndZeile = Cells(Rows.Count, "A").End(xlUp).Row
'Zellinhalte ab Startzeile bis Copy-Spaltenanzahl (aQCells) löschen
Range(Cells(iStartZeile, "A"), Cells(iEndZeile, UBound(aQCells) + 1)).Cells.Clear
For Each oFile In oFso.GetFolder(sFolder).Files
If oFso.GetExtensionName(oFile.Name) Like "xlsm" And oFso.GetBaseName(oFile.Name) Like "*2011-30*" Then
Set Wkb = GetObject(oFile.Path) '2011-30 kommt in der *.xlsm immer vor, da Projektnummer
With Wkb.Sheets(1) 'Werte mit Zahlenformat
iZeile = .Range("H7").Value + iStartZeile 'Zeile = Kostennummer + Startzeile
If IsEmpty(Cells(iZeile, "A")) Then 'Test Kostennummer noch nicht erfasst
'Zellen kopieren und einfügen
For i = 0 To UBound(aQCells)
.Range(Trim(aQCells(i))).Copy
Cells(iZeile, "A").Offset(0, i).PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Next
Else
'Spalte D/E aufaddieren
Cells(iZeile, "D").Value = Cells(iZeile, "D").Value + .Range("H29").Value
Cells(iZeile, "E").Value = Cells(iZeile, "E").Value + .Range("H33").Value
End If
End With
Wkb.Close False
End If
Next
'Letzte Zeile in Spalte A ermitteln
iEndZeile = Cells(Rows.Count, "A").End(xlUp).Row
'Zellinhalte ab Startzeile bis Copy-Spaltenanzahl (aQCells) sortieren
Range(Cells(iStartZeile, "A"), Cells(iEndZeile, UBound(aQCells) + 1)).Sort _
Key1:=Cells(iStartZeile, "A"), Header:=xlNo, Orientation:=xlTopToBottom
With Application
.DisplayAlerts = True
.AskToUpdateLinks = True
.ScreenUpdating = True
End With
ThisWorkbook.Save: MsgBox "Fertig", vbInformation, "Alle Daten eingelesen"
End Sub
Gruß Dieter

Hallo karatikus!

Und sind vorm Punkt immer 3 Zeichen oder können das auch mehr sein?
Gruß Dieter
Danke Dieter das du dir die Sache angesehen hast und auch großen Dank für den einfacheren Quellcode als wie mein zusammengestoppeltes Werk.
War ja für den Anfang gar nicht so schlechtDie Nummern von Hauptgruppen & Leistungsuntergruppen kommen nie in einem Prüfbericht vor, da diese nur die Summen aus den Kostennummern addieren. Eine Kostennummer ist daher immer mindestens 3-stellig + "." . z.B.: "215." "215.1" 215." etc...
Wobei mir nicht ganz klar ist, ob die '215." und "215.1" unterschiedliche Kostennummern darstellen?Und sind vorm Punkt immer 3 Zeichen oder können das auch mehr sein?
Gruß Dieter

Hallo karatikus!
Dann versuchs mal hiermit:
Gruß Dieter
Dann versuchs mal hiermit:
Option Explicit
Option Compare Text
Const sFolder = "C:\Prüfberichte" 'Datei-Pfad Berichte
Const sFileName = "*2011-30*" 'Datei-Name enthält
Const sFileType = "xlsm" 'Datei-Erweiterung
Const iStartZeile = 7 'Ab Zeile ?
Const sFilter = "=???.*" 'Kostennummer = 3 Zeichen + Punkt und keine/weitere Zeichen
Const Msg1 = "Alle Daten eingelesen!"
Const Err1 = "Kostennummer (%1) in der Übersicht nicht gefunden!"
Sub GetBKPData()
Dim Wkb As Workbook, oFso As Object, oFile As Object, oFound As Range
Dim aQCells As Variant, iEndZeile As Long, iZeile As Long, i As Integer
Set oFso = CreateObject("Scripting.FileSystemObject") 'Dateisystem-Operationen
With Application
.ScreenUpdating = False 'Bildschirmaktualisierung aus
.AskToUpdateLinks = False 'Verknüpfung (Name aus Übersicht) ohne Abfrage aktualisieren
.DisplayAlerts = False 'Fehlermeldung "Verknüpfung kann nicht..." unterdrücken
End With
'Copy-Zell-Adressen in Array splitten
aQCells = Split("D7,D8,H29,H33,F46,H41,H42,H4", ",") 'Entspricht Spalte B, C, D, E, F, G, H, I
Call CleanUp(UBound(aQCells))
For Each oFile In oFso.GetFolder(sFolder).Files
If oFso.GetExtensionName(oFile.Name) Like sFileType And oFso.GetBaseName(oFile.Name) Like sFileName Then
Set Wkb = GetObject(oFile.Path) '2011-30 kommt in der *.xlsm immer vor, da Projektnummer
With Wkb.Sheets(1) 'Werte mit Zahlenformat
Set oFound = Range("A:A").Find(.Range("H7").Value, LookIn:=xlValues, LookAt:=xlWhole)
If oFound Is Nothing Then
MsgBox Replace(Err1, "%1", .Range("H7").Value), vbExclamation, "Fehler . . ."
Else
iZeile = oFound.Row
If IsEmpty(Cells(iZeile, "D")) Then 'Test Auftrags-Volumen Leer
'Zellen kopieren und einfügen
For i = 0 To UBound(aQCells)
.Range(Trim(aQCells(i))).Copy
Cells(iZeile, "B").Offset(0, i).PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Next
Else
'Spalte D/E aufaddieren
Cells(iZeile, "D").Value = Cells(iZeile, "D").Value + .Range("H29").Value
Cells(iZeile, "E").Value = Cells(iZeile, "E").Value + .Range("H33").Value
End If
End If
End With
Wkb.Close False
End If
Next
'Sort weggelassen, scheint mir überflüssig zu sein
With Application
.DisplayAlerts = True
.AskToUpdateLinks = True
.ScreenUpdating = True
End With
ThisWorkbook.Save: MsgBox Msg1, vbInformation, "Datenimport . . ."
End Sub
'Mit dieser Funktion werden die Zellinhalte nur in den Zeilen mit Kostennummern (ab Spalte B)
'entsprechend dem Such-Kriterium 3 Zeichen + '.' + keine/weitere Zeichen (???.*) gelöscht
Private Sub CleanUp(ByVal iColOffset)
Dim iEndZeile As Long
ActiveSheet.AutoFilterMode = False
iEndZeile = Cells(Rows.Count, "A").End(xlUp).Row
With Range(Cells(iStartZeile - 1, "A"), Cells(iEndZeile, "A"))
.AutoFilter Field:=1, Criteria1:=sFilter, Operator:=xlAnd, VisibleDropDown:=False
End With
Range(Cells(iStartZeile, "B"), Cells(iEndZeile, "B").Offset(0, iColOffset)).Cells.Clear
ActiveSheet.AutoFilterMode = False
End Sub
Gruß Dieter