Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Datei nach Kriterien auf Dateien splitte

Forumthread: Datei nach Kriterien auf Dateien splitte

Datei nach Kriterien auf Dateien splitte
28.12.2022 15:53:09
Tom
Hallo zusammen,
um bei meinem immer noch existierenden Problem weiterzukommen bin ich auf die userformgestützte Lösung von Franz https://www.herber.de/forum/archiv/1324to1328/1325041_ExcelDatei_nach_Kriterien_auf_Dateien_aufspitten.html#1325100 gestossen, die bei mir grds. passen würde.
Weiß jemand. wie das Makro anzupassen wäre, wenn nach 2 Kriterien gesplittet würde, z. B. zusätzlich zu Spalte D noch Spalte E?
Viele Grüße
Tom
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: hierzu ...
28.12.2022 16:03:45
neopa
Hallo Tom,
... Du schreibst "VBA nein" und möchtest trotzdem eine VBA-Lösung? Ich beschäftige mich mit VBA nicht. Aber mit den Power Query Funktionalitäten Deiner Excel-Version, könnte das, was Du anstrebst möglicherweise auch einfach(er) realisiert werden. Stelle doch mal (D)eine (Beispiel)datei (mit Dummy-Daten) hier ein und erkläre daran, was Du als Ergebnis erreichen möchtest. Dann kann Dir sicherlich schneller geholfen werden.
Gruß Werner
.. , - ...
Anzeige
AW: hierzu ...
28.12.2022 16:38:05
Tom
Hallo Werner,
ich hatte meine Tabellen entsprechend umgebaut und das VBA Ergebnis lieferte (bis aus das 2. Kriterium) passende Ergebnisse., aber VBA ist natürlich nicht zwingend, im Gegenteil. Meine Ursprungsmusterdatei sieht wie folgt aus: https://www.herber.de/bbs/user/156984.xlsx. Im Grunde genommen möchte ich nun für jeden Bereich in Spalte A eine einzelne Datei, mit der gleichen Struktur wie die Originaldatei (also mit 4 Arbeitsblättern) die so heisst wie der jeweilige Bereich in Spalte A, also "1", "2" etc. Also quasi so, als würde man die Originaldatei anhand von Spalte A jeweils filtern und neu abspeichern. Das Ergebnis am Bsp. Bereich 1 sollte dann so aussehen: https://www.herber.de/bbs/user/156985.xlsx.
Viele Grüße
Tom
Anzeige
AW: wieder als offen gekennzeichnet, weil ...
28.12.2022 17:15:56
neopa
Hallo Tom,
... da ein Power Query (PQ)- oder ein VBA-Profi das sicher effektiver realisieren kann. Wobei Deinerseits auch noch zu klären wäre, wieso in der Beispieldatei ...84.xlsx in den 4 Tabellenblättern teils unterschiedliche Bereichsangaben stehen.
Wenn es nur drei Bereiche sind, die in drei Dateien zu splitten sind, dann könnte ich Dir es zwar mit meinem noch begrenzten PQ- Kenntnissen (m)eine Lösung aufzeigen, aber die ist so noch nicht effektiv. Allerdings vermute ich, dass im Original mehr als nur für 3 Bereiche zu splitten sind, oder?
Gruß Werner
.. , - ...
Anzeige
AW: wieder als offen gekennzeichnet, weil ...
28.12.2022 17:28:49
Tom
Hallo Werner,
ja, so ist es. Die richtige Datei ist wesentlich umfangreicher und enthält eine Vielzahl an Mitarbeitern und Bereichen und das ja auch immer für 2 Jahre. Der bisherige manuelle Aufwand war groß, insofern hatte ich auch nur VBA als Lösung gesehen. Vielleicht hat ja noch jemand eine Idee, wie gesagt, die VBA Lösung von Franz passt ganz gut, bis auf das Jahr als 2. Kriterium, dann könnte nach Bereich & Jahr gesplittet werden.
Viele Grüße
Tom
Anzeige
AW: thread erneut als offen gekennzeichnet owT
28.12.2022 17:32:00
neopa
Gruß Werner
.. , - ..
AW: thread erneut als offen gekennzeichnet owT
29.12.2022 11:30:32
Tom
Hallo zusammen,
ich habe hier im Forum ein weiteres Makro gefunden, was nun fast die gewünschten Ergebnisse liefert. Hier meine Beispieldatei https://www.herber.de/bbs/user/156995.xlsm. Bei folgendem bin ich bisher nicht weiter gekommen, vielleicht weiß jemand, wie das Makro anzupassen wäre:
- Das letzte 4. Arbeitsblatt "Sonst. 2022" habe ich eingefügt, es werden aber nur 3 getrennt
- Die Kriteriumsspalte sollte A statt D sein
Viele Grüße Tom
Das Makro sieht so aus:
Option Explicit

Sub Trennen()
Dim aktSplitKrit As String
Dim anfZeile As Long
Dim datName As String
Dim endZeile As Long
Dim i As Long
Dim letzteZeile As Long
Dim pfad As String
Dim sinw As Long
Dim sortBereich As Range
Dim wb As Workbook     ' Neu erzeugte Mappe
Dim wbM As Workbook    ' Master
Dim ws As Worksheet
Dim wsFX As Worksheet  ' Blatt "FX" vom Master
Dim wsM As Worksheet   ' Blatt vom Master
Dim zeile As Long
'  Application.ScreenUpdating = False
sinw = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 3
Set wbM = ThisWorkbook
pfad = wbM.Path & "\"
Set wsFX = wbM.Worksheets("Beschäft. 2021")
letzteZeile = wsFX.Cells(wsFX.Rows.Count, "A").End(xlUp).Row
If letzteZeile  aktSplitKrit Then
' Wechsel des SplitKriteriumn
endZeile = zeile - 1
Set wb = Workbooks.Add
For i = 1 To 3
Set ws = wb.Worksheets(i)
Set wsM = wbM.Worksheets(i)
ws.Name = wsM.Name
wsM.Rows("1:3").Copy Destination:=ws.Rows("1:3")
wsM.Range(wsM.Rows(anfZeile), _
wsM.Rows(endZeile)).Copy Destination:=ws.Range("A4")
ws.Columns.AutoFit
Next i
datName = aktSplitKrit & ".xlsx"
Application.StatusBar = datName
On Error Resume Next
Workbooks(datName).Close SaveChanges:=False
On Error GoTo 0
Application.DisplayAlerts = False
wb.SaveAs Filename:=pfad & datName
Application.DisplayAlerts = True
wb.Close
anfZeile = endZeile + 1
If Not IsEmpty(wsFX.Cells(anfZeile, "D")) Then
aktSplitKrit = wsFX.Cells(anfZeile, "D")
Else
Exit For
End If
End If
Next zeile
Application.SheetsInNewWorkbook = sinw
Application.ScreenUpdating = True
Application.StatusBar = Empty
End Sub

Anzeige
Nachgefragt...
29.12.2022 11:56:28
Yal
Hallo Tom,
der einzige vernüftige Grund, warum man Daten teilen sollte, ist, wenn die Empfänger die anderen Daten nicht sehen dürfen. Es scheint bei Dir der Fall zu sein. Ansonsten ist es immer vernünftiger, alle Daten zusammenzuhalten und durch Filter an die gewünschten Daten zu kommen. In deinem Fall wäre es zum Beispiel besser alle Daten auf einem Blatt anstatt auf 4, weil diese genau dieselbe Struktur haben.
Filter: die von Dir verlinkte Lösung macht tatsächlich nur einen Filter auf die Daten, die "den Empfänger nicht sehen dürfte". Was eigentlich ziemlich kurzsichtig ist, weil jeder diesen Filter umstellen kann und somit alle Daten sehen kann. Falls es so gewünscht wäre, würde ich in der originale Datei einen Filter einrichten, aber die Filterung den Empfänger überlassen. Der Aufwand einer Makro (die man in aller Ewigkeit aufrecht und aktuell alten muss) ist damit nicht zu rechtfertigen.
Ich kann auch im Code deines Fundus (dein erstes Posting) nicht erkennen, dass es auf irgendeine Art und Weise Dir näher zu einer Lösung bringt.
Im Prinzip würde die Lösung so aussehen:
_ Liste der eindeutige "Kriterien" über alle Blätter aufsammeln
_ pro gesammelte Eintrag eine Kopie der orignalen Excel mit entsprechenden Namen speichern
_ in dieser Kopie alle Einträge löschen, die den Kriterien nicht erfüllen
es sieht dann so aus: (wo die Kriterien zuerst gelesen und dann geprüft werden, wirst Du selber erkennen können)

Sub Kopie_pro_Kriterien_speichern()
Dim Kriterien_Liste As Object
Dim wbKopie As Workbook
Dim ws As Worksheet
Dim Dateiname As String
Dim R As Long ' R wie Row
Dim Krit ' Krit wie Eintrag
Set Kriterien_Liste = CreateObject("Scripting.Dictionary")
'Liste der eindeutige Einträge sammeln
For Each ws In ThisWorkbook.Sheets
For R = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
Kriterien_Liste(ws.Cells(R, "A").Value & "_" & ws.Cells(R, "D").Value) = 1
Next
Next
'für jede Eintrag der Liste
For Each Krit In Kriterien_Liste.Keys
'eine Kopie der Datei erzeugen
Dateiname = Replace(ThisWorkbook.FullName, ".xlsx", "_" & Krit & ".xlsx")
ThisWorkbook.SaveCopyAs Dateiname
Set wbKopie = Workbooks.Open(Dateiname) 'Kopie öffnen
For Each ws In wbKopie.Worksheets
For R = ws.Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1  'beim Löschen immer von unten nach oben
If ws.Cells(R, "A").Value & "_" & ws.Cells(R, "D").Value  Krit Then ws.Rows(R).Delete 'nicht passenden Eintrage löschen
Next
Next
wbKopie.Save
wbKopie.Close
Next
Set Kriterien_Liste = Nothing
End Sub
(ungetestet. Löschen findet nur auf die Kopie statt)
Dein Zwischenpost (11:30): Dieses Coding scheint sehr an einem momentane Zustand deines Bedarf gebunden: funktioniert heute, aber morgen sind es 5 Blätter=Problem.
Wenn Du den Code liest und diese in deutsche Sprache spricht (laut ist sogar besser, weil man sich selbst zuhören muss), dann kannst Du schon evaluieren, ob ein Coding passt oder nicht.
Wenn Du VBA ansetzst, kommst Du nicht darum, Dich damit zu beschäftigen. Willkommen im Club der Programmierer.
VG
Yal
Anzeige
AW: Nachgefragt...
29.12.2022 18:49:14
Tom
Hallo Yal,
habe mich gerade noch einmal damit befasst, du hast Recht, meine Idee funktioniert nicht wie gedacht. Dein Ansatz scheint da tatsächlich vielversprechender zu sein. Habe dein Makro mal laufen lassen, es stoppt bei "ThisWorkbook.SaveCopyAs Dateiname" mit Laufzeitfehler '1004'. Excel kann scheinbar auf die Datei nicht zugreifen, weil sie verwendet wird. Wird vielleicht die Kopie des Dateinamens nicht richtig erstellt?
Viele Grüße
Tom
Anzeige
Dumme Fehler meinerseits
02.01.2023 22:08:25
Yal
Hallo Tom,
es handelt sich nicht um eine "xlsx" sondern "xlsm". Daher klappt der "Replace" nicht, und der Name bleibtunverändert. Es wird dann versucht, eine Kopie mit dem Namen der orignalen Datei zu speichern. Was natürlich nicht akzeptiert wird.
Es muss gekürzt werden, sodass es mit xlsx, xlsm oder sonstige xls* funktioniert.

        Dateiname = Replace(ThisWorkbook.FullName, ".xls", "_" & Krit & ".xls")
VG
Yal
Anzeige
AW: Dumme Fehler meinerseits
03.01.2023 10:08:52
Tom
Hallo Yal,
sieht gut aus, das Makro funktioniert, vielen Dank für deine tolle Lösung. Ich habe es etwas angepasst, Kriterium sollte nur Spalte A sein. Folgende Anpassungen sind mir bisher nicht gelungen, da würde ich mich freuen, wenn du mir noch etwas support geben könntest:
-Die Mappen sollen nur unter dem Namen des Kriteriums, also Bereich aus Spalte A abgespeichert werden (z. B. "1"), da sie an die Bereiche versendet werden.
Ist das als xlsx Datei möglich?
-Wie müsste das Makro geändert werden, wenn in der Originaldatei 1 oder 2 weitere Arbeitsblätter dazu kommen, die bei dem Splitten berücksichtigt werden müssten?
Viele Grüße
Tom
Anzeige
AW: Dumme Fehler meinerseits
05.01.2023 00:34:29
Yal
Hallo Tom,
-Die Mappen sollen nur unter dem Namen des Kriteriums, also Bereich aus Spalte A abgespeichert werden (z. B. "1"), da sie an die Bereiche versendet werden.
Ist das als xlsx Datei möglich?
-> Es geht. Es muss nur weniger Differenzierung in den Kriterien vorgenommen werden.
Anstatt:

  'Liste der eindeutige Einträge sammeln
For Each ws In ThisWorkbook.Sheets
For R = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
Kriterien_Liste(ws.Cells(R, "A").Value & "_" & ws.Cells(R, "D").Value) = 1
Next
Next
Dann

  'Liste der eindeutige Einträge sammeln
For Each ws In ThisWorkbook.Sheets
For R = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
Kriterien_Liste(ws.Cells(R, "A").Value) = 1
Next
Next
Und genau dasselbe bei der Prüfung der Kriterien pro Zeile:

          For Each ws In wbKopie.Worksheets
For R = ws.Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1  'beim Löschen immer von unten nach oben
If ws.Cells(R, "A").Value  Krit Then ws.Rows(R).Delete 'nicht passenden Eintrage löschen
Next
Next
-Wie müsste das Makro geändert werden, wenn in der Originaldatei 1 oder 2 weitere Arbeitsblätter dazu kommen, die bei dem Splitten berücksichtigt werden müssten?
-> nichts. Das Makro berücksichtigt alles vorhandene Blätter, egal wieviel es sind. Die Blätter müssen nur dieselbe Struktur, also ähnliche Spalte A und D (aber jetzt nur noch D) haben.
VG
Yal
Anzeige
AW: Dumme Fehler meinerseits
05.01.2023 09:49:36
Tom
Hallo Yal,
danke dir, habe die Änderungen eingegeben, die Dateien werden aber immer noch als xlsm Arbeitsmappen mit den Makros statt als xlsx Datei angelegt. Könntest du da noch mal schauen? Muss noch was geändert werden?
Dass automatisch alle Arbeitsblätter berücksichtigt werden ist übrigens super, dann muss das Makro nicht immer bei jeder Änderung angepasst werden.
Viele Grüße
Tom
Anzeige
AW: Dumme Fehler meinerseits
05.01.2023 12:07:12
Yal
Hallo Tom,
für eine Speicherung als xlsx, also ohne Makro, müsste man SaveAs anstatt SaveCopyAs, was dazu führen würde, das nicht einen separaten Datei gespeichert wäre, sondern diese Datei selbst. Was dazu wiederum führen würde, dass die original Version der Datei nochmal geöffnet werden müsste.
Am besten ist es, wenn das Makro in einem dritte, unbeteiligte Datei abgelagert ist. Dann ist die Quelldatei nicht mehr "ThisWorkbook" sondern Workbooks("xy"), ein Workbook ohne Makro. Kleinigkeiten, die Kleinigkeiten nach sich ziehen.
Stelle eine neue Frage, übergebe den bisherigen Stand, und erkläre, was noch gebraucht wird. Diese Threads kommt an seiner Zeitgrenze und man kann nicht mehr Antworten dazu schreiben. Außerdem ist es ja eine neue Frage.
VG
Yal
Anzeige
ich bin dazu gekommen...
05.01.2023 15:21:23
Yal
Hallo Tom,
anbei das angepasste Coding, das in einer separaten xlsm-Datei abgelegt werden soll.
Datei "Vorlage.xlsx" muss noch in dem Namen von deiner xlsm als xlsx gespeicherte Datei angepasst werden. Zur Behanndlung muss diese "Vorlage.xslx" geöffnet sein.

Sub Kopie_pro_Kriterien_speichern()
Dim Kriterien_Liste As Object
Dim wbQuelle As Workbook
Dim wbKopie As Workbook
Dim ws As Worksheet
Dim Dateiname As String
Dim R As Long ' R wie Row
Dim Krit ' Krit wie Eintrag
Set Kriterien_Liste = CreateObject("Scripting.Dictionary")
'Liste der eindeutige Einträge sammeln
Set wbQuelle = Workbooks("Vorlage.xlsx")
For Each ws In wbQuelle.Sheets
For R = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
Kriterien_Liste(ws.Cells(R, "A").Value) = 1
Next
Next
'für jede Eintrag der Liste
For Each Krit In Kriterien_Liste.Keys
'eine Kopie der Datei erzeugen
Dateiname = Replace(wbQuelle.FullName, ".xlsx", "_" & Krit & ".xlsx")
wbQuelle.SaveCopyAs Dateiname
Set wbKopie = Workbooks.Open(Dateiname) 'Kopie öffnen
For Each ws In wbKopie.Worksheets
For R = ws.Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1  'beim Löschen immer von unten nach oben
If ws.Cells(R, "A").Value  Krit Then ws.Rows(R).Delete 'nicht passenden Eintrage löschen
Next
Next
wbKopie.Save
wbKopie.Close
Next
Set Kriterien_Liste = Nothing
End Sub
VG
Yal
Anzeige
AW: ich bin dazu gekommen...
05.01.2023 17:10:41
Tom
Hallo Yal,
habe es gerade so wie von dir geschrieben geändert, es wird genau das gewünschte Ergebnis geliefert, toll. Dadurch bleibt mir künftig viel unnötige Arbeit und manuelles Tun mit entsprechenden Fehlerquellen erspart.
Nochmals 1.000 Dank für deine Hilfe.
Viele Grüße
Tom
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige