In VBA ein (Order by )
cheers Leute,
ich hab folgendes anliegen :
Hab ein Report als Excel Tabelle Spalten gehn von A - AM und Zeilen Ende Offen aber meist über 20k einträge
In der Ersten Zeile steht jeweils die bezeichnung der Spalte
Was soll gemacht werden ?
Es soll in Spalte L überprüft werden welches Land eingetragen ist und für jedes Land eine neue Mappe erstellt werden in dem alle zeilen Kopiert werden die , dass selbe Land in der Spalte haben sind ca 30 verschiedene Länder
danke schon mal im vorraus
gruß chaos
ich hab folgendes anliegen :
Hab ein Report als Excel Tabelle Spalten gehn von A - AM und Zeilen Ende Offen aber meist über 20k einträge
In der Ersten Zeile steht jeweils die bezeichnung der Spalte
Was soll gemacht werden ?
Es soll in Spalte L überprüft werden welches Land eingetragen ist und für jedes Land eine neue Mappe erstellt werden in dem alle zeilen Kopiert werden die , dass selbe Land in der Spalte haben sind ca 30 verschiedene Länder
danke schon mal im vorraus
gruß chaos
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 250432
Url: https://administrator.de/contentid/250432
Ausgedruckt am: 26.11.2024 um 12:11 Uhr
2 Kommentare
Neuester Kommentar
Moin chaos2go,
Demo-Sheet: grouped_copy_to_new_sheets_250432.xlsm
Dies kopiert die Zeilen mit den gleichen Ländern in neue Registerkarten benannt nach dem Land
Falls du die Zeilen lieber in neue Excel-Arbeitsmappen kopiert haben willst, kommt diese leicht abgewandelte Prozedur zum Einsatz:
Als alternative zu der ersten Prozedur kann auch diese hergenommen werden, wenn die Originaltabelle nach Ländern sortiert werden darf:
Alle Prozeduren finden sich im Demo-Sheet.
Viel Erfolg
Grüße Uwe
Demo-Sheet: grouped_copy_to_new_sheets_250432.xlsm
Dies kopiert die Zeilen mit den gleichen Ländern in neue Registerkarten benannt nach dem Land
Sub CopyUniqueToSheets()
Dim ws As Worksheet, newWS As Worksheet, cell As Range, dic As Object, c As Range
'Dictionary-Objekt erzeugen
Set dic = CreateObject("Scripting.Dictionary")
'Worksheet festlegen in dem die Daten liegen
Set ws = Sheets(1)
'letze Zeile ermitteln
lastRow = ws.UsedRange.Rows.Count
For Each cell In ws.Range("L2:L" & lastRow)
'Wenn das Land in der aktuellen Zelle noch nicht verarbeitet wurde
If Not dic.Exists(cell.Value) Then
'Land zum Dictionary hinzufügen
dic.Add cell.Value, ""
'neues Worksheet hinzufügen
Set newWS = Worksheets.Add(After:=Worksheets(Worksheets.Count))
'dem Worksheet den Namen des Landes geben
newWS.Name = cell.Value
'Überschriftenzeile übertragen
ws.Range("A1").EntireRow.Copy newWS.Range("A1")
'Suche in Spalte L
With ws.Range(cell, "L" & lastRow)
'Suche das Land in der aktuellen Zelle
Set c = .Find(cell.Value, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
'Eintrag gefunden, kopiere die gefundene Zeile ins neue Sheet ans Ende
c.EntireRow.Copy newWS.UsedRange.Cells(newWS.UsedRange.Rows.Count + 1, 1)
'Suche den nächsten Eintrag
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End If
Next
End Sub
Sub CopyUniqueToNewWorkbooks()
Dim ws As Worksheet, newWS As Worksheet, cell As Range, dic As Object, c As Range, wb As Workbook, savePath As String
'Dictionary-Objekt erzeugen
Set dic = CreateObject("Scripting.Dictionary")
'Pfad festlegen in dem die neuen Mappen gespeichert werden
savePath = ActiveWorkbook.Path
'Worksheet festlegen in dem die Daten liegen
Set ws = Sheets(1)
'letze Zeile ermitteln
lastRow = ws.UsedRange.Rows.Count
For Each cell In ws.Range("L2:L" & lastRow)
'Wenn das Land in der aktuellen Zelle noch nicht verarbeitet wurde
If Not dic.Exists(cell.Value) Then
'Land zum Dictionary hinzufügen
dic.Add cell.Value, ""
'neues Workbook hinzufügen
Set wb = Workbooks.Add
'neues Worksheet setzen
Set newWS = wb.Worksheets(1)
'dem Worksheet den Namen des Landes geben
newWS.Name = cell.Value
'Überschriftenzeile übertragen
ws.Range("A1").EntireRow.Copy newWS.Range("A1")
'Suche in Spalte L
With ws.Range(cell, "L" & lastRow)
'Suche das Land in der aktuellen Zelle
Set c = .Find(cell.Value, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
'Eintrag gefunden, kopiere die gefundene Zeile ins neue Sheet ans Ende
c.EntireRow.Copy newWS.UsedRange.Cells(newWS.UsedRange.Rows.Count + 1, 1)
'Suche den nächsten Eintrag
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
'neu erstelltes Workbook im selben Verzeichnis speichern
wb.SaveAs savePath & "\" & cell.Value
End If
Next
End Sub
Sub AlternativeWithOriginalTableSort()
Dim ws As Worksheet, newWS As Worksheet, cell As Range, dic As Object, curCell As Range, activeWS As Worksheet
'Worksheet festlegen in dem die Daten liegen
Set ws = Sheets(1)
Set curCell = ws.Range("L2")
ws.UsedRange.Sort curCell, xlAscending, Header:=xlYes
While curCell <> ""
If curCell.Value <> curCell.Offset(-1, 0) Then
'neues Worksheet hinzufügen
Set activeWS = Worksheets.Add(After:=Worksheets(Worksheets.Count))
'dem Worksheet den Namen des Landes geben
activeWS.Name = curCell.Value
'Überschriftenzeile übertragen
ws.Range("A1").EntireRow.Copy activeWS.Range("A1")
'Daten der aktuellen Zeile kopieren
curCell.EntireRow.Copy activeWS.UsedRange.Cells(activeWS.UsedRange.Rows.Count + 1, 1)
Else
'Daten der aktuellen Zeile kopieren
curCell.EntireRow.Copy activeWS.UsedRange.Cells(activeWS.UsedRange.Rows.Count + 1, 1)
End If
'nächste Zeile setzen
Set curCell = curCell.Offset(1, 0)
Wend
End Sub
Viel Erfolg
Grüße Uwe