karatikus
Goto Top

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...)

Content-Key: 203811

Url: https://administrator.de/contentid/203811

Printed on: April 19, 2024 at 21:04 o'clock

Member: karatikus
karatikus Mar 22, 2013 at 13:20:12 (UTC)
Goto Top
Nachtrag - der Lösungsanschlag unter folgender Frage geht schon in die richtige Richtung:

Wie einzelne Zellen aus mehreren Excel-Dateien auslesen und in eine neue Datei einfügen?

Es wäre nur noch notwendig dass die Daten automatisch zu der Zeile der richtigen Kostenummer eingefügt werden UND, falls der Fall Eintritt, das 2 oder mehrere Firmen auf einer Kostennummer arbeiten, das diese Summen dann addiert werden.

Würde dies eigentlich auch mit SVERWEIS gehen? Das Suchkriterium bildet ja immer die Kostennummer..
Member: karatikus
karatikus Mar 25, 2013 at 10:02:27 (UTC)
Goto Top
Mit folgendem Code kann ich zu mindest mal alle notwendigen Daten in meine Überischt übernehmen, allerdings schreibt er mir die Daten nur untereinander hinein (ist klar, weil ja nicht anders definiert ... )

Code:

Option Explicit
Option Compare Text

Const Folder = "C:\Prüfberichte\" 'Ist nur fiktiv, richtiger Ordner wird von mir eingesetzt

Const StartZeile = 7

Sub GetBKPData()
Dim Wkb As Workbook, Fso As Object, File As Object, Zeile As Long

Set Fso = CreateObject("Scripting.FileSystemObject") 'Dateisystem-Operationen

Range(Cells(StartZeile, "A"), Cells(Rows.Count, "E")).ClearContents 'Inhalte ab Startzeile löschen

Zeile = StartZeile

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

For Each File In Fso.GetFolder(Folder).Files
If Fso.GetExtensionName(File.Name) Like "xlsm" And Fso.GetBaseName(File.Name) Like "*2011-30*" Then
Set Wkb = GetObject(File.Path) '2011-30 kommt in der *.xlsm immer vor, da Projektnummer
With Wkb.Sheets(1) 'Werte mit Zahlenformat
.Range("H7").Copy: Cells(Zeile, "A").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
.Range("D7").Copy: Cells(Zeile, "B").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
.Range("D8").Copy: Cells(Zeile, "C").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
.Range("H29").Copy: Cells(Zeile, "D").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
.Range("H33").Copy: Cells(Zeile, "E").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
.Range("F46").Copy: Cells(Zeile, "F").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
.Range("H41").Copy: Cells(Zeile, "G").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
.Range("H42").Copy: Cells(Zeile, "H").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
.Range("H4").Copy: Cells(Zeile, "J").PasteSpecial Paste:=xlPasteValuesAndNumberFormats


End With
Wkb.Close False: Zeile = Zeile + 1
End If
Next

Range(Cells(StartZeile, "A"), Cells(Zeile, "E")).Sort _
Key1:=Cells(StartZeile, "B"), Key2:=Cells(StartZeile, "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


Zielsetzung wäre es nun die Datensätze der richtigen BKP (Quelldatei H7), in der Übersichtsdatei der richtigen Zelle zuzuordnen. Kann bitte jemand meines (kopierten & modifierten) Codes annehmen?
Mitglied: 76109
76109 Mar 27, 2013 updated at 09:52:39 (UTC)
Goto Top
Hallo karatikus!

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.

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
Member: karatikus
karatikus Mar 29, 2013 at 06:52:11 (UTC)
Goto Top
Danke Dieter das du dir die Sache angesehen hast und auch großen Dank für den einfacheren Quellcode als wie mein zusammengestoppeltes Werk.

Meine Kostennummern beginnen in der Übersicht erst ab Zeile 7, da darüber noch Bezeichnungen & allgemeine Projektinformationen drinnen stehen. Die Methode das die Zeilennummer = der Kostennummer ist, funktioniert leider nicht, da (was ich leider verschwiegen habe), die Kostennummern ähnlich von Leistungsgruppen aufgebaut sind.

z.B.:
"0." ist eine Hauptgruppe und steht in A10
"00." ist eine Leistungsuntergruppe und steht in A11
"001." ist die erste wirkliche Kostennummer und steht in A12
das geht dann bis "009." dann endet quasi diese Leistunggruppe und es beginnt eine Neue Leistungsgruppe ...

Die 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...

Ich probier mich nochmals besser auszudrücken:
Die VBA Funktion sollte vordefinierte Werte aus den Prüfberichten ("H7,D7,D8,H29,H33,F46,H41,H42,H4") auslesen.
Diese Werte sollten in der Kostenübersicht dann der jeweiligen Zeile in Spalte A, wo die lt. Prüfbericht definierte Kostennummer gesucht und gefunden wird, in den nebenstehenden Spalten B,C,D,E.. eingefügt werden. In A darf nichts eingefügt werden, da dort alle Kostennummern drinnen stehen die ja das Sortierkriterium darstellen.

War wiederum ein Fehler von mir zu sagen das die Werte aus "H7" kopiert werden sollten, da dies im Prüfbericht ja die Kostennummer ist. H7 ist das Such- & Sortierkriterium wenn mans so ausdrücken kann.

Ich glaub ich drück mich nur zu kompliziert aus.. *g*

Vlt. ist ein Überarbeitung vom Code nochmals drinnen, danke im Vorraus face-smile
Mitglied: 76109
76109 Mar 29, 2013 updated at 13:13:01 (UTC)
Goto Top
Hallo karatikus!

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 schlechtface-wink

Die 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
Member: karatikus
karatikus Apr 02, 2013 at 05:05:07 (UTC)
Goto Top
Morgen,

215. und 215.1 stellen unterschiedliche Kostennummern dar.
Hauptgruppen X.
Leistungsgruppe XX.
Kostennummern von XXX. bis XXX.XX

Vor dem Punkt können maximal 3 Stellen stehen, danach maximal 2, somit besteht eine Kostennummer inkl "." aus maximal 6 Zeichen.

Lg,
Mitglied: 76109
76109 Apr 05, 2013 updated at 14:11:21 (UTC)
Goto Top
Hallo karatikus!

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