Row sorting

Is there any way to simulate a macro of the Sort command in Excel with the following example?

I have 60 rows and 53 data columns. After using the sort command, I really could get the results that I wanted, but I believe that if I had a macro, it would save me so much time. You can see the images before and after to have an idea of ​​what I was trying to accomplish.

[ Before sort]

[ After sort]

eg.

SORT LEFT TO RIGHT

SORT BY [ROW 2] | SORT ON [VALUES] | ORDER [SMALLEST TO LARGEST]
SORT BY [ROW 3] | SORT ON [VALUES] | ORDER [SMALLEST TO LARGEST]
...
...
SORT BY [ROW 59] | SORT ON [VALUES] | ORDER [SMALLEST TO LARGEST]
SORT BY [ROW 60] | SORT ON [VALUES] | ORDER [SMALLEST TO LARGEST]

UPDATE: I ran a macro recorder to see what it would look like: here is an abbreviated code from line 2 to line 61.

Sub Macro3()
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Add Key:=Range("B2:BB2") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Add Key:=Range("B3:BB3") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Add Key:=Range("B4:BB4") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Add Key:=Range("B5:BB5") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ...MORE ROWS HERE IN THE PATTERN AS SHOWN
    ...MORE ROWS HERE IN THE PATTERN AS SHOWN
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Add Key:=Range("B57:BB57" _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Add Key:=Range("B58:BB58" _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Add Key:=Range("B59:BB59" _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Add Key:=Range("B60:BB60" _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet11").Sort.SortFields.Add Key:=Range("B61:BB61" _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet11").Sort
        .SetRange Range("B1:BB63")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlLeftToRight
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Is there a way to make this more concise?

+4
source share
1 answer

Excel , VBA:

Data->Sort->Options...->Sort left to right

vba, Rows :

Sub SortByRows()
    With ActiveSheet.UsedRange
        .Sort Key1:=.Rows(1), Key2:=.Rows(2), Key3:=.Rows(3)
    End With
End Sub

. , :

Sub SortByRows()
    With ActiveSheet
        Set target = .Range(.Cells(2, 2), .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count))
    End With
    With ActiveSheet.Sort
        .SortFields.Clear
        .SetRange target
        .Orientation = xlLeftToRight
        .Header = xlNo

        For Each r In target.Rows
           .SortFields.Add r
        Next
        .Apply
    End With
End Sub
+4

Source: https://habr.com/ru/post/1615693/


All Articles