Excel Daten sortieren in nächste leere Zeile

  • #1
J

joergi78

Bekanntes Mitglied
Themenersteller
Dabei seit
17.08.2005
Beiträge
249
Reaktionspunkte
0
Hallöchen an alle,
ich habe mal wieder ne Frage:
Wie muss ein Marko lauten, dass nach dem sortieren direkt in der nächsten leeren Zeile die Zelle in Spalte A markiert wird???
 
  • #2
Hallo joergi78,

was soll denn da sortiert werden ? ganzes Blatt, Selektion ? ? ?
(oder wie sehen die Makro-Zeilen bzgl. Sortieren aus ?)

Gruß Matjes :)
 
  • #3
Matjes schrieb:
Hallo joergi78,

was soll denn da sortiert werden ? ganzes Blatt, Selektion ? ? ?
(oder wie sehen die Makro-Zeilen bzgl. Sortieren aus ?)

Gruß Matjes :)
das ganze Blatt soll sortiert werden. Außer Zeile 1, diese enthält überschriften
 
  • #4
Und nach welchen Spalten soll sortiert werden ? Nur nach Spalte A ?

Das sähe dann so aus.

Gruß Matjes :)
Code:
Sub NachSpalteASortieren()

  Const cERSTEZEILE = 2
  Const cSPALTE_A = 1
  
  Dim ws As Worksheet
  Dim lRows As Long, lCols As Long
  
  Set ws = ActiveSheet
  lRows = ws.Cells(ws.Rows.Count, cSPALTE_A).End(xlUp).Row
  lCols = ws.UsedRange.Column + ws.UsedRange.Columns.Count - 1
  
  If lRows > cERSTEZEILE Then
    ws.Range(ws.Cells(cERSTEZEILE, 1), ws.Cells(lRows, lCols)).Sort _
      Key1:=ws.Cells(cERSTEZEILE, cSPALTE_A), _
      Order1:=xlAscending, _
      Header:=xlNo
  End If
  
  ws.Range(ws.Cells(lRows + 1, cSPALTE_A), ws.Cells(lRows + 1, cSPALTE_A)).Activate
  
AUFRAEUMEN:
  Set ws = Nothing
End Sub
 
  • #5
und wie muss das ganze dann heißen wenn das Blatt geschützt ist?
 
  • #6
soweit klappt es ja, nur das Problem ist, dass die nächste Freie Zelle in Spalte A markiert wird und es auch zwischendurch leere Zellen in Spalte A gibt.
Es muss aber die nächste leere Zelle in Spalte A markiert werden, wenn die ganze Zeile leer ist.
geht das auch???
 
  • #7
Hallo joergi78,

dann probier mal diese Version.  Wenn für den Blattschutz ein Passwort verwendet wird, müßtest du die Konstannte  cPASSWORT = entsprechend ändern.

Gruß Matjes :)

Code:
Sub NachSpalteASortieren()


  Const cPASSWORT = 
  Const cERSTEZEILE = 2
  Const cSPALTE_A = 1
  
  Dim ws As Worksheet
  Dim lRows As Long, lCols As Long
  
  Set ws = ActiveSheet
  lRows = ws.Cells(ws.Rows.Count, cSPALTE_A).End(xlUp).Row
  lCols = ws.UsedRange.Column + ws.UsedRange.Columns.Count - 1
  
  If lRows > cERSTEZEILE Then
  
   ->BlattSchutz aufheben
    If cPASSWORT <>  Then
      ws.Unprotect Password:=cPASSWORT
    Else
      ws.Unprotect
    End If
    
   ->sortieren
    ws.Range(ws.Cells(cERSTEZEILE, 1), ws.Cells(lRows, lCols)).Sort _
      Key1:=ws.Cells(cERSTEZEILE, cSPALTE_A), _
      Order1:=xlAscending, _
      Header:=xlNo
      
   ->Zell-Formatierung -> geschützt löschen
    ws.Cells.Locked = False
   ->Zell-Formatierung -> geschützt für beschriebene Zellen setzen
    ws.Range(ws.Cells(1, 1), ws.Cells(lRows, lCols)).Locked = True
      
   ->BlattSchutz setzen
    If cPASSWORT <>  Then
      ws.Protect _
        Password:=cPASSWORT, _
        DrawingObjects:=True, _
        Contents:=True, _
        Scenarios:=True
    Else
      ws.Protect _
        DrawingObjects:=True, _
        Contents:=True, _
        Scenarios:=True
    End If
  End If
  
  
  lRows = ws.Cells(ws.Rows.Count, cSPALTE_A).End(xlUp).Row
  ws.Range(ws.Cells(lRows + 1, cSPALTE_A), ws.Cells(lRows + 1, cSPALTE_A)).Activate
  
AUFRAEUMEN:
  Set ws = Nothing
End Sub
 
  • #8
diese Version markiert die Spalte A der ersten freien Zeile.

Gruß Matjes :)
Code:
Sub NachSpalteASortieren2()


  Const cPASSWORT = 
  Const cERSTEZEILE = 2
  Const cSPALTE_A = 1
  
  Dim ws As Worksheet
  Dim lRows As Long, lCols As Long, lRowLast As Long, x As Long
  
  Set ws = ActiveSheet
  lRows = ws.Cells(ws.Rows.Count, cSPALTE_A).End(xlUp).Row
  lCols = ws.UsedRange.Column + ws.UsedRange.Columns.Count - 1
  lRowLast = 0
  For x = 1 To lCols
    lRows = ws.Cells(ws.Rows.Count, x).End(xlUp).Row
    If lRowLast < lRows Then lRowLast = lRows
  Next
  lRows = lRowLast
  
  If lRows > cERSTEZEILE Then
  
   ->BlattSchutz aufheben
    If cPASSWORT <>  Then
      ws.Unprotect Password:=cPASSWORT
    Else
      ws.Unprotect
    End If
    
   ->sortieren
    ws.Range(ws.Cells(cERSTEZEILE, 1), ws.Cells(lRows, lCols)).Sort _
      Key1:=ws.Cells(cERSTEZEILE, cSPALTE_A), _
      Order1:=xlAscending, _
      Header:=xlNo
      
   ->Zell-Formatierung -> geschützt löschen
    ws.Cells.Locked = False
   ->Zell-Formatierung -> geschützt für beschriebene Zellen setzen
    ws.Range(ws.Cells(1, 1), ws.Cells(lRows, lCols)).Locked = True
      
   ->BlattSchutz setzen
    If cPASSWORT <>  Then
      ws.Protect _
        Password:=cPASSWORT, _
        DrawingObjects:=True, _
        Contents:=True, _
        Scenarios:=True
    Else
      ws.Protect _
        DrawingObjects:=True, _
        Contents:=True, _
        Scenarios:=True
    End If
  End If
  
  ws.Range(ws.Cells(lRows + 1, cSPALTE_A), ws.Cells(lRows + 1, cSPALTE_A)).Activate
  
AUFRAEUMEN:
  Set ws = Nothing
End Sub
 
  • #9
ja, aber er springt in Zeile 2000 und sperrt alle Zellen.
Er soll aber nur die Zellen sperren, die vorher auch gesperrt ware.
Welcher Teil ist denn der Sprung in die leere Zelle der leeren Zeile???
dann bastel ich mir das Marko passend zusammen
 
  • #10
Hallo joergi78,

markiert wird am Ende des Makros z.B. hier:
Code:
  ws.Range(ws.Cells(lRows + 1, cSPALTE_A), ws.Cells(lRows + 1, cSPALTE_A)).Activate

Hier werden die Zellen gesperrt gesetzt:
Code:
   ->Zell-Formatierung -> geschützt für beschriebene Zellen setzen
    ws.Range(ws.Cells(1, 1), ws.Cells(lRows, lCols)).Locked = True

Da müßtest du ggf. die Werte für lRows, lCols anpassen.

Gruß Matjes :)
 
  • #11
jetzt geht gar nix mehr

naja,
ich brobier nochmal
 
  • #12
du kannst mir auch eine Beispieldatei schicken, in der die Probleme auftauchen.
Dann schau ich mir das heute Abend mal an.

Sinnvoll ist es, erstmal alles ohne Blattschutz/Zellenschutz auszuprobieren.
Erst dann sollte der Zellenschutz mit eingebaut werden.

Gruß Matjes :)
 
  • #13
ok,
wie soll es denn heißen?
er soll sortieren nach:
1. Spalte A
2. Spalte B
3. Spalte C
und dann muss die nächste freie Zelle A markiert werden. Die Zeile muss aber komplett leer sein.Von mir aus könnte auch die nächste komplette leere Zeile markiert werden.
 
  • #14
welche Spalten sollen in den zu sortierenden Range einbezogen werden ?

Gruß Matjes :)
 
  • #15
ansonsten müssen alle Spalten mit sortiert werden. Nur die Sortierkreterien sind ind er Reihenfolge
1. Spalte A
2. Spalte B
3. Spalte C
 
  • #16
dann jetzt der dritte Versuch (ohne Zellschutz ein-/ausschalten):
Code:
Sub NachSpalteASortieren3()


  Const cPASSWORT = 
  Const cERSTEZEILE = 2
  Const cSP_A = 1
  Const cSP_B = 2
  Const cSP_C = 3
  
  Dim ws As Worksheet, Zelle As Range
  Dim lRowLast As Long, lRow As Long, x As Long
  Dim sErtseAdresse As String
  Dim bLeerZeile  As Boolean
  Dim lVonSP As Long, lBisSP As Long
  
  Set ws = ActiveSheet
  
 ->zu sortierenden Bereich feststellen
 ->---SPALTEN
  lVonSP = 1
  lBisSP = ws.UsedRange.Columns.Count - 1 + ws.UsedRange.Column
 ->---ZEILEN
  lRowLast = 0
  For x = lVonSP To lBisSP
    lRow = ws.Cells(ws.Rows.Count, x).End(xlUp).Row
    If lRowLast < lRow Then lRowLast = lRow
  Next
  
 ->nur sortieren, wenn mehr als eine Zeile vorhanden ist
  If lRowLast > cERSTEZEILE Then
  
   ->sortieren
    ws.Range(ws.Cells(cERSTEZEILE, lVonSP), ws.Cells(lRowLast, lBisSP)).Sort _
      Key1:=ws.Cells(cERSTEZEILE, cSP_A), Order1:=xlAscending, _
      Key2:=ws.Cells(cERSTEZEILE, cSP_B), Order2:=xlAscending, _
      Key3:=ws.Cells(cERSTEZEILE, cSP_C), Order3:=xlAscending, _
      Header:=xlNo
    
   ->erste leer Zeile im (Sortierbereich plus eine Zeile) finden,
   ->und Zelle in Spalte A markieren
    
    Set Zelle = ws.Range(ws.Cells(cERSTEZEILE, cSP_A), ws.Cells(lRowLast + 1, cSP_A)).Find( _
      What:=, _
      After:=ws.Cells(cERSTEZEILE, cSP_A), _
      LookIn:=xlValues, _
      LookAt:=xlWhole, _
      SearchOrder:=xlByColumns, _
      SearchDirection:=xlPrevious, _
      MatchCase:=False, _
      SearchFormat:=False)
    
    If Zelle Is Nothing Then
      MsgBox ( _
        Fehler in NachSpalteASortieren2. & vbLf & _
        Bitte rufen Sie ihren Arzt oder Administrator.)
      GoTo AUFRAEUMEN
    End If
    
   ->letzte Zeile plus 1 ist Ausgangspunkt
    sErtseAdresse = Zelle.Address
    lRow = Zelle.Row
    
   ->gibt es oberhalb noch leere Zeilen
    Do
      Set Zelle = ws.Range(ws.Cells(cERSTEZEILE, cSP_A), _
                           ws.Cells(lRowLast + 1, cSP_A)).FindPrevious(After:=Zelle)
      If Zelle.Address = sErtseAdresse Then Exit Do
      bLeerZeile = True
      For x = lVonSP To lBisSP
        If ws.Cells(Zelle.Row, x).Value <>  Then
          bLeerZeile = False
        End If
      Next
      If bLeerZeile Then lRow = Zelle.Row
    Loop
    ws.Range(ws.Cells(lRow, cSP_A), ws.Cells(lRow, cSP_A)).Activate
    
  Else
    ws.Range(ws.Cells(lRowLast + 1, cSP_A), ws.Cells(lRowLast + 1, cSP_A)).Activate
  End If
  
AUFRAEUMEN:
  Set ws = Nothing: Set Zelle = Nothing
End Sub
 
  • #17
WUNDERBAR DANKE!!!!!
Habe das jetzt ganz einfach so erledigt und mir fürs schützen und Schutz entfernen 2 Markos erstellt.
Dann habe ich ein Makro aufgezeichnet in folgender Reihenfolge:
1. Sub SchutzEntfernen
2. Sub NachSpalteASortieren3 (dein Marko)
3. Sub Schützen
so habe ich alle meine wünsche in einem Marko vereint.
Danke noch mal
gruß Jörgi78
 
Thema:

Excel Daten sortieren in nächste leere Zeile

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.959
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben