Sort values based on colors, then on values using VBA code

Saher Naji

Board Regular
Joined
Dec 19, 2019
Messages
76
Office Version
  1. 2013
Platform
  1. Windows
Hello, I'm tryin to sort values based on colors, then on values

The macro was working very well, but on one sheet, so I have to create a new module for each sheet, and because I have around 400 sheets,

This is the simple working macro:
VBA Code:
Sub A_Sort()
'
' A_Sort Macro
'

'
    Range("B4:J43").Select
    ActiveWorkbook.Worksheets("Jan_3").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Jan_3").Sort.SortFields.Add(Range("B4:B43"), _
        xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(169, _
        208, 142)
    ActiveWorkbook.Worksheets("Jan_3").Sort.SortFields.Add(Range("B4:B43"), _
        xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(244, _
        176, 132)
    ActiveWorkbook.Worksheets("Jan_3").Sort.SortFields.Add(Range("B4:B43"), _
        xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(184, _
        137, 219)
    ActiveWorkbook.Worksheets("Jan_3").Sort.SortFields.Add(Range("B4:B43"), _
        xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(155, _
        194, 230)
    ActiveWorkbook.Worksheets("Jan_3").Sort.SortFields.Add2 Key:=Range("G4:G43") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Jan_3").Sort
        .SetRange Range("B3:J43")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("B4:B43").Select
    ActiveWorkbook.Worksheets("Jan_3").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Jan_3").Sort.SortFields.Add2 Key:=Range("B4:B43") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Jan_3").Sort
        .SetRange Range("B4:B43")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("C4").Select
End Sub

The best way is to run the macro for the active sheet, not for a named sheet

This my try, but it's not working, I don't know how to re-write the code to work on the active sheet

VBA Code:
Sub A_Sort()
'
' A_Sort Macro
'

'
    Dim WS As Worksheet

    Set WS = ActiveSheet

    With WS.Sort
    Range("B4:J43").Select
    WS.Range("G3:G43").Sort.SortFields.Clear
    WS.Range("G3:G43").Sort.SortFields.Add(Range("B4:B43"), _
        xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(169, _
        208, 142)
    WS.Range("G3:G43").Sort.SortFields.Add(Range("B4:B43"), _
        xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(244, _
        176, 132)
   WS.Range("G3:G43").Sort.SortFields.Add(Range("B4:B43"), _
        xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(184, _
        137, 219)
    WS.Range("G3:G43")).Sort.SortFields.Add(Range("B4:B43"), _
        xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(155, _
        194, 230)
   WS.Range("G3:G43").Sort.SortFields.Add2 Key:=Range("G4:G43") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With WS.Range("G3:G43").Sort
        .SetRange Range("B3:J43")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("B4:B43").Select
    WS.Range("G3:G43").Sort.SortFields.Clear
   WS.Range("G3:G43").Sort.SortFields.Add2 Key:=Range("B4:B43") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With WS.Range("G3:G43").Sort
        .SetRange Range("B4:B43")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("C4").Select
End Sub


Thank you very much
 
Would you be able to provide a little example, preferably using XL2BB or sharing on dropbox, of one of the sheets to format? If you want to just provide a template/shell without any sensitive data, that should be okay. Just trying to better understand what needs to be sorted on each sheet.
Ignore the previous message please

What I'm looking for is sort the data depending on the 4 colors in column B, then on the times values in Column G, I have 365 sheets like this, so I need a code to run on active sheet
I recorded the macro using Sort Levels
Sort.png



test it.xlsm
ABCDEFGHIJK
1
2 SPAIN GMT+1 // BRAZIL GMT-3 M 04:00 - 10:00 | A 10:00 - 16:00 | E 16:00 - 22:00 | N 22:00 - 04:00
3FLIGHT #TRAVELLERFROMTOAIRLINETIMESTATUSCOMMENTS
40131. RebeccaBCNEZEIB0:30DATE CHANGED87.00 €
50247. RickMXPVIEOS9:15OK
60348. MarkMXPVIEOS9:15OK
70447. DaleVIEKIVOS11:40OK
80548. SmithVIEKIVOS11:40OK
90606. JohnJFKPUJB614:49OK
100790. WilliamCPTLHRBA16:40REFUNDED
110803. SandyEZELHRBA18:25REFUNDED
120903. ClaudeAEPGRUG322:35OK
131084. MichaleSJOMADIB23:50OK
1411
1512
1613
1714
1815
1916
2017
2118
2219
2320
2421
2522
2623
2724
2825
2926
3027
3128
3229
3330
3431
3532
3633
3734
3835
3936
4037
4138
4239
4340
44 TOTALS BUMPEDUSEDBOOKINGS
450710
Jan_4
Cell Formulas
RangeFormula
F45F45=COUNTIF(H4:H43,"X")
H45H45=COUNTIF(H4:H43,"OK")
I45I45=COUNTA(F4:F43)
Cells with Conditional Formatting
CellConditionCell FormatStop If True
J4Expression=MOD(ROW(),2)=0textNO
J4Expression=K4:K28="X"textNO
J4Expression=K4:K43="X"textNO
J5:J6Expression=MOD(ROW(),2)=0textNO
J5:J6Expression=K5:K44="X"textNO
J7:J43Expression=MOD(ROW(),2)=0textNO
J29:J43Expression=K29:K52="X"textNO
J7:J28Expression=K7:K46="X"textNO
I4Expression=MOD(ROW(),2)=0textNO
I4Expression=H4:H28="X"textNO
I5:I43Expression=MOD(ROW(),2)=0textNO
I29:I43Expression=H29:H52="X"textNO
I5:I28Expression=H5:H29="X"textNO
G4Expression=MOD(ROW(),2)=0textNO
G4Expression=H4:H28="X"textNO
G4Expression=H4:H43="X"textNO
H4,C4:F4Expression=MOD(ROW(),2)=0textNO
C4Expression=H4:H28="X"textNO
D4Expression=H4:H28="X"textNO
E4Expression=H4:H28="X"textNO
F4Expression=H4:H28="X"textNO
H4Expression=H4:H28="X"textNO
C4Expression=H4:H43="X"textNO
G5:G6Expression=MOD(ROW(),2)=0textNO
G5:G6Expression=H5:H44="X"textNO
C7:H43,C5:F6,H5:H6Expression=MOD(ROW(),2)=0textNO
B4:B43Expression=AA4="N"textNO
B4:B43Expression=AA4="E"textNO
B4:B43Expression=AA4="A"textNO
B4:B43Expression=AA4="M"textNO
F29:F43Expression=H29:H52="X"textNO
H29:H43Expression=H29:H52="X"textNO
G29:G43Expression=H29:H52="X"textNO
E29:E43Expression=H29:H52="X"textNO
D29:D43Expression=H29:H52="X"textNO
C29:C43Expression=H29:H52="X"textNO
H5:H28Expression=H5:H44="X"textNO
G7:G28Expression=H7:H46="X"textNO
F5:F28Expression=H5:H44="X"textNO
E5:E28Expression=H5:H44="X"textNO
D5:D28Expression=H5:H44="X"textNO
C5:C28Expression=H5:H44="X"textNO
Cells with Data Validation
CellAllowCriteria
H4:H43List=Status_Day
I4:I43List=INDIRECT(H4)
 
Upvote 0

Excel Facts

Excel Wisdom
Using a mouse in Excel is the work equivalent of wearing a lanyard when you first get to college
Oh, sorry. Since you are selecting cells, which usually isn't necessary, you'd also need to select the sheet as you loop through them. Try the below.

VBA Code:
Sub A_Sort()

Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets

    With ws
        .Select
        .Range("B4:J43").Select
        .Sort.SortFields.Clear
        .Sort.SortFields.Add(Range("B4:B43"), _
            xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(169, _
            208, 142)
        .Sort.SortFields.Add(Range("B4:B43"), _
            xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(244, _
            176, 132)
        .Sort.SortFields.Add(Range("B4:B43"), _
            xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(184, _
            137, 219)
        .Sort.SortFields.Add(Range("B4:B43"), _
            xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(155, _
            194, 230)
        .Sort.SortFields.Add2 Key:=Range("G4:G43") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With .Sort
            .SetRange Range("B3:J43")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        .Range("B4:B43").Select
        .Sort.SortFields.Clear
        .Sort.SortFields.Add2 Key:=Range("B4:B43") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With .Sort
            .SetRange Range("B4:B43")
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        .Range("C4").Select
    End With
Next ws

End Sub
it's working very well with some these edits:
VBA Code:
Sub A_Sort()

Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets

 With ws
 .Select
.Range("B4:J43").Select
.Sort.SortFields.Clear
.Sort.SortFields.Add(Range("B4:B43"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(169, _
208, 142)
.Sort.SortFields.Add(Range("B4:B43"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(244, _
176, 132)
.Sort.SortFields.Add(Range("B4:B43"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(184, _
137, 219)
.Sort.SortFields.Add(Range("B4:B43"), _
xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(155, _
194, 230)
.Sort.SortFields.Add2 Key:=Range("G4:G43") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("B3:J43")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
 .Apply
End With
.Range("B4:B43").Select
.Sort.SortFields.Clear
.Sort.SortFields.Add2 Key:=Range("B4:B43") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("B4:B43")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
 .Apply
End With
.Range("C4").Select
End With
Next ws

End Sub
 
Upvote 0
1673255417775.png

The time order as shown in the screenshot above
for the first 3 colors (4:00-22:00) every thing is working well, but the current code sorting the times like this for the last period (22:00 - 4:00): 02:30; 03:00, 22:00, but it should to start with 22:00 and ends with 03:59
So could we add some lines to the current code to sort the times correctly:

VBA Code:
.Sort.SortFields.Add2 Key:=Range("G4:G43") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
 
Upvote 0

Forum statistics

Threads
1,214,620
Messages
6,120,554
Members
448,970
Latest member
kennimack

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top