Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1872to1876
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

mehrere Excel-Dateien auswerten & Werte

mehrere Excel-Dateien auswerten & Werte
16.03.2022 16:20:46
Claudia
Hallo Ihr Lieben,
Der dort hinterlegte VBA-Code ist im Grunde genau das, was ich benötige, nur dass ich die Werte aus den Quelldateien in meiner Zieldatei nicht untereinander stehen haben möchte.
Meine Excel-Dateien sind identisch aufgebaut. Ich möchte nun in meiner Zieldatei den kompletten Bereich A1 bis C240 aus der Quelldatei übernehmen (diese sind in jeder Excel-Datei identisch). Zudem möchte ich nun aus jeder einzelnen Excel-Datei in den nächsten Spalten meiner Zieldatei (also D ff.) eine bestimmte Spalte (z. B. überall die Spalte E1 bis E240 aus der Quelldatei) ergänzen.
Beispiel:
Alle Dateien haben einen statistischen Grundaufbau:
z. B.
Zelle A9 / Zelle B9 / Zelle C9
Lfd. Nr. 1 / Bestand zu Beginn des Berichtszeitraums / Bemerkung
Zelle A10 / Zelle B10 / Zelle C10
Lfd. Nr. 2 / Neuzugänge / Bemerkung
Zelle A11 / Zelle B11 / Zelle C11
Lfd. Nr. 3 / Erledigungen / Bemerkung
usw.
Dieser Grundaufbau soll auch in meine Zieldatei automatisch übernommen werden, indem ich hierzu den Bereich festlege.
In der folgenden Spalte (also Zellen D9 bis D240) soll nun der Spalteninhalt aus der Quelldatei 1 (Quartalsauswertung für das 1. Quartal bzgl. der Zuständigkeit der Person A, also z. B. Spalte F9 bis F240), dann in der nächsten Spalte (E9 bis E240) soll der Spalteninhalt aus der Quelldatei 2 (Quartalsauswertung für das 2. Quartal zur Zuständigkeit der Person A, also z. B. Spalte F9 bis F240) usw. eingefügt werden.
Zum Schluss möchte ich mir dann aus allen vier Quartalsauswertungen eine Jahresübersicht erstellen (Dies muss ich dann jedoch manuell hinzufügen. Dafür ist VBA nicht erforderlich.).
Zur weiteren Erläuterung:
Man könnte natürlich glauben, dass ich mir die jeweils gewünschte Spalte einfach per Copy & Paste aus den vier Quartalsauswertungen (Quelldateien) in meine Zieldatei nebeneinander kopiere. Das Problem ist hierbei,
- dass zum einen eine Quartalsauswertung mehrere verschiedene Spalten mit verschiedenen Zuständigkeiten hat und ich hier immer nur eine Zuständigkeit benötige
- und dass zum anderen mehrere hundert Quartalsauswertungen (Excel-Dateien) existieren.
Ziel ist am Ende, dass ich zu jeder Person aus den hunderten Quartalsauswertungen jeweils eine Jahresübersicht erstellen kann und das möglichst schnell und komfortabel. Bisher kämpfe ich mich per Copy & Paste durch, sehe aber noch lange kein Ende in Sicht. Eine einzige Quartalsauswertung kann bis zu 50 Zuständigkeiten enthalten und das dann mal vier für alle Quartale.
Ich würde mich mega freuen, wenn mir jemand den VBA-Code so anpassen könnte, dass der genauso flexibel ist.
Ganz liebe Grüße
RohDiamant

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Deine Problembeschreibung in allen Ehren ...
16.03.2022 16:31:30
neopa
Hallo Claudia,
... sie erscheint recht ausführlich. Aber ohne zumindest eine Beispieldatei und den von Dir erwähnten Link auf einen anderen thread, schwer verständlich. Nachstellen wird es wohl kaum jemand.
Aber aus dem was ich Deinem Text entnehmen konnte, sollte das ohne VBA mit Hilfe der Power Query Funktionalität von Excel kombiniert mit einer Pivotauswertung realisierbar sein.
Zu Power Query sieh mal hier: https://excelhero.de/power-query/power-query-ganz-einfach-erklaert/
Gruß Werner
.. , - ...
Anzeige
AW: Deine Problembeschreibung in allen Ehren ...
16.03.2022 16:55:32
RohDiamant
Hallo,
mit Pivot komme ich hier leider nicht zum gewünschten Ergebnis.
Der Link zum alten thread: https://www.herber.de/forum/archiv/1684to1688/1685232_mehrere_ExcelDatei_auswerten_amp_Werte_in_einer_Tab.html
Eine Beispiel-Datei habe ich ebenfalls beigefügt (https://www.herber.de/bbs/user/151810.xlsx)
Ich hoffe, Ihr könnt mir weiterhelfen. Ich hätte das wirklich gern über VBA gelöst bekommen.
Vielen Dank im Voraus.
RohDiamant
Claudia , Andreas, Rohdiamant !?..... owt
16.03.2022 22:47:26
ralf_b
AW: Claudia , Andreas, Rohdiamant !?..... owt
17.03.2022 10:36:48
RohDiamant
Hallo,
ich kenne mich mit diesem Forum nicht aus.
Ich bekomme angezeigt, dass mir ralf_b gestern um 22:47 Uhr geantwortet hat.
Wenn ich auf diesen thread unter Folgenachrichten klicke, kann ich aber keine Antwort finden.
Kann mir bitte jemand helfen?
LG
RohDiamant
Anzeige
AW: dazu: "owT" = "ohne weiteren Text" owT
17.03.2022 10:56:22
neopa
Gruß Werner
.. , - ...
AW: so nicht nachvollziehbar ...
17.03.2022 10:31:31
neopa
Hallo,
... woher die Daten in D26:G34 kommen (sollen).
Gruß Werner
.. , - ...
AW: so nicht nachvollziehbar ...
17.03.2022 11:04:15
RohDiamant
Hallo,
in meiner Beispieldatei habe ich oben ein Beispiel einer Quelldatei für das erste Quartal aufgeführt.
Im unteren Bereich meiner Beispieldatei habe ich aufgeführt, wie meine Zieldatei am Ende aussehen soll.
Die Daten für die Zieldatei, z. B. für die Zellen C22:C34 kommen aus einer Quelldatei zum ersten Quartal (Zelle D5:D16).
Die Daten für die Zieldatei in D22:D34 kommen dann aus einer anderen Quelldatei zum zweiten Quartal (Zelle D5:D16).
Die Daten für die Zieldatei in E22:E34 kommen dann aus einer dritten Quelldatei zum dritten Quartal (Zelle D5:D16).
Und die Daten für die Zieldatei in F22:F34 kommen aus der Quelldatei zum vierten Quartal (Zelle D5:D16).
Die jeweils benötigte Spalte würde ich gern abgefragt bekommen, wie auch die Abfrage, welche Quelldateien ich verwenden möchte, also ähnlich wie in dem VBA-Code aus dem anderen thread. Die benötigte Spalte aus der Quelldatei ist daher immer eine andere.
Vorgehensweise aktuell:
- Ich kopiere mir die Spalten A:C in meine Zieldatei,
- öffne dann zu Standort A eine Quartalsauswertung für das erste Quartal (Quelldatei1)
- kopiere mir hier die nun benötigte Spalte zur Zuständigkeit 1 (Spalte E) heraus,
- füge diese in meine Zieldatei unter Spalte D ein,
- öffne dann zu diesem Standort A die Quelldatei2, also das zweite Quartal,
- kopiere mir dort die benötigte Spalte zur Zuständigkeit 1 (Spalte E) heraus,
- füge diese in meine Zieldatei unter Spalte E ein,
- öffne die Quelldatei3 zum Standort A für das dritte Quartal,
- kopiere mir dort die benötigte Spalte zur Zuständigkeit 1 (Spalte E) heraus,
- füge diese in meine Zieldatei unter Spalte F ein,
- öffne die Quelldatei 4 zum Standort A für das vierte Quartal,
- kopiere mir die Zuständigkeit 1 (Spalte E) heraus,
- füge diese in meine Zieldatei unter Spalte G ein und
- füge zum Schluss noch eine weitere Spalte für die Jahresübersicht mit den entsprechenden Formeln ein.
Dies wiederhole ich, bis ich alle Zuständigkeiten aus dem Standort A in jeweils einer Zieldatei zusammengeführt habe.
D.h. ich nehme für meine nächste Zieldatei ebenfalls den Standort A, diesmal aber die Zuständigkeit 2, also Spalte F.
Und das ganze Prozedere dann noch für alle übrigen knapp 100 Standorte.
Ich hoffe, ich konnte das Dilemma etwas verdeutlichen.
Lieb wäre mir, wenn ich zumindest über einen VBA-Code die Quell-Dateien auswählen kann und die Quell-Spalte abgefragt bekomme und diese dann für alle vier Quartale zu einer Zieldatei zusammengeführt wird. Vielleicht geht das ja auch alles noch viel schicker. Ich wäre aber durchaus auch schon damit zufrieden.
Könnt Ihr mir bitte helfen?
LG
RohDiamant
Anzeige
AW: thread offen, VBA -Lösung gesucht ....
17.03.2022 11:10:23
neopa
Hallo,
... mit VBA beschäftige ich mich nicht. Deshalb hab ich den thread wieder als offen gekennzeichnet. Jetzt kannst/musst Du warten, bis sich einer VBAler sich Deiner weiter annimmt/annehmen möchte.
Gruß Werner
.. , - ...
AW: so nicht nachvollziehbar ...
17.03.2022 18:06:14
Yal
Hallo Claudia,
dann schleifen wir mal eine Runde...
Es handelt sich um einen Bestandsbericht. Du nennst es "Quelldatei" aber es ist unwahrscheinlich die Urquelle der Daten. Ich vermute sehr, dass dahinter irgendeinen ERP-System vorliegt.
Es wäre daher nicht besonders sinnvoll, ein solche Zwischenergebnis zu verwenden, um die Daten umzugestalten. Es muss eine Möglichkeit geben, aus dem Quellsystem die Daten in genau der Zusammenfassung zu exportieren, die Du brauchst.
Ausserdem ist auch die Frage, was diese neue Zusammenfassung als Mehrwert bittet: Festplatten digital vermüllen kann kein Ziel sein. Was wird daraus gemacht?
Wenn es tatsächlich keine Datensystem dahinter gäbe, wäre es auch zu bedenken, ob man nicht die Daten in einem Format bringen kann, die jederzeit beliebig auswertbar wäre. Solche Standard kennst Du aus deinem Bankkonto: es gibt ein Anfangssaldo, die Zugänge und Abgänge und ein Endsaldo. Saldi sind Bestände. Der Anfangsaldo ist der erste Zugang (im gegensatz zu Bankkonto darf der Bestand nicht minus sein).
Du brauchst 3 Spalten:
_ Datum der Buchung
_ Gegenstand
_ Buchungswert der Bewegung (Zugang in Plus, Abgang in Minus)
Dann wird nach Datum sortiert und per Formel oder VBA wird eine 4te Spalte errechnet: pro Gegenstand der laufende Saldo
So kannst per Filter jegliche Bewertung machen: Welche gegenstand, von wann bis wann, ....
Was ist in den Zeilen 9 bis 240 versteckt?
VG
Yal
Anzeige
AW: so nicht nachvollziehbar ...
17.03.2022 19:27:49
RohDiamant
Hallo,
erst einmal herzlichen Dank für alle Antworten bisher.
@Yal:
Unter den Zeilen 9 bis 240 sind weitere statistische Positionen versteckt, auf die ich hier nicht näher eingehen kann.
Es handelt sich nicht nur um eine Bestandsstatistik.
Ja, die Daten werden von einem bestimmten System in diese Quartalsauswertungen geschrieben.
Eine Weiterentwicklung dieses System ist jedoch nicht geplant und nicht gewollt. Daher benötige ich eine alternative Lösung, um die entsprechenden Statistiken fertigen und den jeweiligen Standorten zur Verfügung stellen zu können. Bisher mache ich das manuell per Copy & Paste. Ich denke jedoch, dass das sicherlich über die einfachen Mittel von Excel bzw. VBA realisierbar sein dürfte, sieht man ja an dem Beispiel aus dem thread: https://www.herber.de/forum/archiv/1684to1688/1685232_mehrere_ExcelDatei_auswerten_amp_Werte_in_einer_Tab.html.
Es handelt sich auch nicht um ein Zwischenergebnis, sondern um eine entsprechende Jahresstatistik für jede einzelne zuständige Person pro Standort über alle vier Quartale hinweg. Eine solche Jahresstatistik gibt es nicht und wird auch nicht eingeführt werden. Die Standorte benötigen diese aber sehr wohl.
In dem VBA-Code aus dem alten thread wird ein bestimmter Bereich abgearbeitet:
ZeiZ = ZeiZ + 1
wksZiel.Cells(ZeiZ, 1).Value = .Range("A7").Value
wksZiel.Cells(ZeiZ, 2).Value = .Range("B7").Value
Könnte man anstelle von "wksZiel.Cells(ZeiZ, 1).Value ..." angeben, dass z. B. alles aus der Spalte A der Quelldatei in z. B. die Spalte B der Zieldatei geschrieben werden soll? Mit dem obigen Code kann ich ja leider nur die jeweilige Zelle ".Range("A7").Value" angeben, die dann in die entsprechende Spalte "wksZiel.Cells(ZeiZ, 1).Value" geschrieben werden soll. Also übersetzt: Schreibe den Wert aus A7 aus der Quelldatei in die Spalte 1 der Zieldatei. Hier wäre es für mich hilfreicher, wenn ich an dieser Stelle sagen könnte: Schreibe mir die Werte aus der Spalte A in die Quelldatei unter die Spalte B.
Geht das evtl. auf diese Weise?
Noch einmal vielen Dank für Eure Unterstützung. Vielleicht kann mir ja doch noch jemand von Euch helfen?
LG
RohDiamant
Anzeige
AW: so nicht nachvollziehbar ...
17.03.2022 21:17:40
Yal
Hallo Claudia,
es heisst eigentlich nicht "helfen" oder "einen Stups geben" sondern glatt "liefern". Na ja, Sudoku ist inzwischen eh langweilig. Und GNTM will ich mir sicher nicht antun.
Ich habe eine einfache Version gemacht: die Daten werden in je eine Blatt pro Gegenstand in der Workbook, wo das Coding liegt, abgelegt. Daraus sollte ein leichte Aufgabe aus jedem Blatt eine Datei zu machen. Es lässt sich leicht mit dem Makrorekorder automatisieren.
Gerade fehlt mir ein: wenn alle Gegenstände in Datei vorhanden sind, dann hast Du eigentlich nur 4 Dateien zu behandeln, oder? Es wäre dementsprechend gar nicht so kompliziert, die Quartals in Zeile 4 über alle belegte Spalten zu kopieren, die 4 Quartals in einem Blatt zusammen zu bringen, dann zeilenweise sortieren, sodass zuerst ggst 1 für Q1, Q2, Q3, Q4 dann ggst 2, usw. Durch Blatt-Kopie und löschen des Überflüssigen auch schnell ans Ziel...

'Code in einem allgemeinen Modul
Sub Daten_einlesen()
Dim wkbQuelle As Workbook
Dim wksQuelle As Worksheet
Dim wksZiel As Worksheet
Dim varFiles As Variant
Dim varDatei As Variant
Dim StatusCalc As Long
Dim Sp As Range
'Dateiauswahl
varFiles = Array()
With Application.FileDialog(msoFileDialogOpen)
.Title = "Bitte auszuwertende Dateien auswählen - Mehrfachauswahl ist möglich"
.AllowMultiSelect = True
If .Show = -1 Then Set varFiles = .SelectedItems
End With
If UBound(varFiles) = -1 Then
MsgBox "Kein Datei ausgewählt", vbInformation, "Abbruch"
Exit Sub
End If
'Makrobremsen lösen
With Application
StatusCalc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
'gewählte Dateien abarbeiten
For Each varDatei In varFiles
Set wkbQuelle = Application.Workbooks.Open(Filename:=varDatei, ReadOnly:=True)
Set wksQuelle = wkbQuelle.Sheets(1)
'Gegenstand lesen
For Each Sp In wksQuelle.Range("C7:K7").Cells 'anpassen: bis wo gibt es "Gegenstände"?
'Gegenstand lesen, Worksheet selektieren oder erzeugen
Set wksZiel = Worksheet_auswählen(wksQuelle.Range(Sp.Value))
'bei neues Blatt
If wkszeile.Range("A7") = "" Then
wksZiel.Range("A7:B16") = wksQuelle.Range("A7:B16").Value 'Zeilenüberschriften
wksZiel.Range("C4:G4") = Array("Quartal 1", "Quartal 2", "Quartal 3", "Quartal 4", "Jahresergebnis zu")
wksZiel.Range("G7:G16").Formula = "=F7" 'Werte Quartal 4., per Default zuerst überall
wksZiel.Range("G11:G13, G16").FormulaLocal = "SUMME(C11:F11)" 'Summierbare Werte (Bewegung)
wksZiel.Range("G9:G10").Formula = "=C7" 'Werte Q1
End If
Quartal = CLng(Right(wksQuelle.Range("B5"), 1)) 'QuartalNr isolieren
wksZiel.Range("B7.B16").Offset(0, Quartal).Value = Intersect(wksQuelle.Rows("5:16"), Sp.EntireColumn).Value 'Werte übertragen
Next
wkbQuelle.Close savechanges:=False
Next
'Makrobremsen zurücksetzen
With Application
.Calculation = StatusCalc
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
Private Function Worksheet_auswählen(WsName As String) As Worksheet
Dim W As Worksheet
On Error Resume Next
Set W = ThisWorkbook.Worksheets(WsName)
If Worksheet_auswählen Is Nothing Then
Set W = ThisWorkbook.Worksheets.Add
W.Name = WsName
End If
Set Worksheet_auswählen = W
End Function
VG
Yal
Anzeige
"V"ehler entdeckt
17.03.2022 21:23:35
Yal
Nicht

wksZiel.Range("G9:G10").Formula = "=C7" 'Werte Q1
sondern

wksZiel.Range("G9:G10").Formula = "=C9" 'Werte Q1
ist doch klar.
VG
Yal
"V"ehler entdeckt
17.03.2022 21:25:58
Yal
nicht

wksZiel.Range("B7.B16").Offset(0, Quartal).Value = Intersect(wksQuelle.Rows("5:16"), Sp.EntireColumn).Value 'Werte übertragen
sondern ...
keine Ahnung?
Na dann:

wksZiel.Range("B7:B16").Offset(0, Quartal).Value = Intersect(wksQuelle.Rows("5:16"), Sp.EntireColumn).Value 'Werte übertragen
VG
Yal
Anzeige
AW: so nicht nachvollziehbar ...
18.03.2022 16:53:27
RohDiamant
Hallo Yal,
schon mal ein mega großes DANKESCHÖÖN für Deine Hilfe (Lieferung).
Nach Auswahl der Dateien erhalte ich leider einen Laufzeitfehler '13': Typen unverträglich. Beim Klicken auf Debuggen wird mir folgende Zeile
If UBound(varFiles) = -1 Then
gelb markiert. Was könnte das bedeuten? Hab ich etwas falsch gemacht?
Ganz liebe Grüße
RohDiamant
AW: so nicht nachvollziehbar ...
18.03.2022 18:10:33
Yal
Hallo Claudia,
hmm... so viele "Vehler". Es war mal rifchitg spät gewesen.

'Code in einem allgemeinen Modul
Sub Daten_einlesen()
Dim FD As FileDialog
Dim wkbQuelle As Workbook
Dim wksQuelle As Worksheet
Dim wksZiel As Worksheet
Dim DateiPfad As Variant
Dim StatusCalc As Long
Dim Sp As Range
'Dateiauswahl
Set FD = Application.FileDialog(msoFileDialogOpen)
FD.Title = "Bitte auszuwertende Dateien auswählen - Mehrfachauswahl ist möglich"
FD.AllowMultiSelect = True
FD.Show
'Makrobremsen lösen
With Application
StatusCalc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
'gewählte Dateien abarbeiten
For Each DateiPfad In FD.SelectedItems
Set wkbQuelle = Application.Workbooks.Open(Filename:=DateiPfad, ReadOnly:=True)
Set wksQuelle = wkbQuelle.Sheets(1)
'Gegenstand lesen
For Each Sp In wksQuelle.Range("C7:K7").Cells 'anpassen: bis wo gibt es "Gegenstände"?
'Gegenstand lesen, Worksheet selektieren oder erzeugen
Set wksZiel = Worksheet_auswählen(wksQuelle.Range(Sp.Value))
'bei neues Blatt
If wkszeile.Range("A7") = "" Then
wksZiel.Range("A7:B16") = wksQuelle.Range("A7:B16").Value 'Zeilenüberschriften
wksZiel.Range("C4:G4") = Array("Quartal 1", "Quartal 2", "Quartal 3", "Quartal 4", "Jahresergebnis zu")
wksZiel.Range("G7:G16").Formula = "=F7" 'Werte Quartal 4., per Default zuerst überall
wksZiel.Range("G11:G13, G16").FormulaLocal = "SUMME(C11:F11)" 'Summierbare Werte (Bewegung)
wksZiel.Range("G9:G10").Formula = "=C9" 'Werte Q1
End If
Quartal = CLng(Right(wksQuelle.Range("B5"), 1)) 'QuartalNr isolieren
wksZiel.Range("B7:B16").Offset(0, Quartal).Value = Intersect(wksQuelle.Rows("5:16"), Sp.EntireColumn).Value 'Werte übertragen
Next
wkbQuelle.Close savechanges:=False
Next
'Makrobremsen zurücksetzen
With Application
.Calculation = StatusCalc
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
Private Function Worksheet_auswählen(WsName As String) As Worksheet
Dim W As Worksheet
On Error Resume Next
Set W = ThisWorkbook.Worksheets(WsName)
If W Is Nothing Then
Set W = ThisWorkbook.Worksheets.Add
W.Name = WsName
End If
Set Worksheet_auswählen = W
End Function
VG
Yal
Anzeige
AW: so nicht nachvollziehbar ...
18.03.2022 18:44:10
RohDiamant
Hallo Yal,
wir wären keine Menschen, würden wir keine Fehler machen. ;-)
Daher vielen lieben Dank, dass Du mir hierbei hilfst.
Jetzt bekomme ich nach Auswahl der Dateien einen Laufzeitfehler '1004': Die Methode 'Range' für das Objekt '_Worksheet' ist fehlgeschlagen. Beim Klicken auf Debuggen wird mir folgende Zeile
'Gegenstand lesen, Worksheet selektieren oder erzeugen
Set wksZiel = Worksheet_auswählen(wksQuelle.Range(Sp.Value))
gelb markiert?
LG
RohDiamant
AW: so nicht nachvollziehbar ...
18.03.2022 19:09:55
ralf_b
Hast du den Datenbereich angepasst?
Und ist in diesem Bereich vielleicht eine leere Zelle oder ein Zellwert aus dem man keine Bereichsadresse machen kann?

Range("C7:K7").Cells 'anpassen: bis wo gibt es "Gegenstände"?

Anzeige
AW: so nicht nachvollziehbar ...
18.03.2022 19:55:05
RohDiamant
Hallo,
ja, ich habe diesen Bereich angepasst:
For Each Sp In wksQuelle.Range("E7:N7").Cells 'anpassen: bis wo gibt es "Gegenstände"?
Die Anzahl der Gegenstände (Zuständigkeiten/Personen) sind pro Standort unterschiedlich. Das kann von Spalte E und mal bis Spalte AZ und weiter gehen.
Leere Zellen sind in diesem Bereich E7:N7 keine, jedenfalls nicht zu meinem Test-Standort.
Und was sind Zellwerte, aus denen man keine Bereichsadresse machen kann?
Alle Zellwerte in der Zeile 7 sind einfache Zahlen.
LG
RohDiamant
AW: so nicht nachvollziehbar ...
18.03.2022 19:38:07
Yal
Aber jetzt habe ich nicht mehr die Entschuldigung der späte Uhrzeit.
Es ist tatsächlich eine versäumnis meinerseits:

'Gegenstand lesen
For Each Sp In wksQuelle.Range("C7:K7").Cells 'anpassen: bis wo gibt es "Gegenstände"?
If Sp.Value = "" Then Exit For
'Gegenstand lesen, Worksheet selektieren oder erzeugen
Set wksZiel = Worksheet_auswählen(Sp.Value)
'bei neues Blatt
2 Anpassungen:
_ Wie Ralf an angemerkt hat: der letzte gegenstand ist sicher nicht in K7, sondern vielleicht in AF7... Und vielleicht sind nicht alle Dateien mit dieselbem Anzahl an Gegenstände bestückt. Daher die Prüfung: wenn in C7:xx7 eine leere Zelle vorkommt, sind wir fertig (Exit For)
_ Die Korrektur der Fehlermeldung: der Inhat der Zelle entspricht der Name des Ziel-Blattes (und nicht wie vorher die Adresse einer Zelle, wo...)
VG
Yal
AW: so nicht nachvollziehbar ...
18.03.2022 21:11:42
RohDiamant
Hallo,
jetzt bekomme ich nach Auswahl der Dateien einen Laufzeitfehler '424': Objekt erforderlich. Beim Klicken auf Debuggen wird mir folgende Zeile
'bei neues Blatt
If wkszeile.Range("A7") = "" Then
gelb markiert. In Zelle A7 steht in jeder Datei "Lfd. Nr.". Daher habe ich einfach mal versucht, die Zeile wie folgt anzupassen, leider ohne Erfolg.
'bei neues Blatt
If wkszeile.Range("A7") = "Lfd. Nr." Then
LG
RohDiamant
AW: so nicht nachvollziehbar ...
19.03.2022 00:14:26
Yal
Hallo Claudia,
das Problem liegt daran, dass die Aufruf der Funktion Worksheet_auswählen

Set wksZiel = Worksheet_auswählen(Sp.Value)
nicht zu der Rückgabe eines validen Objektes führen scheint. Daher zickt
If wkszeile.Range("A7") = "" Then
nicht wegen dem Inhalt von A7 sondern die nicht Gültigkeit von wksZiel ... und jetzt während ich das schreibe, entdecke ich den Vertipper (siehst Du ihn auch?):
wksZiel und nicht wkszeile.
(man muss auch bedenken, dass ich das alles blind mache, weil ich keine Datei habe, zum Testen :-(
Zur Sicherheit den gesamten Code wieder:

'Code in einem allgemeinen Modul
Sub Daten_einlesen()
Dim FD As FileDialog
Dim wkbQuelle As Workbook
Dim wksQuelle As Worksheet
Dim wksZiel As Worksheet
Dim DateiPfad As Variant
Dim StatusCalc As Long
Dim Sp As Range
'Dateiauswahl
Set FD = Application.FileDialog(msoFileDialogOpen)
FD.Title = "Bitte auszuwertende Dateien auswählen - Mehrfachauswahl ist möglich"
FD.AllowMultiSelect = True
FD.Show
'Makrobremsen lösen
With Application
StatusCalc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
'gewählte Dateien abarbeiten
For Each DateiPfad In FD.SelectedItems
Set wkbQuelle = Application.Workbooks.Open(Filename:=DateiPfad, ReadOnly:=True)
Set wksQuelle = wkbQuelle.Sheets(1)
'Gegenstand lesen
For Each Sp In wksQuelle.Range("C7:K7").Cells 'anpassen: bis wo gibt es "Gegenstände"?
If Sp.Value = "" Then Exit For
'Gegenstand lesen, Worksheet selektieren oder erzeugen
Set wksZiel = Worksheet_auswählen(Sp.Value)
'bei neues Blatt
If wksZiel.Range("A7") = "" Then
wksZiel.Range("A7:B16") = wksQuelle.Range("A7:B16").Value 'Zeilenüberschriften
wksZiel.Range("C4:G4") = Array("Quartal 1", "Quartal 2", "Quartal 3", "Quartal 4", "Jahresergebnis zu")
wksZiel.Range("G7:G16").Formula = "=F7" 'Werte Quartal 4., per Default zuerst überall
wksZiel.Range("G11:G13, G16").FormulaLocal = "SUMME(C11:F11)" 'Summierbare Werte (Bewegung)
wksZiel.Range("G9:G10").Formula = "=C9" 'Werte Q1
End If
Quartal = CLng(Right(wksQuelle.Range("B5"), 1)) 'QuartalNr isolieren
wksZiel.Range("B7:B16").Offset(0, Quartal).Value = Intersect(wksQuelle.Rows("5:16"), Sp.EntireColumn).Value 'Werte übertragen
Next
wkbQuelle.Close savechanges:=False
Next
'Makrobremsen zurücksetzen
With Application
.Calculation = StatusCalc
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
Private Function Worksheet_auswählen(WsName As String) As Worksheet
Dim W As Worksheet
On Error Resume Next
Set W = ThisWorkbook.Worksheets(WsName)
If W Is Nothing Then
Set W = ThisWorkbook.Worksheets.Add
W.Name = WsName
End If
Set Worksheet_auswählen = W
End Function
VG
Yal
AW: so nicht nachvollziehbar ...
19.03.2022 16:17:12
RohDiamant
Hallo Yal,
das ist GRANDIOS und ich danke Dir von ganzem Herzen.
Sorry, dass ich so spät erst antworte. Das Testing und Anpassen hat etwas gedauert.
Leider bekomme ich im Ergebnis lediglich das vierte Quartal in die Zieldatei übernommen.
Die ersten drei Quartale werden mir nicht gezogen.
Ich glaube, das Problem ist, dass ich in meiner damaligen Beispieldatei in Zelle B5 "Quartal 1" geschrieben hatte, um das etwas zu verdeutlichen. Dieses Missverständnis tut mir sehr leid und bitte ich zu entschuldigen.
In den eigentlichen Quelldateien geht nirgends die Bezeichnung "Quartal 1", "Quartal 2", "Quartal 3" und "Quartal 4" hervor. Stattdessen wird in den Quelldateien lediglich der Berichtszeitraum in Zelle E1 aufgeführt, z. B. "01.01.2021 - 31.03.2021" für das erste Quartal 2021. Ich glaube, dass ein Abgleich zwischen der Bezeichnung "Quartal 1" und dem Inhalt aus der Zelle E1 so nicht funktioniert hat und mir deshalb nur das vierte Quartal gezogen wird?
Ich habe daher mal aus meinen Dateien entsprechende vier Testdateien (Quartalsauswertungen)
  • 2021_I_20210101_20210331_Standort A.xlsx (https://www.herber.de/bbs/user/151873.xlsx)

  • 2021_II_20210401_20210630_Standort A.xlsx (https://www.herber.de/bbs/user/151866.xlsx)

  • 2021_III_20210701_20210930_Standort A.xlsx (https://www.herber.de/bbs/user/151867.xlsx)

  • 2021_IV_20211001_20211231_Standort A.xlsx (https://www.herber.de/bbs/user/151868.xlsx)

  • und die mit Deinem VBA-Code gefertigte Jahresübersicht
  • 2021_Jahresübersicht_Standort A.xlsx (https://www.herber.de/bbs/user/151869.xlsx)

  • beigefügt.
    Weiterhin habe ich meine Zieldatei.xlsm (https://www.herber.de/bbs/user/151870.xlsm) beigefügt, die Deinen VBA-Code mit meinen Anpassungen bzgl. der Bereiche enthält.
    Ganz liebe Grüße
    RohDiamant
    AW: so nicht nachvollziehbar ...
    20.03.2022 04:30:07
    RohDiamant
    Hallo Yal,
    ich habe mir die Nacht um die Ohren geschlagen und einiges ausprobiert, bisher leider ohne Erfolg.
    Ich habe testweise in Zelle B5 der Quelldatei jeweils "Quartal 1", "Quartal 2", "Quartal 3", "Quartal 4" geschrieben und bekomme dann zumindest auch alle Quartale eingelesen. Leider werden hierbei allerdings die Werte aus den Quelldateien in den Zielbereich F5:F18 geschrieben, obwohl das Ziel mit E5:E18 definiert ist.
    Hier mal der angepasste Code:
    
    'Code in einem allgemeinen Modul
    Sub Daten_einlesen()
    Dim FD As FileDialog
    Dim wkbQuelle As Workbook
    Dim wksQuelle As Worksheet
    Dim wksZiel As Worksheet
    Dim DateiPfad As Variant
    Dim StatusCalc As Long
    Dim Sp As Range
    'Dateiauswahl
    Set FD = Application.FileDialog(msoFileDialogOpen)
    FD.Title = "Bitte auszuwertende Dateien auswählen - Mehrfachauswahl ist möglich"
    FD.AllowMultiSelect = True
    FD.Show
    'Makrobremsen lösen
    With Application
    StatusCalc = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    End With
    'gewählte Dateien abarbeiten
    For Each DateiPfad In FD.SelectedItems
    Set wkbQuelle = Application.Workbooks.Open(Filename:=DateiPfad, ReadOnly:=True)
    Set wksQuelle = wkbQuelle.Sheets(1)
    'Gegenstand lesen
    For Each Sp In wksQuelle.Range("E7:BZ7").Cells 'anpassen: bis wo gibt es "Zuständigkeiten"?
    If Sp.Value = "" Then Exit For
    'Gegenstand lesen, Worksheet selektieren oder erzeugen
    Set wksZiel = Worksheet_auswählen(Sp.Value)
    'in Jahresübersicht (neues Blatt)
    'Wenn Zielzelle A7 leer, dann
    If wksZiel.Range("A7") = "" Then
    'setze in Tabellenblatt der Zieldatei im Bereich A7:C18 die Werte aus dem Tabellenblatt der Quelldatei im Bereich A7:C18
    wksZiel.Range("A7:C18") = wksQuelle.Range("A7:C18").Value 'Zeilenüberschriften
    'setze Spaltenüberschriften in Zeile 4 der Zieldatei
    wksZiel.Range("D4:H4") = Array("Jahresergebnis zu", "Quartal 1", "Quartal 2", "Quartal 3", "Quartal 4") 'Spaltenüberschriften
    'setze in der Spalte Jahresergebnis der Zieldatei die Formeln
    wksZiel.Range("D9:D18").Formula = "=H9" 'Werte Quartal 4., per Default zuerst überall
    wksZiel.Range("D11:D13, D16:D18").FormulaLocal = "=SUMME(E11:H11)" 'Summierbare Werte (Bewegung)
    wksZiel.Range("D9:D10").Formula = "=E9" 'Werte Quartal 1
    End If
    Quartal = CLng(Right(wksQuelle.Range("B5"), 1)) 'QuartalNr isolieren
    wksZiel.Range("E5:E18").Offset(0, Quartal).Value = Intersect(wksQuelle.Rows("5:18"), Sp.EntireColumn).Value 'Werte übertragen
    Next
    wkbQuelle.Close savechanges:=False
    Next
    'Makrobremsen zurücksetzen
    With Application
    .Calculation = StatusCalc
    .ScreenUpdating = True
    .EnableEvents = True
    End With
    'Zieltabelle formatieren
    With wksZiel
    .Columns.AutoFit
    End With
    End Sub
    Private Function Worksheet_auswählen(WsName As String) As Worksheet
    Dim W As Worksheet
    On Error Resume Next
    Set W = ThisWorkbook.Worksheets(WsName)
    If W Is Nothing Then
    Set W = ThisWorkbook.Worksheets.Add
    W.Name = WsName
    End If
    Set Worksheet_auswählen = W
    End Function
    
    und die beigefügte Jahresübersicht "2021_Jahresübersicht_Standort_A_Test2.xlsx" (https://www.herber.de/bbs/user/151892.xlsx).
    Ich finde einfach meinen Fehler nicht. Die Zeile
    
    wksZiel.Range("E5:E18").Offset(0, Quartal).Value = Intersect(wksQuelle.Rows("5:18"), Sp.EntireColumn).Value 'Werte übertragen
    
    enthält den Zielbereich E5:E18, weshalb wird dann das Quartal 1 nicht in Spalte E, sondern in Spalte F unter Quartal 2 eingefügt und auch die weiteren Quartale verschoben?
    Auch unter den Spaltenüberschriften kann ich keinen Fehler entdecken:
    
    wksZiel.Range("D4:H4") = Array("Jahresergebnis zu", "Quartal 1", "Quartal 2", "Quartal 3", "Quartal 4") 'Spaltenüberschriften
    
    Dann habe ich mir überlegt, wie man im Bereich "QuartalNr isolieren" das Quartal ermitteln könnte.
  • Könnte man
    
    Quartal = CLng(Right(wksQuelle.Range("B5"), 1)) 'QuartalNr isolieren
    
    das Quartal aus E1 ermitteln? Z. B. Wenn die Zelle E1 "01.01." enthält, dann ist das Quartal 1, wenn die Zelle E1 "01.04." enthält, ist das Quartal 2, wenn die Zelle E1 "01.07." enthält, dann ist das Quartal 3 und wenn die Zelle E1 "01.10." enthält, dann ist das Quartal 4.

  • Oder könnte man das Quartal aus dem Dateinamen auslesen? Jede Quelldatei enthält eine römische Ziffer im Dateinamen, wie z. B. "2021_I_20210101_20210331_Standort_A.xlsx" (I = Quartal 1). Der Dateiname der Quelldateien ist also immer wie folgt aufgebaut: "JJJJ_Q_Zeitraum_Standort.xlsx" (Q = Quartal).

  • Weiterhin habe ich einen Bereich "'Zieltabelle formatieren" für die Formatierung hinzugefügt. Leider wird diese Formatierung lediglich im zuletzt erstellten Tabellenblatt vorgenommen. Die vorigen Tabellenblätter der Zieldatei werden nicht formatiert.
    Und nun noch eine "letzte" Frage: Könnte man die Tabellenblätter in umgekehrter Reihenfolge einfügen?
    Momentan wird die letzte Zuständigkeit (z. B. 13) als erstes Tabellenblatt ganz links und die erste Zuständigkeit (z. B. 1) als letztes Tabellenblatt ganz rechts eingefügt.
    Könnte man die erste Zuständigkeit (z. B. 1) als erstes Tabellenblatt ganz links und die letzte Zuständigkeit (z. B. 13) als letztes Tabellenblatt ganz rechts einfügen?
    LG
    RohDiamant
    AW: so nicht nachvollziehbar ...
    20.03.2022 19:15:51
    Yal
    Hallo Claudia,
    ich habe ein bischen Schwierigkeiten, mich im Code wiederzufinden, weil einige Sachen sind angepasst worden:
    _ Summen in Spalte D
    _ Quartals in Spalten E,F,G,H
    Wenn ein Gegenstand zum erste mal vorkommt, gibt es eine neues Blatt (Ziel). Wenn es ein neues blatt gibt, ist dort die Zelle A7 leer!
    In dem Fall, und nur in dem Fall, wird die Überschriften (A7:C18) und die Summierungsformeln in D7:D18 gesetzt.
    Zum eine besseren Verständnis, hätte man diese Aufgabe in der Funktion "Worksheet_auswählen" verlagern sollen. Jetzt ist es gemacht.
    Das Auswerten der Quartal (Quelle) wird wiederum bei jeder neu gelesenen Datei ausgewertet, aber nur einmal pro Datei.
    Eigentlich der Inhalt der Zelle E1, davon die zweite Teil den Monat durch 3
    01.01.2021 - 31.03.2021 --> Endmonat: 3,--> Quartal 1
    01.04.2021 - 30.06.2021 --> Endmonat: 6,--> Quartal 2
    usw.
    diese Quartalswert 1, 2, 3, 4 wird verwendet, um die Verschiebung zum richtigen Zielspalte zu ermitteln.
    Zielbereich für Quartaldaten: F7:I18
    ZielBereich für Summen: J7:J18
    Es ergibt sich folgenden, neuen Code:
    
    'Code in einem allgemeinen Modul
    Sub Daten_einlesen()
    Dim FD As FileDialog
    Dim StatusCalc As Long
    Dim wkbQuelle As Workbook
    Dim wksQuelle As Worksheet
    Dim wksZiel As Worksheet
    Dim Sp As Range
    'Dateiauswahl
    Set FD = Application.FileDialog(msoFileDialogOpen)
    FD.Title = "Bitte auszuwertende Dateien auswählen - Mehrfachauswahl ist möglich"
    FD.AllowMultiSelect = True
    FD.Show
    'Makrobremsen lösen
    With Application
    StatusCalc = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    End With
    'gewählte Dateien abarbeiten
    For Each DateiPfad In FD.SelectedItems
    Set wkbQuelle = Application.Workbooks.Open(Filename:=DateiPfad, ReadOnly:=True)
    Set wksQuelle = wkbQuelle.Sheets(1)
    'Datum im Quelle lesen, daraus Quartal ableiten
    Quartal = Month(CDate(Trim(Split(wksQuelle.Range("E1").Value, "-")(1)))) / 3 'QuartalNr isolieren
    'Gegenstand lesen
    For Each Sp In wksQuelle.Range("E7:BZ7").Cells 'anpassen: bis wo gibt es "Zuständigkeiten"?
    If Sp.Value = "" Then Exit For 'Falls der gegebene Bereich der ÜPebrschrift zu grosszügig festgelegt wurde
    'Gegenstand lesen, Worksheet selektieren oder erzeugen
    Set wksZiel = Worksheet_auswählen(Sp.Value, wksQuelle)
    'Werte ans Ziel schrieben, Spalten F, G, H, I
    wksZiel.Range("E5:E18").Offset(0, Quartal).Value = Intersect(wksQuelle.Rows("5:18"), Sp.EntireColumn).Value 'Werte übertragen
    Next
    wkbQuelle.Close savechanges:=False
    Next
    'Makrobremsen zurücksetzen
    With Application
    .Calculation = StatusCalc
    .ScreenUpdating = True
    .EnableEvents = True
    End With
    'Zieltabelle formatieren
    With wksZiel
    .Columns.AutoFit
    End With
    End Sub
    Private Function Worksheet_auswählen(WsName As String, Optional wsQ As Worksheet) As Worksheet
    Dim W As Worksheet
    On Error Resume Next
    Set W = ThisWorkbook.Worksheets(WsName)
    If W Is Nothing Then
    Set W = ThisWorkbook.Worksheets.Add
    W.Name = WsName
    W.Range("A7:C18") = wsQ.Range("A7:C18").Value 'Zeilenüberschriften
    W.Range("D4:H4") = Array("Quartal 1", "Quartal 2", "Quartal 3", "Quartal 4", "Jahresergebnis zu")
    W.Range("D7:D18").Formula = "=H7" 'Werte Quartal 4., per Default zuerst überall
    W.Range("D11:D13, D16:D18").FormulaLocal = "=SUMME(E11:H11)" 'Summierbare Werte (Bewegung)
    W.Range("D9:D10").Formula = "=E9" 'Werte Quartal 1    End If
    Set Worksheet_auswählen = W
    End Function
    
    VG
    Yal
    AW: so nicht nachvollziehbar ...
    21.03.2022 17:41:20
    RohDiamant
    Hallo Yal,
    das ist absolut fantastisch.
    DU BIST MEIN HELD und ich danke Dir nochmals von ganzem Herzen.
    Das klappt wunderbar, nachdem ich noch die ein oder andere kleine Anpassung betreffend die Formatierung, der Spaltenüberschriften und eines Kompilierfehlers, vorgenommen habe. Daher füge ich der Vollständigkeit halber den angepassten VBA-Code ein:
    
    'Code in einem allgemeinen Modul
    Sub Daten_einlesen()
    Dim FD As FileDialog
    Dim StatusCalc As Long
    Dim wkbQuelle As Workbook
    Dim wksQuelle As Worksheet
    Dim wksZiel As Worksheet
    Dim Sp As Range
    'Dateiauswahl
    Set FD = Application.FileDialog(msoFileDialogOpen)
    FD.Title = "Bitte auszuwertende Dateien auswählen - Mehrfachauswahl ist möglich"
    FD.AllowMultiSelect = True
    FD.Show
    'Makrobremsen lösen
    With Application
    StatusCalc = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    End With
    'gewählte Dateien abarbeiten
    For Each DateiPfad In FD.SelectedItems
    Set wkbQuelle = Application.Workbooks.Open(Filename:=DateiPfad, ReadOnly:=True)
    Set wksQuelle = wkbQuelle.Sheets(1)
    'Datum in Quelle lesen, daraus Quartal ableiten
    Quartal = Month(CDate(Trim(Split(wksQuelle.Range("E1").Value, "-")(1)))) / 3 'QuartalNr isolieren
    'Gegenstand lesen
    For Each Sp In wksQuelle.Range("E7:BZ7").Cells 'anpassen: bis wo gibt es "Zuständigkeiten"?
    If Sp.Value = "" Then Exit For 'Falls der gegebene Bereich der Überschrift (Spalten) zu grosszügig festgelegt wurde
    'Gegenstand lesen, Worksheet selektieren oder erzeugen
    Set wksZiel = Worksheet_auswählen(Sp.Value, wksQuelle)
    'Werte ans Ziel schreiben, Spalten E, F, G, H
    wksZiel.Range("D5:D417").Offset(0, Quartal).Value = Intersect(wksQuelle.Rows("5:417"), Sp.EntireColumn).Value 'Werte übertragen
    'Zieltabelle formatieren
    With wksZiel
    .Columns.AutoFit
    End With
    
    Next
    wkbQuelle.Close savechanges:=False
    Next
    'Makrobremsen zurücksetzen
    With Application
    .Calculation = StatusCalc
    .ScreenUpdating = True
    .EnableEvents = True
    End With
    End Sub
    Private Function Worksheet_auswählen(WsName As String, Optional wsQ As Worksheet) As Worksheet
    Dim W As Worksheet
    On Error Resume Next
    Set W = ThisWorkbook.Worksheets(WsName)
    If W Is Nothing Then
    Set W = ThisWorkbook.Worksheets.Add
    W.Name = WsName
    W.Range("A7:C417") = wsQ.Range("A7:C417").Value 'Zeilenüberschriften
    W.Range("D4:H4") = Array("Jahresergebnis zu", "Quartal 1", "Quartal 2", "Quartal 3", "Quartal 4") 'Spaltenüberschriften
    W.Range("D7:D417").Formula = "=H7" 'Werte Quartal 4., per Default zuerst überall
    W.Range("D11:D13, D16:D417").FormulaLocal = "=SUMME(E11:H11)" 'Summierbare Werte (Bewegung)
    W.Range("D9:D10").Formula = "=E9" 'Werte Quartal 1    End If
    End If
    Set Worksheet_auswählen = W
    End Function
    
    Die Anpassungen habe ich zur Verdeutlichung FETT markiert.
    Ich kann Dir gar nicht genug danken.
    Ganz liebe Grüße
    RohDiamant
    AW: so nicht nachvollziehbar ...
    21.03.2022 19:52:25
    Yal
    ;-)
    Durch das Einfügen an der falsche Stelle ist der "End If" am Ende der vorderen Zeile gerückt:
    
    W.Range("D9:D10").Formula = "=E9" 'Werte Quartal 1    End If
    End If 
    
    Es macht auf alle Fälle mehr Spass, wenn die Person, die den Code in der Hand bekommt, etwas daraus machen und meine Vertipper eigenständig korrigieren kann.
    VG
    Yal

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige