Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1852to1856
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

Liste Aufteilen

Liste Aufteilen
29.10.2021 13:13:05
tech
Hallo,
ich habe folgendes Problem.
Ich möchte eine große Excel Liste auf mehrere Arbeitsblätter aufteilen. Dazu habe ich ein Makro gefunden das sehr gut funktioniert. Leider habe ich in Spalte A verbundene Zellen. Wenn ich nun das Makro ausführe wird beim Aufteilen die letzte verbundene Zelle pro Teilung aufgeteilt. Schön wäre, wenn vor dem Teilen geprüft wird ob die letzte Zeile eine verbundene Zelle ist. Wenn ja erst nach der verbundenen Zelle Teilen.

Sub Liste_aufteilen()
Dim WorkRng As Range
Dim xRow As Range
Dim SplitRow As Integer
Dim xWs As Worksheet
Dim xTRg As Range
Dim xNTRg As Range
Dim xIER As Integer
On Error Resume Next
xTitleId = "Liste_Aufteilen"
Set WorkRng = Application.Selection
If TypeName(WorkRng) = "Nothing" Then Exit Sub
Set xTRg = Application.InputBox("Please select the header row:", xTitleId, "", Type:=8)
Set WorkRng = Application.InputBox("Please select the data range(exclude the header row):", xTitleId, WorkRng.Address, Type:=8)
If TypeName(xTRg) = "Nothing" Then Exit Sub
SplitRow = Application.InputBox("Split Row Num", xTitleId, Type:=1)
If SplitRow = 0 Then Exit Sub
Set xWs = WorkRng.Parent
Set xRow = WorkRng.Rows(1)
xIER = WorkRng.Rows(WorkRng.Rows.Count).Row
Application.ScreenUpdating = False
For i = 1 To WorkRng.Rows.Count Step SplitRow
resizeCount = SplitRow
If (xIER - xRow.Row + 1)  (xRow.Row + SplitRow - 1) Then
xWs.Name = xRow.Row & " - " & (xRow.Row + SplitRow - 1)
ElseIf xIER = xRow.Row Then
xWs.Name = xRow.Row
Else
xWs.Name = xRow.Row & " - " & xIER
End If
Application.ActiveSheet.Range("A1").PasteSpecial
Application.ActiveSheet.Range("A1").PasteSpecial Paste:=8
Set xNTRg = Application.ActiveSheet.Range("A1")
xTRg.Copy
xNTRg.Insert
Set xRow = xRow.Offset(SplitRow)
Next
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Liste Aufteilen
29.10.2021 15:42:18
Yal
Hallo tech,
Alternative wäre, das ganze Blatt zu kopieren und die Zeilen zu löschen, die man nicht braucht.
Dann brauchst Du dich nicht um diesen verbundenen Zellen zu kümmern
_ origWS
_ Kopie 2-102 : 1 ist header. Alles über 102 löschen.
_ Kopie 103-202 : 1 ist header. Alles über 202 löschen, 2-102 löschen .
_ Kopie 203-302 : >302 und 2-202 löschen.
_ usw
VG
Yal
AW: Liste Aufteilen
29.10.2021 16:03:11
tech
Hallo Yal,
Danke für deine Antwort. Ja das wäre eine Lösung jedoch keine Zeitersparnis. Die Listen die ich zu bearbeiten habe, haben mehr als 1000 Zeilen und 350 Spalten.
Ich möchte die Liste aufteilen da ich sie weiter bearbeiten muss.
Das ist eine extrem verkürzte Liste
https://www.herber.de/bbs/user/148861.xlsm
Anzeige
Zeitersparnis
29.10.2021 20:03:05
Yal
Hallo tech,
Sorry, aber ich kann zwischen den gegebenen Code und die Tabelle keine nachvollziehbare Logik entdecken.
Es wird gefragt, wie hoch die Blöcke sind (Anzahl Zeilen), die ausseinander zu trennen sind. Es ist eine Information, die für das Verständnis wesentlich ist.
Ist ein Block was wir zwischen Zeile 6 und 98 sehen (also 93 Zeilen) ?
Dann wären die Zeile 1-5 der Header, richtig (5 Zeilen)?
Ich weiss auch nicht, welche Zeitersparnis Du meinst. Ein Coding zu flicken, dass man nicht nachvollziehen kann, ist spätestens nach der Korrektur vom Korrektur vom Korrektur von "ach so, jetzt habe ich verstanden" jegliche "Zeitersparnis" ad acta.
Das "alles kopieren und putzen"- Methode sieht so aus (ca. 20 Min):

Sub Liste_aufteilen()
Dim WS As Worksheet
Dim i
Const Header = 5
Const AnzZeile = 93
Application.ScreenUpdating = False
Application.EnableEvents = False
With ThisWorkbook.Worksheets("Tabelle1")
For i = header + 1 To .Range("A99999").End(xlUp).Row Step AnzZeile
' Blatt kopieren
.Copy After:=Sheets(.Parent.Worksheets.Count)
Set WS = .Parent.Worksheets(.Parent.Worksheets.Count)
' Name geben
WS.Name = "Z " & i & "-" & (i + AnzZeile - 1)
' Ende Löschen
WS.Rows((i + AnzZeile) & ":99999").Delete Shift:=xlUp
' Anfang löschen: zwischen Header und Bereich zu behalten (aber nicht bei ersten)
If i > AnzZeile Then WS.Rows(Header + 1 & ":" & (i - 1)).Delete Shift:=xlUp
Next
End With
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
(getestet auf eine Liste 1 bis 44 in Spalte A mit Header = 5 und AnzZeile = 12)
VG
Yal
Anzeige
AW: Zeitersparnis
29.10.2021 20:16:03
tech
Danke für deine Antwort,
ich werde den Code gleich mal testen.
Ja Header sind die oberen Zeilen gefolg vom Datenblock.
Die Original Datei het einen Datenblock von ca. 1000 Zeilen und etwa 350 Spalten.
Das Aufteilen auf mehrere Arbeitsblätter mit je ca. 45 Datenblock Zeilen hat folgenden Hintergrund.
In den ca. 350 Spalten steht pro Zeile nur ein paar Werte (zbsp. in Spalte 2,6,7,und 212) und in der nächsten Zeile (zbsp. in Spalte 2,6,145 und 232).
Durch das Aufteilen kann ich dann Spalten ohne Daten entfernen um die Spaltenanzahl zu verkleinern. Die Arbeitsblätter müssen ausgedruckt vorliegen und dabei brauche ich nur die Spalten die auch Daten enthalten.
Anzeige
AW: Liste Aufteilen
29.10.2021 15:42:55
Hajo_Zi
Zu Deiner Datei kann ich nichts schreiben, was wohl daran liegt das ich nicht auf fremde Rechner schaue. Ich baue keine Datei nach.
Sollte die Datei verlinkt werden?
Der Name einer hochgeladenen Mappe wird im Beitrag automatisch angezeigt, sodass es bei Verwendung von aussagekräftigen Namen leichter fällt, sie später im Ablageordner wiederzufinden und sie gedanklich einem bestimmten Thema zuzuordnen. Namen wie Muster*, Test*, Mappe*, Beispiel*, Fehler*, Kalender*, UserForm* usw. sind so allgemein, dass eine Zuordnung zu einem Thema unmöglich gemacht wird.
Bilder lade ich mir nicht runter, da Excel damit nichts anfangen kann.
Hochgeladene Bilder können zwar als solche in Excel importiert werden, sind jedoch bei der Lösung von Problemen nicht sehr hilfreich, da man die eigentlichen Daten nicht ohne große und zeitraubende Umwege direkt in die Tabelle übertragen kann.
http://www.excel-ist-sexy.de/bilder-statt-datei/
Es sollte ein aussagekräftiger Name sein.
Das ist nur meine Meinung zu dem Thema.
Wenn du an Stelle einer Demomappe deine Originalmappe hochladen willst, diese aber sensible Daten enthält, kannst du diese Daten
http://www.ms-office-forum.de/forum/showthread.php?t=322895
ändern.
Das ist nur meine Meinung zu dem Thema.
GrußformelHomepage
In diesem Forum bekomme nur selten eine Mailbenachrichtigung, weitere Antworten sind zufällig.
Anzeige
AW: Liste Aufteilen
29.10.2021 20:03:12
tech
Hallo zusammen,
Ich möchte eine Liste mit Header und ca. 1000 Zeilen auf mehrere Arbeitsblätter aufteilen.
Jedes neue Arbeitsblatt soll den Header und ca. 40 bis 50 Zeilen enthalten. Mit dem angeführten Makro funktioniert es sehr gut jedoch beinhaltet die Liste verbundene Zellen die nicht getrennt werden sollen. Es sind jeweils mehrere Zellen verbunden gefolgt von einer leeren Zeile.
Hat jemand eine Lösung?
Du bist 7 Sek. zu spät! owT
29.10.2021 20:06:58
Yal
AW: Liste Aufteilen
29.10.2021 20:43:41
Daniel
HI
bau das mal nach diesem Schema um
statt festem For-Next läuft du hier mit einem DO-LOOP durch die Zeilen.
Dabei wird die End-Zeile des Bereichs angepasst, wenn die Letzte Zeile zu einem Zelllverbund gehört, so dass der ganze Zellverbund mit aufs Blatt kommt.
beim nächsten Umlauf wird dann auch von dieser Zeile aus der Bereich für das nächste Blatt berechnen.

Zeile1 = WorkRng.Row
with WorkRng.Worksheet
Do while Zeile1 

Gruß Daniel
Anzeige
AW: Liste Aufteilen
29.10.2021 20:52:14
tech
Hallo Daniel,
Danke für deine Antwort. Leider weiß ich nicht genau an welcher Stelle ich deinen Code einfügen muss.
Kannst du mir nochmal Helfen. DANKE
AW: Liste Aufteilen
29.10.2021 21:07:54
Daniel
naja anstelle der FOR-Schleife
das ist jetzt auch nicht komplizierter, als das was du schon programmiert hast, du solltest das also verstehen.
was die MergeArea ist, kannst du hin der hilfe nachlesen.
probiers erstmal, dich da reinzudenken, das Prinzip zu verstehen und dann selber die Programmierung anzupassen
Gruß Daniel
AW: Liste Aufteilen
29.10.2021 21:21:55
tech
Danke,
ich probiere es schon seit Tagen. Das mit MergeArea verstehe ich zum Teil. Ich stehe noch ganz am Anfang von VBA. Zurzeit probiere ich Code's aus die ich im Internet finde. Jedoch zu diesem Thema finde ich nicht sehr viel. Verbundene Zellen sind einfach misst. :)
Danke für deine Bemühungen.
Anzeige
AW: Liste Aufteilen
30.10.2021 09:32:57
tech

Sub Liste_aufteilen_3()
Dim WorkRng As Range
Dim xRow As Range
Dim SplitRow As Integer
Dim xWs As Worksheet
Dim xTRg As Range
Dim xNTRg As Range
Dim xIER As Integer
On Error Resume Next
xTitleId = "Liste_Aufteilen"
Set WorkRng = Application.Selection
If TypeName(WorkRng) = "Nothing" Then Exit Sub
Set xTRg = Application.InputBox("Please select the header row:", xTitleId, "", Type:=8)
Set WorkRng = Application.InputBox("Please select the data range(exclude the header row):", xTitleId, WorkRng.Address, Type:=8)
If TypeName(xTRg) = "Nothing" Then Exit Sub
SplitRow = Application.InputBox("Split Row Num", xTitleId, Type:=1)
If SplitRow = 0 Then Exit Sub
Set xWs = WorkRng.Parent
Set xRow = WorkRng.Rows(1)
xIER = WorkRng.Rows(WorkRng.Rows.Count).Row
Application.ScreenUpdating = False
Zeile1 = WorkRng.Row
With WorkRng.Worksheet
Do While Zeile1 
DANKE Daniel, du hast mir sehr geholfen.
Ich muss nur noch hinkriegen dass auch noch die Zeilenhöhe mit übernommen wird.
Anzeige
AW: Liste Aufteilen
30.10.2021 14:09:21
ralf_b
Hallo techw,
so wie ich den Thread bisher verstanden habe, teilst du die Datei nur auf weil so viele leere Spalten da sind.
Würde es nicht schon reichen nur die Spalten auszublenden, in deren Wertebereich keine Zahlen vorhanden sind?
Ich hatte vor längerer Zeit auch mal eine sehr breite Tabelle vor der Nase und das temporäre Ausblenden hatte
mir dabei geholfen kompakte Übersichten zu erstellen.
Realisiert wurde das mit einer Summenformel. Die Spalte wurde ausgeblendet wenn das Ergebnis der Spaltenwerte = 0 ist.
gruß
rb
AW: Liste Aufteilen
30.10.2021 14:42:47
tech
Hallo ralf_b,
ja das hast du richtig verstanden. Nur ist es so dass die Werte in den Spalten so aufgeteilt sind das keine leeren Spalten sich in der gesamten Liste ergäben.
Erst durch das Aufteilen auf mehrere Arbeitsblätter mit je 45 Zeilen ergäben sich auch leere Spalten die ich dann ausblenden kann. Somit erhalte ich Arbeitsblätter mit nur noch 30 Spalten die gefüllt sind. Die Beispieldatei von mir ist sehr stark reduziert. Die Original Datei hat um die 1000 Zeilen und 350 Spalten.
Da ich die Liste in Papierform und nur mit den nötigsten Daten brauche habe ich mich für diesen Weg entschieden.
Grüße
tech
Anzeige
AW: Liste Aufteilen
30.10.2021 17:54:37
tech

Sub Liste_aufteilen_4()
Dim WorkRng As Range
Dim xRow As Range
Dim SplitRow As Integer
Dim xWs As Worksheet
Dim xTRg As Range
Dim xNTRg As Range
Dim xIER As Integer
On Error Resume Next
xTitleId = "Liste_Aufteilen"
Set WorkRng = Application.Selection
If TypeName(WorkRng) = "Nothing" Then Exit Sub
Set xTRg = Application.InputBox("Please select the header row:", xTitleId, "", Type:=8)
Set WorkRng = Application.InputBox("Please select the data range(exclude the header row):", xTitleId, WorkRng.Address, Type:=8)
If TypeName(xTRg) = "Nothing" Then Exit Sub
SplitRow = Application.InputBox("Split Row Num", xTitleId, Type:=1)
If SplitRow = 0 Then Exit Sub
Set xWs = WorkRng.Parent
Set xRow = WorkRng.Rows(1)
xIER = WorkRng.Rows(WorkRng.Rows.Count).Row
Application.ScreenUpdating = False
Range("A1").Select
zanzahl = InputBox("Für wie viele Zeilen soll die jeweilige Höhe gemerkt werden?")
ReDim dummy(zanzahl) As Double
For i = 1 To zanzahl
dummy(i) = ActiveCell.Rows("1:1").EntireRow.RowHeight
ActiveCell.Offset(1, 0).Select
Next i
Zeile1 = WorkRng.Row
With WorkRng.Worksheet
Do While Zeile1  (xRow.Row + SplitRow - 1) Then
xWs.Name = xRow.Row & " - " & (xRow.Row + SplitRow - 1)
ElseIf xIER = xRow.Row Then
xWs.Name = xRow.Row
Else
xWs.Name = xRow.Row & " - " & xIER
End If
.Range(.Rows(Zeile1), .Rows(Zeile2)).Copy
Application.ActiveSheet.Range("A1").PasteSpecial
Application.ActiveSheet.Range("A1").PasteSpecial Paste:=8
Set xNTRg = Application.ActiveSheet.Range("A1")
xTRg.Copy
xNTRg.Insert
Set xRow = xRow.Offset(SplitRow)
Zeile1 = Zeile2 + 1
Range("A1").Select
For i = 1 To zanzahl
ActiveCell.Rows("1:1").EntireRow.RowHeight = dummy(i)
ActiveCell.Offset(1, 0).Select
Next i
Loop
End With
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
Endlich :) Ich hab's geschafft.
Anzeige
AW: Liste Aufteilen
31.10.2021 10:22:21
tech
Ein Problem habe ich noch. Ich möchte die neu erstellten Arbeitsblätter in einem Schritt noch weiter bearbeiten. Alle leeren Spalten sollen in einem bestimmten Bereich ausgeblendet werden. Wenn ich den Range Bereich vorgebe funktioniert das Super jedoch wenn ich einen Bereich über die InputBox vorgeben möchte funktioniert das nicht weil wahrscheinlich der Bereich nicht Global ist.
Ich habe schon viel ausprobiert doch leider bekomme ich es nicht hin.
Hat jemand eine Idee
https://www.herber.de/bbs/user/148874.xlsm
Public Anzahl As Range 'Funktioniert noch nicht

Sub Liste_aufteilen_MergeArea()
Dim WorkRng As Range
Dim xRow As Range
Dim SplitRow As Integer
Dim xWs As Worksheet
Dim xTRg As Range
Dim xNTRg As Range
Dim xIER As Integer
Dim Anzahl As Range
Dim a As Integer
On Error Resume Next
xTitleId2 = "Leere Spalten Verdecken"
'Set Anzahl = Application.InputBox("Please select", xTitleId2, "", Type:=8) 'Funktioniert noch nicht
xTitleId = "Liste_Aufteilen"
Set WorkRng = Application.Selection
If TypeName(WorkRng) = "Nothing" Then Exit Sub
Set xTRg = Application.InputBox("Please select the header row:", xTitleId, "", Type:=8)
Set WorkRng = Application.InputBox("Please select the data range(exclude the header row):", xTitleId, WorkRng.Address, Type:=8)
If TypeName(xTRg) = "Nothing" Then Exit Sub
SplitRow = Application.InputBox("Split Row Num", xTitleId, Type:=1)
If SplitRow = 0 Then Exit Sub
Set xWs = WorkRng.Parent
Set xRow = WorkRng.Rows(1)
xIER = WorkRng.Rows(WorkRng.Rows.Count).Row
Application.ScreenUpdating = False
Range("A1").Select
zanzahl = InputBox("Für wie viele Zeilen soll die jeweilige Höhe gemerkt werden?")
ReDim dummy(zanzahl) As Double
For i = 1 To zanzahl
dummy(i) = ActiveCell.Rows("1:1").EntireRow.RowHeight
ActiveCell.Offset(1, 0).Select
Next i
Zeile1 = WorkRng.Row
With WorkRng.Worksheet
Do While Zeile1 

AW: Liste Aufteilen
31.10.2021 11:21:35
Yal
Hallo Tech,
Alternative wäre, die sollten im Original ausblenden, für Kopie (n) zu erzeugen und dann in das Original die Spalten wieder sichtbar zu machen.
Es funktioniert leider nur, wenn man das ganze Blatt kopiert (und die Zeilen, die man nicht braucht, löscht), aber das hatten wir schon.
Ansonsten weißt Du mit der Variable xWks stets auf welchem Blatt Du gerade unterwegs bist. Damit musst Du was machen.
VG
Yal
AW: Liste Aufteilen
31.10.2021 11:39:30
tech
Danke für den Hinweis,
bin noch am herumprobieren
AW: Liste Aufteilen
01.11.2021 19:52:39
tech
Public rngZelle As Range

Sub Liste_aufteilen_MergeArea()
Dim WorkRng As Range
Dim xRow As Range
Dim SplitRow As Integer
Dim xWs As Worksheet
Dim xTRg As Range
Dim xNTRg As Range
Dim xIER As Integer
Dim Anzahl As Range
Dim A As Integer
On Error Resume Next
xTitleId2 = "Leere Spalten Verdecken"
Set rngZelle = Application.InputBox("Bitte Spalten auswählen die ausgeblendet werden sollen", Type:=8)
xTitleId = "Liste_Aufteilen"
Set WorkRng = Application.Selection
If TypeName(WorkRng) = "Nothing" Then Exit Sub
Set xTRg = Application.InputBox("Please select the header row:", xTitleId, "", Type:=8)
Set WorkRng = Application.InputBox("Please select the data range(exclude the header row):", xTitleId, WorkRng.Address, Type:=8)
If TypeName(xTRg) = "Nothing" Then Exit Sub
SplitRow = Application.InputBox("Split Row Num", xTitleId, Type:=1)
If SplitRow = 0 Then Exit Sub
Set xWs = WorkRng.Parent
Set xRow = WorkRng.Rows(1)
xIER = WorkRng.Rows(WorkRng.Rows.Count).Row
Application.ScreenUpdating = False
Range("A1").Select
zanzahl = InputBox("Für wie viele Zeilen soll die jeweilige Höhe gemerkt werden?")
ReDim dummy(zanzahl) As Double
For I = 1 To zanzahl
dummy(I) = ActiveCell.Rows("1:1").EntireRow.RowHeight
ActiveCell.Offset(1, 0).Select
Next I
Zeile1 = WorkRng.Row
With WorkRng.Worksheet
Do While Zeile1 
Hallo Leute,
Danke für Eure Unterstützung. Ich habs jetzt hinbekommen. Macht genau das was ich wollte. Meine Liste mit 1000 Zeilen wird so Aufgeteilt, dass alle verbundenen Zellen erhalten bleiben und zusätzlich werden alle leeren Spalten ausgeblendet.
Fast schon Perfekt.
LG tech

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige