Von mehreren Arbeitsmappen, einen Datenbereich anstelle von Formeln die Werte per VBA in eine andere Arbeitsmappe zusammenführen.
Ich bin mir ziemlich sicher, dass wenn man sucht, jemand eine Lösung findet. Nun habe ich eine Excel Aufgabe erhalten, die ich leider nicht alleine lösen kann. Mit VBA und Makros habe ich keine Erfahrung. Wäre schön wenn mir jemand aus diesem Forum helfen könnte. Ich habe hier schon einige fast Lösungen entdeckt, aber es geht dann leider doch immer noch daneben.
Gruss maxueli
Hier meine Aufgabe:
In mehreren Ordner in der Windows Verzeichnisstruktur sind etliche Excel Arbeitsmappen mit der Bezeichnung „Personennamen.xls (Pro Mitarbeiter eine Datei) enthalten.
Diese Dateien sind für die Mitarbeiter erstellt, damit die Stundenaufwendungen eingetragen werden können. Die Stunden vom Januar trägt er in die Tabelle „Monat_Januar“ ein. Somit sind in der obigen Datei immer 12 Tabellen enthalten.
Monatlich möchte ich nun aus den etlichen „Personennamen.xls“ mit einem Makro eine Arbeitsmappe „Stundenzusammenfassung.xls“ für die Auswertung erstellen. Diese Mappe hat eine Tabelle „Daten-Import“.
Die Daten Ergebnisse in den „Persoanlnamen.xls“ werden mehrheitlich aus Formeln zusammengestellt.
Das Makro sollte sich in der Arbeitsmappe „Stundenzusammenfassung.xls) befinden.
Bei der Ausführung holt das Makro in den div. „Personalnamen.xls“ in der Tabelle „Stunden_Januar“ ab Zelle A6 bis Spalte F(Zeilenanzahl nach unten in der Tabelle ist variabel) die Daten und kopiert die Daten als „Werte“ in die Tabelle „Daten-Import“ untereinander in der Arbeitsmappe „Stundenzusammenfassung.xls . Dazwischen sollten wenn möglich die Daten vom nächsten Mitarbeiter eingefügt werden eine Leerzeile eingefügt werden.
Es sollen nicht die Formeln kopiert werden, sondern nur die Werte.
Wenn das Makro im nächsten Monat erneut ausgeführt wird, sollen die Daten vom Tabelle „ Stunden_Februar“ geholt werden. Die alten Werte in der Tabelle „Daten-Import“ vom Januar sollen ab Zeile 7 alle gelöscht werden, wenn die Werte vom Februar geholt werden.
Die ersten 6 Zeilen in der Tabelle „Daten-Import“ sollen durch das Makro nicht bearbeitet werden, weil Kommentare und Text in diesem Bereich steht.
Ich hoffe, dass ich meine Aufgabe für das Forum nachvollziehbar formuliert habe.
Gruss maxueli
Hier meine Aufgabe:
In mehreren Ordner in der Windows Verzeichnisstruktur sind etliche Excel Arbeitsmappen mit der Bezeichnung „Personennamen.xls (Pro Mitarbeiter eine Datei) enthalten.
Diese Dateien sind für die Mitarbeiter erstellt, damit die Stundenaufwendungen eingetragen werden können. Die Stunden vom Januar trägt er in die Tabelle „Monat_Januar“ ein. Somit sind in der obigen Datei immer 12 Tabellen enthalten.
Monatlich möchte ich nun aus den etlichen „Personennamen.xls“ mit einem Makro eine Arbeitsmappe „Stundenzusammenfassung.xls“ für die Auswertung erstellen. Diese Mappe hat eine Tabelle „Daten-Import“.
Die Daten Ergebnisse in den „Persoanlnamen.xls“ werden mehrheitlich aus Formeln zusammengestellt.
Das Makro sollte sich in der Arbeitsmappe „Stundenzusammenfassung.xls) befinden.
Bei der Ausführung holt das Makro in den div. „Personalnamen.xls“ in der Tabelle „Stunden_Januar“ ab Zelle A6 bis Spalte F(Zeilenanzahl nach unten in der Tabelle ist variabel) die Daten und kopiert die Daten als „Werte“ in die Tabelle „Daten-Import“ untereinander in der Arbeitsmappe „Stundenzusammenfassung.xls . Dazwischen sollten wenn möglich die Daten vom nächsten Mitarbeiter eingefügt werden eine Leerzeile eingefügt werden.
Es sollen nicht die Formeln kopiert werden, sondern nur die Werte.
Wenn das Makro im nächsten Monat erneut ausgeführt wird, sollen die Daten vom Tabelle „ Stunden_Februar“ geholt werden. Die alten Werte in der Tabelle „Daten-Import“ vom Januar sollen ab Zeile 7 alle gelöscht werden, wenn die Werte vom Februar geholt werden.
Die ersten 6 Zeilen in der Tabelle „Daten-Import“ sollen durch das Makro nicht bearbeitet werden, weil Kommentare und Text in diesem Bereich steht.
Ich hoffe, dass ich meine Aufgabe für das Forum nachvollziehbar formuliert habe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 138203
Url: https://administrator.de/forum/von-mehreren-arbeitsmappen-einen-datenbereich-anstelle-von-formeln-die-werte-per-vba-in-eine-andere-138203.html
Ausgedruckt am: 08.04.2025 um 18:04 Uhr
40 Kommentare
Neuester Kommentar
cells(0,0).value liefert den Wert
Stefan
Stefan
^Moin maxueli,
willkommen im Forum.
Rückfragen:
Grüße
Biber
willkommen im Forum.
Rückfragen:
- wo tauchen in der "monatlichen Zusammenfassung" die identifizierenden Daten der Mitarbeiter auf (Name oder PersNr)? Sollen die aus dem Quell-XLS-Dateinamen übernommen werden?
- Wenn denn schon eine "monatliche Zusammenfassung", warum dann nicht je eine für "Zusammenfassung_2010-01.xls" etc?
- wenn denn schon eine weitere Kopie bereits vorhandener Daten meinetwegen mit dem Etikett "Zusammenfassung" - warum wird da nichts zusammengefasst, sondern alle Details in epischer Länge übernommen?
Grüße
Biber

Hallo maxueli!
Also, von mir erstmal ein großes Lob für gute Beschreibung Deines Vorhabens
Der nachfolgende Code durchsucht in dem angebebenen Ordnerpfad (ExternPfad) alle Unter-Ordner der 1. Ebene nach *.xls-Dateien. Für den entsprechenden Monat habe ich zunächst einmal eine InputBox mit der Abfrage des Monats als Zahl vorgesehen. Das automatische ermitteln des aktuellen Monats anhand des Datums wäre hierbei auch eine Möglichkeit. Ansonsten denke ich, dass ich alle Deine Kriterien soweit berücksichtigt habe.
Quellcode in ein Modul kopieren und die Konstanten entsprechend anpassen:
Gruß Dieter
Also, von mir erstmal ein großes Lob für gute Beschreibung Deines Vorhabens
Der nachfolgende Code durchsucht in dem angebebenen Ordnerpfad (ExternPfad) alle Unter-Ordner der 1. Ebene nach *.xls-Dateien. Für den entsprechenden Monat habe ich zunächst einmal eine InputBox mit der Abfrage des Monats als Zahl vorgesehen. Das automatische ermitteln des aktuellen Monats anhand des Datums wäre hierbei auch eine Möglichkeit. Ansonsten denke ich, dass ich alle Deine Kriterien soweit berücksichtigt habe.
Quellcode in ein Modul kopieren und die Konstanten entsprechend anpassen:
Option Explicit
Option Compare Text
Const ExternPfad = "E:\Threads\$Test\TestToDo" 'Externe Dateien Ordner-Pfad
Const ExternRange = "A6:F" 'Externe Dateien Zell-Teilbereich
Const InternSheet = "Daten-Import" 'Interne Tabelle für den Import
Const InternStart = 7 'Interne Tabelle Start-Zeile
Const Msg1 = "Bitte Monatszahl (1-12) eingeben:"
Const Err1 = "Der angegebene Ordner existiert nicht!"
Const Err2 = "Die Eingabe ist ungültig!"
Sub GetExternData()
Dim Wks As Worksheet, Wks0 As Worksheet, WkbX As Workbook, WksX As Worksheet, SheetName As String
Dim Fso As Object, Folder As Object, File As Object, Monat As Integer, NextLine As Long
Set Fso = CreateObject("Scripting.FileSystemObject")
If Fso.FolderExists(ExternPfad) = False Then MsgBox Err1, vbExclamation, "Fehler": Exit Sub
Monat = Application.InputBox(Msg1, "Eingabe Monat", "1", Type:=1)
If Monat <= 0 Then Exit Sub
If Monat > 12 Then MsgBox Err2, vbExclamation, "Fehler": Exit Sub
SheetName = "*" & GetMonth(Monat) & "*"
Set Wks0 = ThisWorkbook.Sheets(InternSheet)
Wks0.Range(Rows(InternStart), Rows(Wks0.Rows.Count)).Cells.ClearContents
NextLine = InternStart
Application.ScreenUpdating = False
For Each Folder In Fso.GetFolder(ExternPfad).SubFolders
For Each File In Folder.Files
If Fso.GetExtensionName(File) Like "XLS" Then
Set WksX = Nothing
Set WkbX = GetObject(File.Path)
For Each Wks In WkbX.Worksheets
If Wks.Name Like SheetName Then Set WksX = Wks: Exit For
Next
If Not WksX Is Nothing Then
WksX.Range(ExternRange & GetEndLine(WksX)).Copy
Wks0.Cells(NextLine, "A").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
With Application
.DisplayAlerts = False: WkbX.Close False: .DisplayAlerts = True
End With
NextLine = GetEndLine(Wks0) + 2
End If
End If
Next
Next
Wks0.Cells(InternStart, "A").Select
Application.ScreenUpdating = True
End Sub
Private Function GetEndLine(ByRef Wks) As Long
GetEndLine = Wks.Cells(Wks.Rows.Count, "A").End(xlUp).Row
End Function
Private Function GetMonth(ByVal M As Integer) As String
GetMonth = Switch(M = 1, "_Jan", M = 2, "_Feb", M = 3, "_Mär", M = 4, "_Apr", _
M = 5, "_Mai", M = 6, "_Jun", M = 7, "_Jul", M = 8, "_Aug", _
M = 9, "_Sep", M = 10, "_Okt", M = 11, "_Nov", M = 12, "_Dez")
End Function
Gruß Dieter

Hallo Max!
Die Codezeile 68 habe ich geändert und sollte jetzt gehen. Wenn dieser Teil nicht Funktioniert, dann geht natürlich der ganze Rest nicht, da diese Funktion immer die letzte Zeile eines Bereichs ermittelt.
Das mit der Speichernabfrage kann ich mir allerdings nicht erklären, da ich in der Codezeile 54, diese Abfrage eigentlich unterbinde und die jeweilige Personennamen.Xls ohne Änderung schließe. Das ist jedenfalls der Sinn dieser Codezeile und funktioniert in der Regel?
Gruß Dieter
PS. Letzterer Fehler hängt mit der GetEndLine-Funktion zusammen, weil Du einen Laufzeitfehler erhalten hast, wurde der Rest des Codes nicht ausgeführt und somit hast Du die Auffordung erhalten "Personennamen.Xls zu speichern". Also falls es nochmal zu einem Laufzeitfehler kommen sollte, dann das Speichern in jedem Fall VERNEINEN.
Die Codezeile 68 habe ich geändert und sollte jetzt gehen. Wenn dieser Teil nicht Funktioniert, dann geht natürlich der ganze Rest nicht, da diese Funktion immer die letzte Zeile eines Bereichs ermittelt.
Das mit der Speichernabfrage kann ich mir allerdings nicht erklären, da ich in der Codezeile 54, diese Abfrage eigentlich unterbinde und die jeweilige Personennamen.Xls ohne Änderung schließe. Das ist jedenfalls der Sinn dieser Codezeile und funktioniert in der Regel?
Gruß Dieter
PS. Letzterer Fehler hängt mit der GetEndLine-Funktion zusammen, weil Du einen Laufzeitfehler erhalten hast, wurde der Rest des Codes nicht ausgeführt und somit hast Du die Auffordung erhalten "Personennamen.Xls zu speichern". Also falls es nochmal zu einem Laufzeitfehler kommen sollte, dann das Speichern in jedem Fall VERNEINEN.

Hallo Max!
Yepp, gern geschehen
Freut mich, wenn es nun wie vorgesehen funktioniert.
Gruß Dieter
PS. Habe in der Codezeile 33 sicherheitshalber auch noch eine kleine Änderung vorgenommen.
Yepp, gern geschehen
Freut mich, wenn es nun wie vorgesehen funktioniert.
Gruß Dieter
PS. Habe in der Codezeile 33 sicherheitshalber auch noch eine kleine Änderung vorgenommen.

Hallo Max!
Oha, habe heute tagsüber leider wenig Zeit und werde mir das erst heute Abend etwas genauer ansehen können
Grüße aus Deutschland
Dieter
Oha, habe heute tagsüber leider wenig Zeit und werde mir das erst heute Abend etwas genauer ansehen können
Grüße aus Deutschland
Dieter

Hallo Max!
Gruß Dieter
Zitat von @maxueli:
1. Aus den Arbeitsmappen „Personennamen.xls“ möchte ich nun noch explizit einzelne durch den Makro-Code zu
definierende Spalten, z.B. Spalte A-F und Spalte H, usw. in die Arbeitsmappe „Stundenzusammenfassung.xls“ Tabelle
„Daten-Import“ übernehmen können. Wie vorher ist die Zeilenanzahl variabel. Ich kann auch ein Makro...
Wäre zunächst meine 1. Frage, wie kopiert werden soll? 1:1 oder z.B. Spalte A-F und Spalte H in Ziel in Spalte A-G?1. Aus den Arbeitsmappen „Personennamen.xls“ möchte ich nun noch explizit einzelne durch den Makro-Code zu
definierende Spalten, z.B. Spalte A-F und Spalte H, usw. in die Arbeitsmappe „Stundenzusammenfassung.xls“ Tabelle
„Daten-Import“ übernehmen können. Wie vorher ist die Zeilenanzahl variabel. Ich kann auch ein Makro...
Gruß Dieter

Hallo nochmal!
Zu 2. Der SpecialFilter ist etwas problematisch?
AutoFilter wäre kein Problem, aber bei SpecialFilter finde ich keine Möglichkeit, per VBA Informationen abzufragen. Das wäre aber soweit kein Problem, denn dafür hätte ich trotzdem eine Lösung. Wenn allerdings im SpecialFilter die Funktion Kopieren ausgewählt wird/wurde und sich die Filter-Daten irgendwie im Bereich der zu kopierenden Daten befinden, sehe ich keine Möglichkeit herauszufinden, was jetzt Kopierdaten und/oder was jetzt Filterdaten sind.
Ein weiteres unlösbares Problem wäre noch, wenn Filter gesetzt sind und die Arbeitsmappen und/oder Tabellenblätter geschützt sind. Dann besteht überhaupt keine Möglichkeit die Daten vollständig zu kopieren.
D.h. von der Funktion her, müsste man das jeweilige Tabellenblatt temporär kopieren, die Filter außerkraftsetzen und dann erst kopieren, aber das geht eben nur ohne Schutz.
Gruß Dieter
PS. Es sei denn, Du hättest die Passwörter, dann wäre ein eventueller Schutz auch kein Problem
Zu 2. Der SpecialFilter ist etwas problematisch?
AutoFilter wäre kein Problem, aber bei SpecialFilter finde ich keine Möglichkeit, per VBA Informationen abzufragen. Das wäre aber soweit kein Problem, denn dafür hätte ich trotzdem eine Lösung. Wenn allerdings im SpecialFilter die Funktion Kopieren ausgewählt wird/wurde und sich die Filter-Daten irgendwie im Bereich der zu kopierenden Daten befinden, sehe ich keine Möglichkeit herauszufinden, was jetzt Kopierdaten und/oder was jetzt Filterdaten sind.
Ein weiteres unlösbares Problem wäre noch, wenn Filter gesetzt sind und die Arbeitsmappen und/oder Tabellenblätter geschützt sind. Dann besteht überhaupt keine Möglichkeit die Daten vollständig zu kopieren.
D.h. von der Funktion her, müsste man das jeweilige Tabellenblatt temporär kopieren, die Filter außerkraftsetzen und dann erst kopieren, aber das geht eben nur ohne Schutz.
Gruß Dieter
PS. Es sei denn, Du hättest die Passwörter, dann wäre ein eventueller Schutz auch kein Problem

Hallo Max!

Gruß Dieter
Zitat von @maxueli:
Also es geht darum , dass ich in in der Stundezusammenfassung nicht alle Spaltenwerte von den Personennamen xls benötige,
z.B. brauche ich die Werte aus der Spalte B nicht.
Jetzt habe ich mir gedacht, dass Du im Makro bereiche definierst, welche kopiert werden.
Bisher war es ja A6:J, nun wäre es neu A6:B, und D6:F und noch die Spalten werte ab H6:H,
würde das gehen? Wenn der Code vorliegt kann ich ja selber den Bereich noch anpassen.
Das ist dann leicht für mich zu machen.
Ja, dass ist soweit schon klar und auch kein Problem, sofern wie gesagt, die Daten aber dann in der Zusammenfassung wieder zusammenhängend kopiert werden. Z.B. Spalten A:B und Spalten E:F und Spalte H würde dann in der Zusammenfassung als Spalte A:E eingefügt werden, also hintereinanderAlso es geht darum , dass ich in in der Stundezusammenfassung nicht alle Spaltenwerte von den Personennamen xls benötige,
z.B. brauche ich die Werte aus der Spalte B nicht.
Jetzt habe ich mir gedacht, dass Du im Makro bereiche definierst, welche kopiert werden.
Bisher war es ja A6:J, nun wäre es neu A6:B, und D6:F und noch die Spalten werte ab H6:H,
würde das gehen? Wenn der Code vorliegt kann ich ja selber den Bereich noch anpassen.
Das ist dann leicht für mich zu machen.
Gruß Dieter

Hallo Max!
OK, es gibt die die Möglichkeit trotz Blattschutz Filter zu verwenden, wenn diese Funktionen freigegeben wird. Und ist die Arbeitsmappe auch mit einem Schutz versehn oder nur die Tabellenblätter. Ein Tabellenblatt kann nähmlich nur kopiert werden, wenn der Arbeitsmappen-Schutz aufgehoben ist (das ganze Tabellenblatt ist gemeint)?
Gruß Dieter
PS Oder besser wäre es natürlich, wenn man den Filter zum Kopieren einfach außerkraftsetzen könnte, ohne ihn wiederherstellen zu müssen
OK, es gibt die die Möglichkeit trotz Blattschutz Filter zu verwenden, wenn diese Funktionen freigegeben wird. Und ist die Arbeitsmappe auch mit einem Schutz versehn oder nur die Tabellenblätter. Ein Tabellenblatt kann nähmlich nur kopiert werden, wenn der Arbeitsmappen-Schutz aufgehoben ist (das ganze Tabellenblatt ist gemeint)?
Gruß Dieter
PS Oder besser wäre es natürlich, wenn man den Filter zum Kopieren einfach außerkraftsetzen könnte, ohne ihn wiederherstellen zu müssen

Guten Morgen Max!
War wohl doch schon etwas spät am Abend

Zum Thema Schutz und AutoFilter:
Das hat sich eigentlich auch soweit erledigt, sofern sich der Autofilter auch ohne Schutz deaktivieren läßt.
Zum Thema Kopieren der Zellinhalte:
Wenn ich Dich weiter oben richtig verstanden habe, dann soll im Tabellenblatt Personennamen.xls aktuell die Spalte H als Bezugspunkt für die Kopieraktion verwendet werden. D.h. in Spalte H die letzte Zeile mit Inhalt ermitteln und außerdem nur Zeilen kopieren, in denen die Zelle in Spalte H nicht Leer ist. Wenn dem so ist, wäre es für mich dann noch interessant zu wissen, ob in diesem Fall dann auch die Spalte A einen Wert enthält, also Zelle H und Zelle A sind nicht Leer?
Diese Angabe ist insofern wichtig, um in der Zusammenfassung die letzte Zeile (NextLine) ermitteln zu können. Die Spalte H ist ja nach dem Kopiervorgang nicht mehr Spalte H sondern im Beispiel Kopie Spalten A:B und D:F und H dann die Spalte F. Von daher wäre es gut einen festen Bezugspunkt wie z.B. Spalte A verwenden zu können.
Gruß Dieter
War wohl doch schon etwas spät am Abend
"Stundenzusammenfassung.xls“ läuft nur einmal im Monat, immer ca. im 2. od. 3. Tag im nächsten Monat, da
könnte der Filter für den Monat 1 zurückgenommen werden.
Sorry, bei mir war's wohl auch schon zu spät und hatte irgendwie vor lauter Schutz vergessen, dass die Personennamen.xls ja ohne speichern geschlossen wird. Von daher ist es vollkommen wurscht, ob der Filter einfach gelöscht wird. Da habe ich doch tatsächlich Dich und mich selber verwirrt und habe für meine Doofheit eigentlich Haue verdientkönnte der Filter für den Monat 1 zurückgenommen werden.
Nach der Auswertung sollte der Blattschutz wieder mit dem Makro aktiviert werden...
An den Personennamen.xls ändert sich nichts.Wie ist Deine Meinung für die Gestaltung der „Personennamen.xls“ kann ich so weitermachen?
Ist soweit alles realisierbar.Zum Thema Schutz und AutoFilter:
Das hat sich eigentlich auch soweit erledigt, sofern sich der Autofilter auch ohne Schutz deaktivieren läßt.
Zum Thema Kopieren der Zellinhalte:
Wenn ich Dich weiter oben richtig verstanden habe, dann soll im Tabellenblatt Personennamen.xls aktuell die Spalte H als Bezugspunkt für die Kopieraktion verwendet werden. D.h. in Spalte H die letzte Zeile mit Inhalt ermitteln und außerdem nur Zeilen kopieren, in denen die Zelle in Spalte H nicht Leer ist. Wenn dem so ist, wäre es für mich dann noch interessant zu wissen, ob in diesem Fall dann auch die Spalte A einen Wert enthält, also Zelle H und Zelle A sind nicht Leer?
Diese Angabe ist insofern wichtig, um in der Zusammenfassung die letzte Zeile (NextLine) ermitteln zu können. Die Spalte H ist ja nach dem Kopiervorgang nicht mehr Spalte H sondern im Beispiel Kopie Spalten A:B und D:F und H dann die Spalte F. Von daher wäre es gut einen festen Bezugspunkt wie z.B. Spalte A verwenden zu können.
Gruß Dieter

Hallo Max!
Hier mal ein neuer Code. In der Annahme, dass ich soweit alles richtig verstanden habe.
Geändert hat sich im wesentlichen:
1. Die Konstanten in Bezug auf Extern..
2. Die Funktion GetEndLine mit Spaltenangabe
3. Löschen des AutoFilters
4. Der Kopierteil mit Test auf Leer-Zelle und Zeilenweise kopieren
Auch in der Annahme, das sich der AutoFilter hinsichtlich des Blattschutzes ohne Schutzaufhebung deaktivieren läßt?
Gruß Dieter
Hier mal ein neuer Code. In der Annahme, dass ich soweit alles richtig verstanden habe.
Geändert hat sich im wesentlichen:
1. Die Konstanten in Bezug auf Extern..
2. Die Funktion GetEndLine mit Spaltenangabe
3. Löschen des AutoFilters
4. Der Kopierteil mit Test auf Leer-Zelle und Zeilenweise kopieren
Option Explicit
Option Compare Text
Const ExternPfad = "E:\Threads\138203\ToDoListen" 'Externe Dateien Ordner-Pfad
Const ExternRange = "A?:B?,D?:F?,H?" 'Externe Dateien Zellbereich (?=Per Code Zeilennummer einfügen)
Const ExternStart = 6 'Externe Dateien Startzeile
Const ExternSpalte = "H" 'Externe Dateien Bezugsspalte (Leer-Test)
Const InternSheet = "Daten-Import" 'Interne Tabelle für Import
Const InternStart = 7 'Interne Tabelle Startzeile
Const Msg1 = "Bitte Monatszahl (1-12) eingeben:"
Const Err1 = "Der angegebene Ordner existiert nicht!"
Const Err2 = "Die Eingabe ist ungültig!"
Sub GetExternData()
Dim Wks As Worksheet, Wks0 As Worksheet, WkbX As Workbook, WksX As Worksheet, SheetName As String
Dim Fso As Object, Folder As Object, File As Object, Monat As Integer, NextLine As Long, c As Range
Set Fso = CreateObject("Scripting.FileSystemObject")
If Fso.FolderExists(ExternPfad) = False Then MsgBox Err1, vbExclamation, "Fehler": Exit Sub
Monat = Application.InputBox(Msg1, "Eingabe Monat", "1", Type:=1)
If Monat <= 0 Then Exit Sub
If Monat > 12 Then MsgBox Err2, vbExclamation, "Fehler": Exit Sub
SheetName = "*" & GetMonth(Monat) & "*"
Set Wks0 = ThisWorkbook.Sheets(InternSheet)
Wks0.Range(Rows(InternStart), Rows(Wks0.Rows.Count)).Cells.ClearContents
NextLine = InternStart
Application.ScreenUpdating = False
For Each Folder In Fso.GetFolder(ExternPfad).SubFolders
For Each File In Folder.Files
If Fso.GetExtensionName(File) Like "XLS" Then
Set WksX = Nothing
Set WkbX = GetObject(File.Path)
For Each Wks In WkbX.Worksheets
If Wks.Name Like SheetName Then Set WksX = Wks: Exit For
Next
If Not WksX Is Nothing Then
WksX.AutoFilterMode = False
For Each c In WksX.Rows(ExternStart & ":" & GetEndLine(WksX, ExternSpalte))
If Not IsEmpty(c.Columns(ExternSpalte)) Then
WksX.Range(Replace(ExternRange, "?", c.Row)).Copy
Wks0.Cells(NextLine, "A").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
NextLine = NextLine + 1
End If
Next
With Application
.DisplayAlerts = False: WkbX.Close False: .DisplayAlerts = True
End With
NextLine = GetEndLine(Wks0, "A") + 2
End If
End If
Next
Next
Wks0.Cells(InternStart, "A").Select
Application.ScreenUpdating = True
End Sub
Private Function GetEndLine(ByRef Wks, ByVal Col As Variant) As Long
GetEndLine = Wks.Cells(Wks.Rows.Count, Col).End(xlUp).Row
End Function
Private Function GetMonth(ByVal M As Integer) As String
GetMonth = Switch(M = 1, "_Jan", M = 2, "_Feb", M = 3, "_Mär", M = 4, "_Apr", _
M = 5, "_Mai", M = 6, "_Jun", M = 7, "_Jul", M = 8, "_Aug", _
M = 9, "_Sep", M = 10, "_Okt", M = 11, "_Nov", M = 12, "_Dez")
End Function
Auch in der Annahme, das sich der AutoFilter hinsichtlich des Blattschutzes ohne Schutzaufhebung deaktivieren läßt?
Gruß Dieter

Hallo Max!

Die Fragezeichen sind Dummys für die Zeilennummer, die ja noch unbekannt sind und erst in der Kopier-Routine initialisiert bzw. durch die jeweilige Zeilennumer ersetzt werden (Siehe Codezeile 56 Replace). Also, bei Range-Angabe die Zeilennumer immer als Fragezeichen angeben. Indem Fall stimmen ja die Vorgaben bereits und muss nix geändert werden.
Gruß Dieter
Zitat von @maxueli:
Ds Makro will noch nicht.
1.Mir ist nicht klar, was ich in den Code schreiben soll:
Const ExternRange = "A?:B?,D?:F?,H?" 'Externe Dateien Zellbereich (?=Per Code Zeilennummer
einfügen)
ich habe u.a.folgendes probiert: geht aber nicht.
Const ExternRange = "A100:B100,D100:F100,H100" 'Externe Dateien Zellbereich (?=Per Code Zeilennummer einfügen)
Das hast Du missverstanden. Habe extra in Klammer geschrieben "?=Per Code..."Ds Makro will noch nicht.
1.Mir ist nicht klar, was ich in den Code schreiben soll:
Const ExternRange = "A?:B?,D?:F?,H?" 'Externe Dateien Zellbereich (?=Per Code Zeilennummer
einfügen)
ich habe u.a.folgendes probiert: geht aber nicht.
Const ExternRange = "A100:B100,D100:F100,H100" 'Externe Dateien Zellbereich (?=Per Code Zeilennummer einfügen)
Die Fragezeichen sind Dummys für die Zeilennummer, die ja noch unbekannt sind und erst in der Kopier-Routine initialisiert bzw. durch die jeweilige Zeilennumer ersetzt werden (Siehe Codezeile 56 Replace). Also, bei Range-Angabe die Zeilennumer immer als Fragezeichen angeben. Indem Fall stimmen ja die Vorgaben bereits und muss nix geändert werden.
Gruß Dieter

Hallo Max!
Dann hast Du eventuell was verändert und das Tabellenblatt "Daten-Import" existiert nicht bzw. die Konstante "InternSheet" nicht entsprechend angepasst?
Gruß Dieter
Dann hast Du eventuell was verändert und das Tabellenblatt "Daten-Import" existiert nicht bzw. die Konstante "InternSheet" nicht entsprechend angepasst?
Gruß Dieter

Hallo Max!
Sowas in der Art hatte ich vermutet
Aber die EMail-Adresse solltest Du schnell wieder entfernen (Spams...)!
Gruß Dieter
Sowas in der Art hatte ich vermutet
Jetzt läuft es Super, Extrakt ist nun übersichtlich, ich bin begeistert wie Du mir so rasch geholfen hast.
Die Ausgestaltung der Blätter kann ich nun selber machen. Projekt schliessen wir nun ab.
Prima, freut mich, wenn soweit alles rundläuft!Die Ausgestaltung der Blätter kann ich nun selber machen. Projekt schliessen wir nun ab.
Gerne würde ich Dir als süssen Dank eine CH-Praline zukommen lassen.
Kannst mir wenn Du willst die Adresse auf mein E-Mail ......................... zustellen.
Danke, auf das Angebot komme ich gerne zurückKannst mir wenn Du willst die Adresse auf mein E-Mail ......................... zustellen.
Gruß Dieter

Hallo Max!
Ups, da habe ich wohl auch wieder etwas geschlafen
Gruß Dieter
Ups, da habe ich wohl auch wieder etwas geschlafen
Gruß Dieter

Hallo Max!
Sorry, aber ich bin erst Heute aus dem Krankenhaus entlassen worden
Ändere Codezeile 7 in:
Füge in Codezeile 8 ein:
Ersetze Codzeile 54 und 55 durch:
Gruß Dieter
Sorry, aber ich bin erst Heute aus dem Krankenhaus entlassen worden
Ändere Codezeile 7 in:
Const ExternSpalteH = "H" 'Externe Dateien Spalte H (Test Leer)
Const ExternSpalteJ = "J" 'Externe Dateien Spalte J (Test Wert 0)
For Each c In WksX.Rows(ExternStart & ":" & GetEndLine(WksX, ExternSpalteH))
If Not IsEmpty(c.Columns(ExternSpalteH)) And c.Columns(ExternSpalteJ) <> 0 Then
Gruß Dieter

Hallo Max!
Also, wenn die Spalte H keine Rolle mehr spielt und nur noch Zeilen kopiert werden sollen, in deren Spalte J ein Wert ungleich 0 enthalten ist, dann ersetze Codezeile 54 und 55 durch:
Gruß Dieter
Also, wenn die Spalte H keine Rolle mehr spielt und nur noch Zeilen kopiert werden sollen, in deren Spalte J ein Wert ungleich 0 enthalten ist, dann ersetze Codezeile 54 und 55 durch:
For Each c In WksX.Rows(ExternStart & ":" & GetEndLine(WksX, ExternSpalteJ))
If c.Columns(ExternSpalteJ) <> 0 Then
Gruß Dieter

Hallo Max!
Also, wenn diese beiden Codezeilen:
bzw. nach der letzten Änderung, diese beiden Codezeilen:
durch diese Codezeilen ersetzt wurden:
dann sollte es funktionieren. Dann werden Zeilen deren Formelergebnis in Spalte J tatsächlich 0 ist, nicht kopiert, wobei z.B. 0,0000000000001 nicht 0 ist. D.h. wenn Deine Formel z.B. eine Division enthält und Du anhand der Formatvorgabe nur 2 Stellen hinter dem Komma siehst und 0 anzeigt, kann es trotzdem sein, dass der tatsächliche Wert nicht 0 ist.
In diesem Fall wäre erst mal zu klären, was ist 0? Ist 0,999999 oder -0,999999 gleich 0?
Wenn ja, dann ändere:
in:
Gruß Dieter
Also, wenn diese beiden Codezeilen:
For Each c In WksX.Rows(ExternStart & ":" & GetEndLine(WksX, ExternSpalte))
If Not IsEmpty(c.Columns(ExternSpalte)) Then
For Each c In WksX.Rows(ExternStart & ":" & GetEndLine(WksX, ExternSpalteH))
If Not IsEmpty(c.Columns(ExternSpalteH)) And c.Columns(ExternSpalteJ) <> 0 Then
For Each c In WksX.Rows(ExternStart & ":" & GetEndLine(WksX, ExternSpalteJ))
If c.Columns(ExternSpalteJ) <> 0 Then
In diesem Fall wäre erst mal zu klären, was ist 0? Ist 0,999999 oder -0,999999 gleich 0?
Wenn ja, dann ändere:
If c.Columns(ExternSpalteJ) <> 0 Then
If Fix(c.Columns(ExternSpalteJ)) <> 0 Then
Gruß Dieter

Hallo Max!
Bei der ursprünglichen Formel hättest Du dann nicht auf 0 sondern auf Leer hinweisen müssen. 0 und Leer ist nicht das gleiche, aber dann hätte man anstatt <> 0 einfach durch <> "" ersetzen können
Gruß Dieter
Bei der ursprünglichen Formel hättest Du dann nicht auf 0 sondern auf Leer hinweisen müssen. 0 und Leer ist nicht das gleiche, aber dann hätte man anstatt <> 0 einfach durch <> "" ersetzen können
Gruß Dieter

Hallo Max!
Eröffne bitte einen neuen Thread (Beitrag) und kopiere Deinen letzen Post in den neuen Thread und füge einen Link zu diesem Beitrag mit ein...
Sonst wird das Ganze für andere Suchende zu Unübersichtlich
Gruß Dieter
Eröffne bitte einen neuen Thread (Beitrag) und kopiere Deinen letzen Post in den neuen Thread und füge einen Link zu diesem Beitrag mit ein...
Sonst wird das Ganze für andere Suchende zu Unübersichtlich
Gruß Dieter