Excel - Classificando dentro de uma ordenação

0

Eu tenho uma planilha excel dos meus todos. Cada linha na planilha é um todo e cada coluna fornece um atributo desse todo (por exemplo, a prioridade do todo). Eu também tenho três colunas que expressam se eu quero fazê-lo hoje de manhã, à tarde ou à noite.

Eu quero classificar esses itens da seguinte maneira:

1) no topo, quero todos os todos pela manhã. Eu quero esses todos classificados por prioridade,

2), então eu quero todos os todos para a tarde. Eu quero esses todos classificados por prioridade,

3) então os todos para a noite, classificados por prioridade,

4) depois todo o resto dos todos.

Mais detalhes:

  • alguns todos receberam uma prioridade de 1 a 5, mas os demais têm uma célula em branco na coluna de prioridades.

  • Se eu quiser fazer um trabalho todo pela manhã, colocarei uma coluna 1 da manhã. Para outros itens, pode haver uma coluna 0 da manhã ou pode estar em branco. Da mesma forma para as colunas da tarde e da noite.

Obrigado.

EDIT: por exemplo, digamos que eu tenha os seguintes dados:

  Todo                 Priority    Morning   Afternoon  Evening
Write report               4          1    
Research                   5          1 
Dinner                                                     1
Prepare for meeting        3                     1
Read draft                 
Phone colleague            5                               1

Eu quero que ele seja classificado como:

  Todo                 Priority    Morning   Afternoon  Evening 
Research                   5          1 
Write report               4          1   
Prepare for meeting        3                     1
Phone colleague            5                               1
Dinner                                                     1
Read draft                 
    
por James 09.09.2016 / 01:35

1 resposta

1

(Embora não seja a solução ideal), uma solução é implementar 'classificações' em uma tabela classificada usando o VBA. O código a seguir faz isso:

Sub SortByToday()
'
' SortByToday Macro
'

'
    Dim row As Long
    Dim rows As Long
    Dim topRow As Long
    Dim bottomRow As Long

    For row = 2 To 1000
        If Range("A" & row).Value = "" Then
            rows = row
            Exit For
        End If
    Next

    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("L2"), Range("L" & rows)) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("N2"), Range("N" & rows)) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("P2"), Range("P" & rows)) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range(Range("A1"), Range("W" & rows))
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    'find the number of morning todos
    For row = 2 To 1000
        If Range("L" & row).Value <> 1 Then
            bottomRow = row
            Exit For
        End If
    Next

    'sort on the morning todos only
    If bottomRow <> 2 Then
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("D2"), Range("D" & bottomRow - 1)) _
            , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Sheet1").Sort
            .SetRange Range(Range("A2"), Range("W" & bottomRow - 1))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End If

    topRow = bottomRow

    For row = topRow To 1000
        If Range("N" & row).Value <> 1 Then
            bottomRow = row
            Exit For
        End If
    Next

    If bottomRow <> topRow Then
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("D" & topRow), Range("D" & bottomRow - 1)) _
            , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Sheet1").Sort
            .SetRange Range(Range("A" & topRow), Range("W" & bottomRow - 1))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End If

    topRow = bottomRow

    For row = topRow To 1000
        If Range("P" & row).Value <> 1 Then
            bottomRow = row
            Exit For
        End If
    Next

    If bottomRow <> topRow Then
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(Range("D" & topRow), Range("D" & bottomRow - 1)) _
            , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Sheet1").Sort
            .SetRange Range(Range("A" & topRow), Range("W" & bottomRow - 1))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End If

End Sub

Nota:

1) Coluna A é onde a descrição do texto todo é escrita. A primeira parte do código localiza quantas linhas estão na tabela de todos.

2) O primeiro tipo classifica os todos pela manhã (coluna L), depois pela tarde (coluna N) e depois pela noite (coluna P).

3) O próximo loop for localiza o número de linhas que são um todo da manhã. Então o tipo seguinte ordena todos os dias pela prioridade. Então a mesma coisa é feita para a tarde todos e a tarde todos.

Obrigado ao @ fixer1234 pela ideia.

    
por 09.09.2016 / 12:25