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-Key: 250432

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

Printed on: April 28, 2024 at 08:04 o'clock

Member: colinardo
Solution colinardo Sep 29, 2014 updated at 12:30:50 (UTC)
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
Member: chaos2go
chaos2go Sep 29, 2014 at 11:22:31 (UTC)
Goto Top
Hey Uwe ,


wie geil bis du den face-smile


es läuft faden grade vielen herzlichen dank


gruß chaos