2017-05-27 2 views
0

Ich versuche herauszufinden, wie man eine Datenbank automatisch in VBA in Spalte A alphabetisch sortiert. Klingt einfach, aber ich habe Header in den ersten 4 Zeilen und will es sortieren Linie 5 nach unten. Ich habe Tage gesucht, um einen Code zu finden, der das tut. Die nächst ich gelungen ist mit diesemAlphabetisch sortiert mit VBA ab Zeile 5

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error Resume Next 
    If Not Intersect(Target, Range("A:A")) Is Nothing Then 
     Range("A1").Sort Key1:=Range("A2"), _ 
      Order1:=xlAscending, Header:=xlYes, _ 
      OrderCustom:=1, MatchCase:=False, _ 
      Orientation:=xlTopToBottom 
    End If 
End Sub 

Das Problem code- ist, wenn ich versuche, die Linie Range("A1").Sort Key1:=Range("A2"), _-Range("A5").Sort Key1:=Range("A6"), _ ändern, wenn ich es testen, es sortiert noch 2 rudert und nicht 5 rudern wie vorgesehen. Ich weiß, dass ich etwas vermisse, aber ich kann einfach nicht sehen, was ich vermisse!

+0

Sie verpassen den "von" Teil. Der zu sortierende Bereich kann nicht allein durch den "to" -Teil definiert werden, und zu sagen, dass Sie "to row 5" definieren möchten, ist sowieso ein Missverständnis, weil Sie mit Zeile 5 beginnen möchten. So, jetzt sehen Sie die Experten argumentieren, dass es deine Schuld ist, wenn sie dir die falsche Antwort geben. Kann sie nicht beschuldigen, oder? Wenn Sie eine nützliche Antwort wünschen, geben Sie den Bereich an, den Sie sortieren möchten, beginnend in Zeile 5 und wo? – Variatus

Antwort

0

Bitte missbrauchen Sie OERN nicht (On Error Resume Next). Es ist so, als würde man den Code zum Schweigen bringen :). Behandeln Sie den Fehler richtig.

Another interesting read

Ist das, was Sie wollen?

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim lRow As Long 

    On Error GoTo Whoa 

    '~> Find the last row in Col A 
    lRow = Range("A" & Rows.Count).End(xlUp).Row 

    '~~> Check if it is greater than row 4 
    If lRow > 4 Then 
     Application.EnableEvents = False 

     '~~> Check if the change happened in the relevant range 
     If Not Intersect(Target, Range("A5:A" & lRow)) Is Nothing Then 
      '~~> Sort only the relevant range 
      Range("A4:A" & lRow).Sort Key1:=Range("A4"), _ 
             Order1:=xlAscending, _ 
             Header:=xlYes, _ 
             OrderCustom:=1, _ 
             MatchCase:=False, _ 
             Orientation:=xlTopToBottom, _ 
             DataOption1:=xlSortNormal 
     End If 
    End If 

Letscontinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume Letscontinue 
End Sub 
+0

Siddharth Rout, vielen Dank für Ihre Hilfe! Der Code macht genau das, was auf der Verpackung steht. Ich habe allerdings nur ein kleines Problem. Die Datenbank, in der ich sie verwenden möchte, muss geschützt werden, um versehentliche Änderungen an einigen Berechnungen zu verhindern. Ihr Code funktioniert einwandfrei, wenn das Arbeitsblatt nicht geschützt ist, funktioniert aber nicht, wenn das Arbeitsblatt geschützt ist. Gibt es eine Problemumgehung, bei der ich einige Spalten sperren kann, aber alle Zeilen (A-H) beim Ausführen Ihrer VBA sortiert? –

+0

Sie können das Arbeitsblatt im Code selbst entsperren und sperren;). Entsperren Sie das Blatt unmittelbar vor der Sortierung und schützen Sie es unmittelbar nach der Sortierung –

Verwandte Themen