Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Mit VBA sortieren, wenn Spalte nicht ortsgebunden

Betrifft: Mit VBA sortieren, wenn Spalte nicht ortsgebunden von: Urs
Geschrieben am: 12.09.2014 09:22:23

Guten Morgen
Mit dem Makrorecorder habe ich das untenstehend Skript aufgenommen.

  • Sub IEC_3()
        Cells.Select
        ActiveWorkbook.Worksheets("Artikelübersicht").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Artikelübersicht").Sort.SortFields.Add Key:=Range( _
            "AW2:AW52"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
            xlSortNormal 'Inhalt von AW1 ist: "IEC-Wi......."
        ActiveWorkbook.Worksheets("Artikelübersicht").Sort.SortFields.Add Key:=Range( _
            "I2:I52"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal 'Inhalt von I1 ist: "Lage 1"
        With ActiveWorkbook.Worksheets("Artikelübersicht").Sort
            .SetRange Range("A1:AX52")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        Selection.AutoFilter
    End Sub



  • Nun meine Fragen dazu:
    1. Sortierung nach Kolonne I: Wie muss ich die Syntax abändern, dass nicht nach Kolonne AW gesucht wird sondern nach der Kolonne die in der 1. Zeile "Lage 1" stehen hat?
    2. Sortierung nach Kolonne AW: Wie muss ich die Syntax abändern, dass nicht nach Kolonne AW gesucht wird sondern nach der Kolonne die in der 1. Zeile mit folgenden 3 Buchstaben beginnt "IEC"?
    3. Im Beispiel heisst das aktive Worksheet ("Artikelübersicht"). Was muss ich in der Syntax ändern, wenn ich einfach vonm aktiven Worksheet starte?

    Danke jetzt schon für Eure Hilfe. Gruss Urs

      

    Betrifft: AW: Mit VBA sortieren, wenn Spalte nicht ortsgebunden von: Daniel
    Geschrieben am: 12.09.2014 09:41:14

    Hi

    zu 1)...Sort.SortFields.Add Key:=Rows(1).Find(What:="Lage 1", lookat:=xlwhole, lookin:=xlvalues)

    zu 2)...Sort.SortFields.Add Key:=Rows(1).Find(What:="IEC*", lookat:=xlwhole, lookin:=xlvalues)

    zu 3) Ersetze ActiveWorkbook.Worksheets("Artikelübersicht") durch ActiveSheet

    Gruß Daniel


      

    Betrifft: Danke :-) mit Nachfrage von: Urs
    Geschrieben am: 12.09.2014 11:12:47

    Hallo Daniel
    Was Du mir da zur Verfügung gestellt hast ist super. Es funktioniert. :-) Danke

    Ich hätte aber gleich noch eine 4. Frage stellen sollen:
    4. Wie muss ich den Range definieren, wenn er jedesmal wechseln kann? Also auch ("A1:KZ64000") sein könnte

  • .SetRange Range("A1:AX52")


  • Gruss Urs


      

    Betrifft: AW: Danke :-) mit Nachfrage von: Daniel
    Geschrieben am: 12.09.2014 11:43:34

    Hi
    wenn du alle Zellen auf dem Blatt sortieren willst:

    .SetRange ActiveSheet.UsedRange

    Gruß Daniel


      

    Betrifft: AW: Danke :-) mit Nachfrage von: Urs
    Geschrieben am: 12.09.2014 12:01:44

    Hallo Daniel vielen Dank !


      

    Betrifft: AW: Danke :-) mit Nachfrage von: fcs
    Geschrieben am: 12.09.2014 12:01:09

    Hallo Urs,

    nachdem ich mit deinem Problem auch beschäfftig habe hier auch meine Lösung.

    Ähnlich wie Daniels, zusätzlich sind Prüfungen eingebaut, wenn die gesuchten Spalten nicht vorhanden sind oder nicht sortiert werden kann.

    Gruß
    Franz

    Sub IEC_3()
        Dim wks As Worksheet
        Dim SpaLage As Long, SpaIEC As Long, ZeileL As Long
        Dim rngZelle As Range, varFind As Variant
        Set wks = ActiveSheet
        With wks
          If .AutoFilterMode = True Then
            .AutoFilterMode = False
          End If
          varFind = "Lage 1"
          Set rngZelle = .Rows(1).Find(what:=varFind, LookIn:=xlValues, lookat:=xlWhole)
          If rngZelle Is Nothing Then
            MsgBox "Spalte mit """ & varFind & """ nicht gefunden"
          Else
            SpaLage = rngZelle.Column
            varFind = "IEC"
            Set rngZelle = .Rows(1).Find(what:=varFind & "*", LookIn:=xlValues, lookat:=xlWhole)
            If rngZelle Is Nothing Then
              MsgBox "Spalte mit """ & varFind & """ nicht gefunden"
            Else
              SpaIEC = rngZelle.Column
              With .UsedRange
                ZeileL = .Row + .Rows.Count
              End With
              If ZeileL > 2 Then
                .Sort.SortFields.Clear
                .Sort.SortFields.Add Key:=.Cells(1, SpaIEC), SortOn:=xlSortOnValues, _
                    Order:=xlDescending, DataOption:=xlSortNormal _
                     'Inhalt von AW1 ist: "IEC-Wi......."
                .Sort.SortFields.Add Key:=.Cells(1, SpaLage), SortOn:=xlSortOnValues, _
                    Order:=xlAscending, DataOption:=xlSortNormal _
                    'Inhalt von I1 ist: "Lage 1"
                With .Sort
                    .SetRange wks.Range(wks.Cells(1, 1), wks.Cells(ZeileL, 50)) '50=Spalte AX
                    .Header = xlYes
                    .MatchCase = False
                    .Orientation = xlTopToBottom
                    .SortMethod = xlPinYin
                    .Apply
                End With
              End If
              .Range(.Cells(1, 1), .Cells(ZeileL, 50)).AutoFilter
            End If
          End If
        End With
    End Sub
    



      

    Betrifft: AW: Danke :-) mit Nachfrage von: Urs
    Geschrieben am: 12.09.2014 12:11:34

    Hallo Franz
    Auch Dir vielen Dank für Deine aufwendige Version. Ich werde sie mir als VBA Studie zu Gemüte führen und sie bei Bedarf anwenden.
    Schönes Wochenende. Gruss Urs


     

    Beiträge aus den Excel-Beispielen zum Thema "Mit VBA sortieren, wenn Spalte nicht ortsgebunden"