3k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo,
ich habe folgendes Problem zu lösen:

In nach Jahren unterschiedenen Verzeichnissen, liegen jeweils ca. 100 Workbooks die als "Name_Vorname_Jahr.xls" abgespeichert sind. Der Aufbau des 1. Tabellenblattes (Kostenbeitrag) ist in allen Dateien identisch.

Ich möchte nun immer bestimmte Zellen aus diesen Dateien auslesen in einer neuen Datei in Listenform zusammenführen. Benötigt werden nur die Zellen C3, E3, B33 und B34. Deren Inhalte sollen in der neu erstellten Datei zeilenweise ausgegeben werden:

Name|Vorname|Summe|Durchschnitt
_C3____E3_____B33_____B34___ des 1. Workbooks
_C3____E3_____B33_____B34___ des 2. Workbooks
_C3____E3_____B33_____B34___ des letzten Workbooks im Verzeichnis

Leider reichen meine VBA-Kenntnisse nicht aus, die hier im Forum beschriebenen Beispiele (z. B. https://supportnet.de/t/2243223) für meine Bedürfnisse umzustricken. Vielleicht ist jemand so nett, mir dabei behilflich zu sein?

Vielen Dank
Uwe

15 Antworten

0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Uwe,

nachfolgende Makros kopieren Dir die Daten aus einem bestimmten Ordner und allen darin befindlichen Unterordner aus allen darin befindlichen Exceldateien. Kopiert werden die Daten aus dem Tabellenblatt mit dem Namen „Tabelle1“ Zellen C3, E3, B33 und B34 in die aktuelle Datei in das Tabellenblatt mit dem Namen „Tabelle1“ in die Spalten A, B, C und D.

Kopiere das Makro in ein StandardModul und starte es z.B. über eine Befehlsschaltfläche
Teste das Makro aber bitte in einer Testdatei und nicht gleich in Deiner Originaldatei.

Option Explicit

Dim Obj As Object
Dim objAnzDateien As Object
Dim objDurchläufe As Object
Dim objDateityp As Object

Dim lngFirstFreeRow As Long

Dim wkbQuelldatei As Workbook

Const strQuellSheet = "Eingabe"
Const strZielSheet = "Tabelle1"
Const strPath = "C:\tmp"

Sub Start()
Set Obj = CreateObject("Scripting.FileSystemObject")
Set objAnzDateien = Obj.getfolder(strPath)
Auslesen
End Sub

Sub Auslesen()
On Error GoTo ERRORHANDLER

With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With

For Each objDateityp In objAnzDateien.Files
If Right(objDateityp.Name, 4) = ".xls" Then
Application.StatusBar = "Workbook " & objDateityp.Name & " wird ausgelesen..."
DoEvents
Set wkbQuelldatei = Workbooks.Open(objDateityp.Path)
lngFirstFreeRow = ThisWorkbook.Sheets(strZielSheet).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
wkbQuelldatei.Sheets(strQuellSheet).Range("C3").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 1)
wkbQuelldatei.Sheets(strQuellSheet).Range("E3").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 2)
wkbQuelldatei.Sheets(strQuellSheet).Range("B33").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 3)
wkbQuelldatei.Sheets(strQuellSheet).Range("B34").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 4)
ActiveWorkbook.Close True
End If
Next

For Each objDurchläufe In objAnzDateien.subfolders
Set objAnzDateien = objDurchläufe
Auslesen
Next
ERRORHANDLER:
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.Calculate
.StatusBar = ""
End With
Set wkbQuelldatei = Nothing
End Sub
In dem Makro musst Du in den Zeilen

Const strQuellSheet = "Eingabe"
Const strZielSheet = "Tabelle1"
Const strPath = "C:\tmp"
den Namen des Tabellenblatts aus den zu öffnenden Dateien, den Namen des Blatts, in das die Daten kopiert werden sollen und den 1. Ordner, in dem sich dann alle weiteren Unterordner befinden, anpassen/ ändern.

Solltest Du nicht wissen, wie Du den Code in Deine Datei bekommst, dann schau mal auf meiner HP in der Rubrik Anleitungen und dort dann in der Anleitungsnummer 3 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.

Bei Fragen melde Dich.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von
Hallo Oliver,
erst einmal recht herzlichen Dank für die fixe Beantwortung, mein Rechenknecht zeigt hier etwas von 5:35 Uhr in der Früh an. Da wälzen sich Andere noch im Bett herum. ;-)

Habe das Makro in ein neues Workbook (Auswertung.xls) eingebaut und entsprechend deiner Hinweise abgeändert. Wenn ich es starte, passiert allerdings ... nichts. Weder eine Fehlermeldung noch ein Ergebnis.

Vielleicht noch eine Ergänzung zu meiner Fragestellung:
Die auszuwertenden Workbooks liegen alle in einem Ordner und haben die Bezeichnungen der Kunden und das Jahr als Dateinamen, also z. B. "Seeler_Uwe_2011.xls". Das Tabellenblatt mit den berechneten Ergebnissen in diesen Dateien hat die Bezeichnung "Kostenbeitrag". Das Ergebnis der Zusammenfassung soll nun in ein neues Workbook im gleichen Verzeichnis abgelegt/geschrieben werden.

LG,
Uwe
0 Punkte
Beantwortet von
Hallo Uwe,

sorry, aber zuerst schreibst Du

In nach Jahren unterschiedenen Verzeichnissen, liegen jeweils ca. 100

dann schreibst Du

Die auszuwertenden Workbooks liegen alle in einem Ordner

Wo liegen denn nun die Dateien. Wobei dem erstellten Makro das egal ist.

Hast Du den richtigen Ordner eingetragen? Hast Du die richtigen Blattnamen eingetragen?

Damit eventuell ein Fehler angezeigt werden kann, setze mal vo der Zeile

On Error GoTo ERRORHANDLER ein Hochkomma (Tasten Shift Stern), so dass der Text in die Schriftfarbe grün wechselt und teste es dann nochmal. Wenn ein Fehler vorhanden ist, müsste dieser Dir dann angezeigt werden.

MfG,
Oliver
0 Punkte
Beantwortet von zulu_01 Einsteiger_in (33 Punkte)
In nach Jahren unterschiedenen Verzeichnissen, liegen jeweils ca. 100

Das ist ja auch so, ein Jahr = ein Ordner
Die auszuwertenden Workbooks liegen alle in einem Ordner

Ist jetzt nur ein Beispiel für das Jahr 2011 gewesen.

Sorry, wenn mich da blöd ausgedrückt habe.

Habe jetzt das "On Error" auskommentiert und das Makro hängt nun bei der Zeile

For Each objDateityp In objAnzDateien.Files
0 Punkte
Beantwortet von zulu_01 Einsteiger_in (33 Punkte)
Die Konstanten sind bei mir wie folgt deklariert:

Const strQuellSheet = "Kostenbeitrag"
Const strZielSheet = "Auswertung"
Const strPath = "N:\Team\Kostenbeitrag\kunden 2011"
0 Punkte
Beantwortet von
Hallo Uwe,

welches Makro startest Du zuerst? Ich hatte nämlich vergessen zu schreiben, dass Du das Makro "Start" ausführen musst. Dieses Makro startet dann das Makro "Auslesen", was wahrscheinlich Du alleine per Hand gestartet hast. Dass kann dann nicht funktionieren

MfG,
Oliver
0 Punkte
Beantwortet von zulu_01 Einsteiger_in (33 Punkte)
Ich könnte dich knuddeln! Bitte nicht wörtlich nehmen, da das unter Männern nicht üblich ist. :-)

Nun klappt es auch. Habe natürlich die falsche von den beiden Möglichkeiten gewählt und das Makro "Auslesen" gestartet!

Herzlichen Dank und ein schönes Wochenende,

Uwe
0 Punkte
Beantwortet von zulu_01 Einsteiger_in (33 Punkte)
Doch noch ein kleines Problem, ist mir beim 1. Test nicht aufgefallen, da noch keine Daten in den Kundendateien hinterlegt waren. Das Makro holt sich aus den Zellen B33 und B34 der auszuwertenden Workbooks nicht die berechneten Werte, sondern nur die darin stehende Formel.

In der Tester_Toni_2011.xls steht in der Zelle B33 z. B. "=SUMME(B28:M28)" Da in der Auswertung.xls in diesen Zellen keine Werte für diese Formel stehen, ist das Ergebnis immer 0.
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Uwe,

ändere die Zeilen

wkbQuelldatei.Sheets(strQuellSheet).Range("C3").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 1)
wkbQuelldatei.Sheets(strQuellSheet).Range("E3").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 2)
wkbQuelldatei.Sheets(strQuellSheet).Range("B33").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 3)
wkbQuelldatei.Sheets(strQuellSheet).Range("B34").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 4)
in

wkbQuelldatei.Sheets(strQuellSheet).Range("C3").Copy
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 1).PasteSpecial
wkbQuelldatei.Sheets(strQuellSheet).Range("E3").Copy
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 2).PasteSpecial
wkbQuelldatei.Sheets(strQuellSheet).Range("B33").Copy
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 3).PasteSpecial
wkbQuelldatei.Sheets(strQuellSheet).Range("B34").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 4).PasteSpecial
Damit werrden nur die Werte, aber keine Formeln kopiert.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von zulu_01 Einsteiger_in (33 Punkte)
Das führt nun zu dem Fehler
Laufzeitfehler '1004'
Die Copy-Methode des Range-Objektes konnte nicht ausgeführt werden.

Der Debugger bleibt bei
wkbQuelldatei.Sheets(strQuellSheet).Range("B34").Copy _
ThisWorkbook.Sheets(strZielSheet).Cells(lngFirstFreeRow, 4).PasteSpecial
hängen.
...