chaos2go
Goto Top

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

Content-ID: 250432

Url: https://administrator.de/contentid/250432

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

colinardo
Lösung colinardo 29.09.2014 aktualisiert um 14:30:50 Uhr
Goto Top
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
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
Falls du die Zeilen lieber in neue Excel-Arbeitsmappen kopiert haben willst, kommt diese leicht abgewandelte Prozedur zum Einsatz:
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
Als alternative zu der ersten Prozedur kann auch diese hergenommen werden, wenn die Originaltabelle nach Ländern sortiert werden darf:
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
Alle Prozeduren finden sich im Demo-Sheet.

Viel Erfolg
Grüße Uwe
chaos2go
chaos2go 29.09.2014 um 13:22:31 Uhr
Goto Top
Hey Uwe ,


wie geil bis du den face-smile


es läuft faden grade vielen herzlichen dank


gruß chaos