Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1560to1564
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

Tabelle splitten und speichern

Tabelle splitten und speichern
31.05.2017 11:02:40
cbds
Hallo Zusammen,
habe folgendes Problem. Ich erhalte oft große Dateien (>60.000 Zeilen), welche ich dann anhand eines Spaltenkriteriums aufteilen muss. Oft verändern sich innerhalb der Dateien die zum aufteilen relevanten Spalten zum aufteilen. Ich habe bereits ein Makro (hier aus dem Forum...Danke dafür), welches nach der Spalte A aufteilt. Ich habe versucht dieses Makro umzuschreiben und jeweils auf die Datei in Hinsicht auf relevante Spalte anzupassen. Dieses Makro behält in der neuen Ausgabe Datei immer die erste Zeile als Kopfzeile bei. Auch hier habe ich das Problem, dass dies je nach Datenlieferung von Datei zu Datei unterschiedlich ist.
Hier zunächst das Makro:
Sub splitten_2()
Dim wbMappe As Workbook, _
wbMappeNeu As Workbook, _
lngZeile As Long, lngZeile1 As Long, _
strPfad As String, lngFileFormat As Long, StatusCalc As Long
'Objektvariablen für die involverten Tabellenblätter
Dim wks_Q As Worksheet, wks_Muster As Worksheet, wks_Z As Worksheet
Dim varWert As Variant 'Merker für Wert in Spalte A
'Pfad festlegen (mit "\")
strPfad = "C:\Temp\"
lngFileFormat = ActiveWorkbook.FileFormat 'Dateiformat der aktuellen Mappe merken
'Makrobremsen lösen
With Application
StatusCalc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
'Erstmal alles in eine neue Mappe temporäre schaufeln
ActiveSheet.Copy
Set wbMappe = ActiveWorkbook
Set wks_Q = wbMappe.Worksheets(1) 'Tabellenblatt mit den Quelldaten
'Leeres Mustertabellenblatt erstellen
wks_Q.Copy After:=wks_Q
Set wks_Muster = ActiveSheet
'im Muster alles löschen außer Zeile 1
wks_Muster.UsedRange.Offset(1, 0).EntireRow.Delete
wks_Muster.Name = "Muster"
With wks_Q
lngZeile1 = 2 'Startzeile für kopieren setzen
varWert = .Cells(lngZeile1, 1).Value 'Vergleichswert in Spalte A
For lngZeile = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row + 1 '+ 1 = 1. leere Zeile
If varWert  .Cells(lngZeile, 1).Value Then
Application.StatusBar = "Bearbeite Zeile " & lngZeile & " - Wert: " & varWert
'Mustertabellenblatt und Daten kopieren in neue Arbeitsmappe
wks_Muster.Copy
Set wbMappeNeu = ActiveWorkbook
Set wks_Z = wbMappeNeu.Worksheets(1)
wks_Z.Name = CStr(varWert)
.Range(.Cells(lngZeile1, 1), .Cells(lngZeile - 1, 1)).EntireRow.Copy Destination:= _
wks_Z.Cells(2, 1)
Application.DisplayAlerts = False 'gleiche Dateinamen werden überschrieben -  _
Testzeile
wbMappeNeu.SaveAs Filename:=strPfad & CStr(varWert), FileFormat:=lngFileFormat
Application.DisplayAlerts = True '  - Testzeile
wbMappeNeu.Close
Set wbMappeNeu = Nothing
Set wks_Z = Nothing
lngZeile1 = lngZeile 'neue Startzeile für Kopieren setzen
varWert = .Cells(lngZeile1, 1).Value 'neuer Vergleichswert in Spalte A
End If
Next lngZeile
End With 'wks_Q
'temporäre Mappe ohne speichern schliessen
wbMappe.Close savechanges:=False
'Makrobremsen zurücksetzen
With Application
.StatusBar = False
.Calculation = StatusCalc
.ScreenUpdating = True
.EnableEvents = True
End With
'Objektvariablen aufräumen
Set wbMappe = Nothing
Set wks_Q = Nothing
Set wks_Muster = Nothing
End Sub

Habe nun als Beipiel folgendes vor:
Splitten nach Spalte Y und nicht A sowie Beibehaltung der erst 11 Zeilen aus der Datenlieferungsdatei.
Vielleicht kann mir jemand helfen. Habe erst mit VBA angefangen und komme einfach nicht weiter.
VG
Dennis

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabelle splitten und speichern
31.05.2017 11:26:01
yummi
Hallo Dennis,
die 2 Stellen, die für dich relevant sind:

lngZeile1 = 2 'Startzeile für kopieren setzen

hier setzt du deien 1. zu kopierende zeile, einach 5 eingeben wenn eine Überschriften in Zeile 4 stehen. Oder wie uhnten beschriebn von einer Zelle einlesen, ist somit konfigurierbar.

.Range(.Cells(lngZeile1, 1), .Cells(lngZeile - 1, 1)).EntireRow.Copy Destination:= _
wks_Z.Cells(2, 1)
hier wird mit der 1 Spalte A gesetzt Y wäre 25 (wenn ich mich nicht verzählt habe ;-)
Du könntest aber auc so etwas machen wie
.Cells(lngZeile, Sheet("MeinKonfigSheet").Cells(1,1).value dann kannst Du auf dem Sheet MeinKonfigSheet in Zelle A1 die Spaltenzahl eingeben.
Gruß
yummi
Anzeige
AW: Tabelle splitten und speichern
31.05.2017 12:39:25
cbds
Hi yummi,
danke für deine Anmerkungen. Habe mal die Zeilen angepasst, allerdings erhalte ich nun einen Laufzeitfehler. Nach dem Debuggen wird mir folgende Zeile angezeigt wks_Z.Name = CStr(varWert). Anscheinend funktioniert das kopieren der Inhalte ab Zeile 11 nicht.
Gruß
cbds
AW: Tabelle splitten und speichern
31.05.2017 13:11:09
yummi
Hallo Dennis,
was steht den in varWert drin?
Gruß
yummi
AW: Tabelle splitten und speichern
31.05.2017 13:34:45
cbds
varWert = .Cells(lngZeile1, 1).Value 'neuer Vergleichswert in Spalte A
müsste ich hier nicht varWert = .Cells(lngZeile25, 11).Value 'neuer Vergleichswert in Spalte A eintragen? Nach meinem Verständnis definiere ich hiermit doch den Speichernamen?
VG
cbds
Anzeige
AW: Tabelle splitten und speichern
31.05.2017 14:28:17
yummi
Hallo Dennis,
ich meinte den realen Wert, der zur Laufzeit in der Variablen steht, dass kannst Du sehen, wenn du einen Breakpoint im Code setzt und dann die Variable varWert ins überwachungsfenster ziehst oder mit debug.print varWert (imCode) den Wert der Variablen anzeigen.
Jetzt nochmal zur Erklärung deines Codes:
       With wks_Q
lngZeile1 = 2 'Startzeile für kopieren setzen
varWert = .Cells(lngZeile1, 1).Value 'Vergleichswert in Spalte A

varWert wird dem WErt aus der Zelle hier 2,1 entspricht A2 geladen. Wenn Dort ein Wert steht, der keinem Sheetnamen entspricht bekommst du den angezeigten Laufzeitfehler. Wenn Du alos lngZeile1 auf den Wert 11 gesetzt hast, dann muss auch in A11 der entsprechende Name des Sheets als Vergleichswert stehen.
lngZeile1 ist der Name deiner Variablen, die 1 hat nichts mit dem Wert zu tun, du brauchst also nicht lngZeile5 für die 5. Zeile. sondern lngZeile1 = 5
Ic hoffe, es ist etwas klarer geworden, ansonsten debuggen und schauen welche WErte in den Variablen wirklich drin stehen hilft beim Verständnis.
Gruß
yummi
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige