alexberlin
Goto Top

VBA bzw. Makro Programmierung um mehrere, gleichaufgebaute Exceldateien (über 60) in einer seperaten Datei zusammenzuführen

Hallo zusammen,


ich habe folgendes Problem, vllt. kann mir jemand helfen: ich habe rund 60 verschiedene Exceldateien mit jeweils 53 Reitern. 52 Reiter sollen vom Bediener ausgefüllt werden und der letzte Reiter enthält alle Daten des gesamten Jahres in Tabellenform (Name des letzten [bzw. ersten] Reiters in allen 60 Dateien ist "Auswertung 2016").

Aufbau des Reiters Auswertung 2016, welcher so auch in die neue große Auswertung übernommen werden soll:


Datum Name Zeit Beschreibung usw....
xx.xx.xx xxx xx:xx xxx


Alle Dateien liegen in einem Ordner, die Reiter und der Aufbau ist komplett identisch, nur die Benennung der Datei ist unterschiedlich (z.B. B01, B02, B03,...,B60, usw.). Nun möchte ich wöchentlich in einem neuen Tabellenblatt und einem neuen Ordner eine Auswertung fahren und alle gesammelten Daten der 60 Dateien in einer Pivottabelle grafisch darstellen. Kann mir jemand mit einem Makro weiterhelfen?

Vielen Dank und beste Grüße
AlexBerlin

Content-ID: 310595

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

ice.polar
ice.polar 22.07.2016 um 08:21:35 Uhr
Goto Top
Ohne die Fragestellung näher zu prüfen, frage ich mich, ob Excel das richtige Instrument für diese Aufgabe ist. Es gäbe da auch noch andere Programme und da würde ich eine Datenbank vorschlagen - für diese Aufgabe.
Aber ich weiss: es gibt nichts was man mit Excel nicht auch erledigen könnte.
129813
129813 22.07.2016 aktualisiert um 09:21:07 Uhr
Goto Top
Sub MergeWB()
    Const FOLDER = "c:\Data"  
    set fso = CreateObject("Scripting.FileSystemobject")  
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    With ActiveSheet
        for each file in fso.GetFolder(FOLDER).Files
           if LCase(fso.GetExtensionName(file.Name)) = "xlsx" then  
             set ws = GetObject(file.Path).Sheets("Auswertung 2016")  
             ws.UsedRange.Offset(1,0).Copy
             .Cells(Rows.Count,"A").End(xlUp).Offset(1,0).PasteSpecial xlPasteValuesAndNumberFormats  
             ws.Parent.Close False
          End if
        next
    End With
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Regards
AlexBerlin
AlexBerlin 22.07.2016 um 09:15:44 Uhr
Goto Top
Ja es gibt sicherlich bessere Lösungen, kannst du eine empfehlen? Ich weiß nicht ob sich das so schnell in Access verwirklichen Lässt (Ein Formular was wöchentlich / täglich ausgefüllt wird)
AlexBerlin
AlexBerlin 22.07.2016 um 09:17:17 Uhr
Goto Top
Vielen Dank highload, hast du eventuell noch einen Trick um die folgende Fehlermeldung zu überspringen?

fehlermeldung excel
129813
129813 22.07.2016 um 09:20:07 Uhr
Goto Top
Done. See modified code above.
ice.polar
ice.polar 22.07.2016 um 10:13:44 Uhr
Goto Top
Hallo AlexBerlin

Da ich die Problemstellung nicht kenne ist eine Empfehlung unmöglich.
Ad hoc lässt sich das sowieso nicht auf z.B. MS-Access / MS SQL-Server o.ä. umschreiben.
highload beweist die Richtigkeit meiner Aussage: es gibt nichts was Excel nicht auch kann...
Als Prototyp lassen sich mit Excel viele Aufgaben lösen und das funktioniert auch aber längerfristig ist bei solch einer Vielzahl von Daten ein adäquates Hilfsmittel ratsam.
Viel Glück mit der Lösung!
Biber
Biber 22.07.2016 aktualisiert um 10:58:35 Uhr
Goto Top
Moin AlexBerlin,

ergänzend zu der Antwort von ice.polar auf deine Frage:

Zitat von @AlexBerlin:

Ja es gibt sicherlich bessere Lösungen, kannst du eine empfehlen? Ich weiß nicht ob sich das so schnell in Access verwirklichen Lässt (Ein Formular was wöchentlich / täglich ausgefüllt wird)

Es wäre nicht zielführend und unseriös, dir jetzt zu einer bestimmten handwerklichen Lösung zu raten.
Eine für euch sinnvolle Lösung hängt auch ab von
  • euren Prozessen: wie viele Nutzer bearbeiten die Daten und tun sie das jeweils "exklusiv" (jeder seinen eigenen Kundenstamm) oder wäre eigentlich ein gemeinsamer Datenpool sinnvoll?
  • der Dauerhaftigkeit der Daten - sind diese Tages/Wochen-Arbeitsblätter nur Nebenrechnungen für die Sachbearbeiter und erhaltenswert sind nur die Quartals-/Jahresauswertungen?
  • in welcher Infrastruktur würde eine andersartige Lösung laufen -gibt es schon Datenbank-Tools für andere Zwecke oder würdet ihr auf der grünen Wiese bauen?
  • wäre denn jemand da, der eine Individuallösung zusammenschroten kann (das kleinste Problem, diese Leute kann man mieten)?
  • wäre denn jemand da, der eine Individuallösung pflegen und warten kann (das größere Problem, das sind interne Ressourcen)?
  • was passiert denn weiterhin mit den Daten, die du hier mit erweitertem Copy&Paste zusammenharkst? Auch das ist ja wohl kein Selbstzweck - da gibt es bestimmt Folgeprozesse und andere Datenabnehmer.

Wenn ihr da vom Fleck kommen wollt, dann müsst ihr schon einen ins Haus holen, der genau diese Fragen stellt, sich mit der Fachabteilung (den Sachbearbeitern), mit der IT-Technik und der Geschäftsführung austauscht und die Antworten richtig bewerten kann.

Und dann könnt ihr entscheiden, ob ihr weiter so eine (doofe, aber billige und akzeptierte) Zusammenkopier-Lösung mit vielen Prozessbrüchen weiterfahren wollt oder ob ein Leidensdruck da ist, der zu einer Neukonzeption führt.

Grüße
Biber
AlexBerlin
AlexBerlin 29.07.2016 um 11:19:51 Uhr
Goto Top
Hallo Highload,

eventuell kannst du ja noch einmal helfen. Gibt es eine Möglichkeit, dass in der großen Auswertung nur neu dazugekommenen Daten aktualisiert werden? Jedesmal wenn ich das Makro starte, werden alle 10.000 Zeilen neu ausgegeben


Vielleicht hilft dir dieser Ansatzpunkt weiter:

Jede einzelnen Zeile im Tabellenblatt "Auswertung 2016", welche in allen 60+ Exceldateien gleich aussieht, hat mit der Spalte "Zuordnung" eine eindeutig zuordenbare Nummer

Bsp:

Zuordnung

01_1
01_2
01_3
01_4
01_5
01_6
01_7
01_8
01_9
01_10

(Die 01 steht dabei für ein Kürzel des Bedieners )

Dank und Gruß
AlexBerlin
129813
129813 29.07.2016 um 11:25:25 Uhr
Goto Top
Simply delete the used range before iterating
ActiveSheet.UsedRange.ClearContents