Daten aus verschiedenen Dateien in einer "Masterdatei" summieren
#1
Liebes Excelteam,

wir bräuchten eure Hilfe beim Erstellen eines Summen-"Mastersheets". Folgende Situation:

Wir haben 50 Mitarbeitende, welche über einen Zeitraum von einem Jahr einen sogenannten "Rapport" (Arbeitszeiterfassung) per Excel ausgefüllt haben. Die Studierenden haben dabei in 12 verschiedenen Tabellen (pro Monat eine Datei) ihre Zeit inkl. Kostenstelle rapportiert. Pro Tabelle gibt es einen Reiter "Summe", welcher die Kostenstellen dieses Rapportes zusammenführt. Zu Controllingzwecken würden wir nun gerne eine Abrechnung machen, welche all diese Summen (also 12x50 Dateien) in nur einer Excel-Datei zusammenfasst. Um die Struktur des Summensheets sowie die Dateibeschriftungslogik zu verstehen, haben wir euch mal vier Musterdateien angehängt. Aus Datenschutzgründen können wir leider die anderen Blätter der Dateien nicht teilen - wir denken aber, dass diese dafür nicht sondernlich relevant sind.

Da niemand von uns Erfahrungen mit tieferen Excelfunktionen (z.B. Makros) hat, dachten wir, dass wir hier an der richtigen Stelle sind!

Wir freuen uns auf eure Rückmeldungen!

Ps.: Könnte es eventuell ein Problem sein, dass die Spalte "Kostenstellen" nicht als solche betitelt ist? Leider ist dies ein Fehler, der sich nicht so leicht beheben lässt.


Angehängte Dateien
.xlsx   dmu_gerlinde.musterfrau_19_09-10.xlsx (Größe: 39,55 KB / Downloads: 6)
.xlsx   dmu_gerlinde.musterfrau_19_10-11.xlsx (Größe: 39,55 KB / Downloads: 15)
.xlsx   dmu_max.mustermann_19_09-10.xlsx (Größe: 39,55 KB / Downloads: 8)
.xlsx   dmu_max.mustermann_19_10-11.xlsx (Größe: 39,55 KB / Downloads: 5)
Top
#2
Hallo,

wenn ich deine Datei aufrufe, sehe ich sehr viele Bezugsfehler.
Gruß Stefan
Win 10 / Office 2016
Top
#3
Danke für deine Antwort! Ich habe nun die Felder mit Daten gefüllt.

LG


Angehängte Dateien
.xlsx   dmu_gerlinde.musterfrau_19_09-10.xlsx (Größe: 37,47 KB / Downloads: 4)
.xlsx   dmu_gerlinde.musterfrau_19_10-11.xlsx (Größe: 37,47 KB / Downloads: 4)
.xlsx   dmu_max.mustermann_19_09-10.xlsx (Größe: 37,47 KB / Downloads: 3)
.xlsx   dmu_max.mustermann_19_10-11.xlsx (Größe: 37,47 KB / Downloads: 7)
Top
#4
Hallo,

mein Vorschlag

Code:
ub prcEinlesen()
   Dim objDic As Object
   Dim lngC As Long, lngLastRow As Long, lngA As Long
   Dim strN?chsteMappe As String
   Dim vntSpalten As Variant, vntItem As Variant
  
   'die Spalten in denen die Kostenstellen stehen (hier Spalte B u. H)
   vntSpalten = Array(2, 8)
   Set objDic = CreateObject("scripting.dictionary")
   'gesucht wird in dem Verzeichnis in der die Masterdatei steht, nach Dateien, die mit dmu beginnen
   strN?chsteMappe = Dir(ThisWorkbook.Path & "\dmu*.*xls*")
   Do While strN?chsteMappe <> ""
      'die entsprechenden Dateien werden ge?ffnet
      Workbooks.Open ThisWorkbook.Path & "\" & strN?chsteMappe
      With ActiveWorkbook
         With .Worksheets(1)
            For lngA = 0 To UBound(vntSpalten)
               For lngC = 3 To .Cells(.Rows.Count, vntSpalten(lngA)).End(xlUp).Row
                  'wenn die Zellen einen numerischen Inhalt haben
                  If IsNumeric(.Cells(lngC, vntSpalten(lngA)).Value) Then
                     'wird die Kostenstelle und der Betrag eingelesen
                     objDic(.Cells(lngC, vntSpalten(lngA)).Value) = objDic(.Cells(lngC, vntSpalten(lngA)).Value) + WorksheetFunction.Sum(.Cells(lngC, vntSpalten(lngA) + 3).Resize(, 2).Value)
                  End If
               Next lngC
            Next lngA
         End With
      .Close False
      End With
      strN?chsteMappe = Dir()
   Loop
  
   lngC = 1
   'Ausgabe des Dictionary
   For Each vntItem In objDic.keys
      Cells(lngC, 1).Value = vntItem
      Cells(lngC, 2).Value = objDic(vntItem)
      lngC = lngC + 1
   Next vntItem
End Sub
Gruß Stefan
Win 10 / Office 2016
[-] Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:
  • gadgetsz
Top
#5
Super! Wäre es vielleicht möglich, dass du mir diesen Code in einem Excelsheet schickst? Wie gesagt, ich habe wirklich keine Ahnung wie/wo man sowas einfügt (und bei meinen Versuchen gerade gab es immer Syntax und Listenfehler).

Wäre das eine Möglichkeit? Würde mich sehr freuen!
Top
#6
Hallo,

(29.04.2020, 12:40)gadgetsz schrieb: Super! Wäre es vielleicht möglich, dass du mir diesen Code in einem Excelsheet schickst?

Du hast von einer Masterdatei geschrieben, die aber bei deinen Anhängen nicht dabei war. Deshalb habe ich eine leere Exceltabelle hergenommen, den Code in einem allgemeinen Modul eingefügt und getestet. Nachdem es gepaßt hat, habe ich ihn hier gepostet. Die Datei existiert also nicht. Wie lautete der Syntaxfehler?
Gruß Stefan
Win 10 / Office 2016
Top
#7
Hi Steph,

leider finde ich diese Datei in die du den Code kopiert hast nicht. Wäre es dir vielleicht möglich, diese nochmal hier zu posten oder mir kurz erklären wo oder wie ich diesen Code einfüge?

LG
Top
#8
Hallo,

Stefan schrieb dir doch, dass er keine Datei hat. Huh 

Code einfügen:
- mit Alt & F11 kommst du in den VBE
- links im Explorerfenster suchst du deine Datei und
- führst darauf einen Rechtsklick aus.
- Einfügen - Modul
- rechts öffnet sich ein großes Fenster, in das du den Code reinkopierst.
Gruß Günter
Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen.
angebl. von Georg Christoph Lichtenberg (1742-1799)
Top
#9
Dieser Code funktioniert super!

Könnte vielleicht noch kurz jemand ergänzen, wie ich diesen Code nur auf Blätter mit dem Name "Kostenstellen Summary" reduzieren könnte?



Zitat:Sub prcEinlesen()
  Dim objDic As Object
  Dim lngC As Long, lngLastRow As Long, lngA As Long
  Dim strNächsteMappe As String
  Dim vntSpalten As Variant, vntItem As Variant
 
  'die Spalten in denen die Kostenstellen stehen (hier Spalte B u. H)
  vntSpalten = Array(2, 8)
  Set objDic = CreateObject("scripting.dictionary")
  'gesucht wird in dem Verzeichnis in der die Masterdatei steht, nach Dateien, die mit dmu beginnen
  strNächsteMappe = Dir(ThisWorkbook.Path & "\dmu*.*xls*")
  Do While strNächsteMappe <> ""
      'die entsprechenden Dateien werden ge?ffnet
      Workbooks.Open ThisWorkbook.Path & "\" & strNächsteMappe
      With ActiveWorkbook
        With .Worksheets(1)
            For lngA = 0 To UBound(vntSpalten)
              For lngC = 3 To .Cells(.Rows.Count, vntSpalten(lngA)).End(xlUp).Row
                  'wenn die Zellen einen numerischen Inhalt haben
                  If IsNumeric(.Cells(lngC, vntSpalten(lngA)).Value) Then
                    'wird die Kostenstelle und der Betrag eingelesen
                    objDic(.Cells(lngC, vntSpalten(lngA)).Value) = objDic(.Cells(lngC, vntSpalten(lngA)).Value) + WorksheetFunction.Sum(.Cells(lngC, vntSpalten(lngA) + 3).Resize(, 2).Value)
                  End If
              Next lngC
            Next lngA
        End With
      .Close False
      End With
      strNächsteMappe = Dir()
  Loop
 
  lngC = 1
  'Ausgabe des Dictionary
  For Each vntItem In objDic.keys
      Cells(lngC, 1).Value = vntItem
      Cells(lngC, 2).Value = objDic(vntItem)
      lngC = lngC + 1
  Next vntItem
End Sub
Top
#10
Hallöchen,

im Prinzip statt

With .Worksheets(1)

dann

With .Worksheets("MeinName")

Falls es das Blatt nicht gibt, kommt allerdings eine Fehlermeldung und Du müsstest die Aktion abbrechen. Kann so ein Fall auftreten? Dann müsste man im Code entsprechend vorsorgen.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste