Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1208to1212
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

Datei splitten

Datei splitten
Bodo
Hallo zusammen,
Ich würde gern Eure Hilfe in Anspruch nehmen, um folgende Aufgabe zu lösen:
Eine XLS-Datei mit einer beliebigen Anzahl Zeilen soll in mehrere kleine XLS-Dateien gesplittet werden. Die Quelldatei hat einen n-zeiligen Titelbereich (Zeile 1..n), der auch in jede der Split-Dateien übernommen werden soll. Der Datenbereich beginnt ab Zeile n+1. Jede Split-Datei (außer der letzten) soll die gleiche Anzahl i an Datenzeilen enthalten. Die letzte Split-Datei hat dann j Datenzeilen mit 0 kleiner j kleinergleich i. Die Split-Dateien sollen den Namen der Quelldatei bekommen, gefolgt von "-x". x soll das Format "##0" haben. Die Split-Datei *-001.xls soll die Daten der Zeilen n+1 bis n+i+1 aus der Quelldatei enthalten, usw. Es besteht natürlich auch die Möglichkeit, dass nur 1 Split-Datei entsteht.
Bsp.:
Die Quelldateidatei ABC.xls hat einen 4zeiligen Titelbereich und enthält insgesamt 362 Zeilen. Es sollen immer 30 Datenzeilen in eine neue Datei geschrieben werden.
Im Ergebnis müssten dann 12 Split-Dateien entstehen mit Namen von ABC-001.xls bis ABC-012.xls. Die letzte Split-Datei hätte dann 28 Datenzeilen.
Grüße - Bodo

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Datei splitten
14.04.2011 12:37:18
Rudi
Hallo,
komplizierte Erklärung für eine einfache Sache ;-)
Sub SplitMe()
Dim lngC As Long, lngR As Long, lngT, lngZ, iCounter
Dim wkbNeu As Workbook, wksQ As Worksheet
Dim sPath As String, sName As String
lngT = Application.InputBox("Anzahl Titelzeilen?", "Eingabe")
If lngT = 0 Or lngT = False Then Exit Sub
lngZ = Application.InputBox("Anzahl Zeilen in neuer Datei?", "Eingabe")
If lngZ = 0 Or lngZ = False Then Exit Sub
Application.ScreenUpdating = False
Set wksQ = ActiveSheet
sPath = ThisWorkbook.Path & "\"
sName = ThisWorkbook.Name
sName = Left(sName, Len(sName) - 4)
lngC = Cells(1, 1).CurrentRegion.Columns.Count
For lngR = lngT + 1 To Cells(1, 1).CurrentRegion.Rows.Count Step lngZ
Set wkbNeu = Workbooks.Add(1)
iCounter = iCounter + 1
wksQ.Cells(1, 1).Resize(lngT, lngC).Copy wkbNeu.Sheets(1).Cells(1, 1)
wksQ.Cells(lngR, 1).Resize(lngZ, lngC).Copy wkbNeu.Sheets(1).Cells(lngT + 1, 1)
wkbNeu.SaveAs sPath & sName & Format(iCounter, "-0000") & ".xls"
wkbNeu.Close
Next
MsgBox "Job erledigt.", , "Gebe bekannt ..."
End Sub

Gruß
Rudi
Anzeige
AW: Datei splitten
14.04.2011 14:29:36
Bodo
Hallo Rudi,
erst mal vielen Dank.
Habe Deinen Code noch etwas abgeändert, denn im Titelbereich befinden sich leere Zellen, sowohl in Zeile 1 als auch in Spalte A. Ich nehme an, dass deshalb die beiden Funktionen
Cells(1, 1).CurrentRegion.Columns.Count
Cells(1, 1).CurrentRegion.Rows.Count
der Sache nicht dienliche Werte liefern. Habe dafür mal Konstanten eingesetzt und schon wurden die Split-Dateien so hergestellt, wie ich sie wollte. Gut, der Index ist 4stellig, was soll's!
Grüße - Bodo
AW: Datei splitten
14.04.2011 13:25:56
fcs
Hallo Bodo,
hier mein Vorschlag.
Aus dem aktiven Blatt wird eine Musterdatei erstellt, in die dann jeweils 30 Zeilen kopiert werden.
Dabei bleiben dann auch alle Spaltenbreiten und anderen Formatierungen (unter Seite einrichten) des Tabellenblatts erhalten.
Gruß
Franz
'##############################################################
'# Windows Vista  -       Excel 2007    -        VBA 6.5.1053 #
'# Modul: Allgemeines Modul                                   #
'# Makro sollte auch unter Excel 2003 lauffähig sein          #
Option Explicit
Sub Splitten_Tabelleninhalt()
'Inhalt des Tabellenblatts auf mehrere Dateien verteilen _
Dabei Musterdatei erstellen und gewünschte Inhalte kopieren
Dim wbQuelle As Workbook, wbZiel As Workbook, wbMuster As Workbook
Dim wksQuelle As Worksheet, wksZiel As Worksheet, wksMuster As Worksheet
Dim ZeileQuelle As Long, ZeileLetzte As Long, iCount As Long
Dim AnzTitel As Long, AnzZeilen As Long
Dim sPath As String, sDatei As String
AnzTitel = 4 'Anzahl der Titelzeilen     - ### ggf. anpassen
AnzZeilen = 30 'Anzahl der Zeilen, die jedesmal kopiert werden sollen - ### ggf. anpassen
'Sicherheitsabfrage
If MsgBox("Daten des aktiven Tabellenblatts in Dateien mit jeweils " _
& AnzZeilen & " Zeilen splitten?", vbQuestion + vbYesNo, _
"Tabellenblattdaten splitten") = vbNo Then Exit Sub
'Quellmappe und Tabellenblatt setzen
Set wbQuelle = ActiveWorkbook
Set wksQuelle = ActiveSheet
'Ziel-Verzeichnis für die erstellten gesplitteten Dateien
sPath = wbQuelle.Path & Application.PathSeparator      ' ### ggf. anpassen
'Name der Quelldatei ohne Dateinamenserweiterung
With wbQuelle
sDatei = Left(.Name, InStrRev(.Name, ".") - 1)
End With
'Anwendungseinstellungen für schnellere Makroausführung
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
With wksQuelle
'Letzte Daten-Zeile im Quelltabellenblatt
ZeileLetzte = .UsedRange.Row + .UsedRange.Rows.Count - 1
'Quelltabelle in neue Arbeitsmappe kopieren
.Copy
End With
'Musterdatei/-tabelle erstellen
Set wbMuster = ActiveWorkbook
Set wksMuster = wbMuster.Worksheets(1)
With wksMuster
'nicht benötigte Zeilen löschen
.Range(.Rows(AnzTitel + AnzZeilen + 1), .Rows(ZeileLetzte)).Delete
'Inhalte unterhalb Titelzeilen löschen
.Range(.Rows(AnzTitel + 1), .Rows(AnzTitel + AnzZeilen)).ClearContents
End With
iCount = 1 'Startwert für Zähler der Zieldateien
'Zeilen in Quellblatt abarbeiten
For ZeileQuelle = AnzTitel + 1 To ZeileLetzte Step AnzZeilen
'Anzeige für Statuszeile während Erstellung der Splittdateien
Application.StatusBar = "Splittdatei " & Format(iCount, "000") & " von " _
& Format(Application.WorksheetFunction.RoundUp((ZeileLetzte - AnzTitel) _
/ AnzZeilen, 0), "000") & " wird erstellt"
If ZeileQuelle + AnzZeilen >= ZeileLetzte Then
'letzte Splittdatei erstellen - Muster verwenden
Set wbZiel = wbMuster
Set wksZiel = wksMuster
'restliche Quelldatenzeilen kopieren
With wksQuelle
.Range(.Rows(ZeileQuelle), .Rows(ZeileLetzte)).Copy _
Destination:=wksZiel.Cells(AnzTitel + 1, 1)
End With
Else
'nächste Splittdatei erstellen - Muster kopieren
wksMuster.Copy
Set wbZiel = ActiveWorkbook
Set wksZiel = wbZiel.Worksheets(1)
'nächste Quelldatenzeilen kopieren
With wksQuelle
.Range(.Rows(ZeileQuelle), .Rows(ZeileQuelle + AnzZeilen - 1)).Copy _
Destination:=wksZiel.Cells(AnzTitel + 1, 1)
End With
End If
With wbZiel
'Zieldatei speichern
If Val(Left(Application.Version, 2)) >= 12 Then
'Excel-Version 2007 und neuer
'Prüfen der Dateinamenserweiterung der Quelldatei
If LCase(Right(wbQuelle.Name, 3)) = "xls" Then
'als Excelformat 97 bis 2003 (.xls)
.SaveAs FileName:=sPath & sDatei & Format(iCount, "-000"), _
FileFormat:=56 'xlExcel8
Else
'als Excel 2007 Arbeitsmappe ohne Makros (.xlsx)
.SaveAs FileName:=sPath & sDatei & Format(iCount, "-000"), _
FileFormat:=51 'xlOpenXMLWorkbook
End If
Else
'Excel-Version 2003 und älter
.SaveAs FileName:=sPath & sDatei & Format(iCount, "-000")
End If
'Zieldatei schliessen
.Close savechanges:=False
End With
iCount = iCount + 1
Next
'Anwendungseinstellungen zurücksetzen
With Application
.EnableEvents = True
.ScreenUpdating = True
.StatusBar = False
End With
'Abschlussmeldung
MsgBox "Datei: " & wbQuelle.Name & vbLf _
& "Blatt: " & wksQuelle.Name & vbLf _
& "wurde in " & iCount - 1 & " Dateien gesplittet.", _
vbInformation + vbOKOnly, "Tabellenblattdaten splitten"
End Sub

Anzeige
AW: Datei splitten
14.04.2011 14:47:02
Bodo
Hallo Franz,
mein Daumen zeigt nach oben!
Ich brauchte Deinen Code nicht anpassen. Der brachte auf Anhieb das gewünschte Ergebnis!
Vielen Dank und Grüße - Bodo

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige