Notifications
Clear all

Macro para classificar um intervalo de linhas preenchidas

4 Posts
2 Usuários
0 Reactions
962 Visualizações
 rfc
(@rfc)
Posts: 0
New Member
Topic starter
 

Pessoal,

Sou novato aqui e ainda não entendo quase nada de VBA, então desculpem qualquer ignorância antecipadamente.

Preciso de uma macro que classifique todas as linhas a partir da 15 até a última preenchida.
Para achar a última linha preenchida posso usar as colunas A, B ou C.
O critério de classificação é ordem alfabética da coluna B.
A tabela vai da coluna A até a N, caso seja necessário para alguma coisa.

Juntei o que achei pesquisando na internet e cheguei nessa solução (SEM ENTENDER O MECANISMO DIREITO):

************************************************************************
Sub Ordenar_por_Cliente()

Dim LR As Long
With ActiveWorkbook.Worksheets("2016")
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=Range("B15"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
LR = .Cells(Rows.Count, 1).End(xlUp).Row
End With

With ActiveWorkbook.Worksheets("2016").Sort
.SetRange Range("A15:n15" & LR)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub

************************************************************************

Esse código está funcionando, pelo menos com os testes que fiz até agora.
O problema é que funciona especificamente para a aba "2016", e gostaria de generalizar para criar abas dos outros anos sem precisar criar novas macros.

Alguém consegue me ajudar?
Se tiverem sugestões melhores ou mais simples também seria ótimo.
Obrigado

 
Postado : 15/12/2015 2:29 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Experimente:

Sub Ordenar_por_Cliente()
Dim LR As Long
With ActiveSheet
    .Sort.SortFields.Clear
    .Sort.SortFields.Add Key:=Range("B15"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    LR = .Cells(Rows.Count, 1).End(xlUp).Row
End With

With ActiveSheet.Sort
    .SetRange Range("A15:N" & LR)
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
End Sub
 
Postado : 15/12/2015 6:49 am
 rfc
(@rfc)
Posts: 0
New Member
Topic starter
 

Reinaldo, obrigado pela resposta!
Não encontrei o ícone positivo para indicar que gostei da resposta...

A sua resposta funcionou, mas só tem um problema: quando ainda não tem nada preenchido a partir da linha 15 e executo a macro, ela acaba classificando algumas linhas anteriores.
Já tinha visto esse problema na macro que enviei antes, e creio que resolvi especificando a linha 15 em um dos comandos. Fiz o mesmo no código que vc enviou e funcionou perfeito, como mostrado a seguir:

Experimente:

Sub Ordenar_por_Cliente()
Dim LR As Long
With ActiveSheet
    .Sort.SortFields.Clear
    .Sort.SortFields.Add Key:=Range("B15"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    LR = .Cells(Rows.Count, 1).End(xlUp).Row
End With

With ActiveSheet.Sort
    .SetRange Range("A15:N[color=#0000FF]15[/color]]" & LR)
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
End Sub

Isto faz sentido para vc?

De novo, muito obrigado pela ajuda.

 
Postado : 15/12/2015 1:41 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Talvez; mas seria mais correto (penso eu) algo assim:
Apos o primeiro End With

....
End With
If LR<15 then LR=15
With ActiveSheet.Sort
    .SetRange Range("A15:N" & LR)
...
 
Postado : 16/12/2015 9:30 am