Página 1 de 2

VBA - Ordenar/Classificar Dados de Tabela

Enviado: 16 Jul 2019 às 11:27
por SandroLima
Bom dia, pessoal.

Preciso de ajuda para ajustar um código que organiza os dados de uma tabela.

Necessito que as as células da Coluna [Data} que possuem cor de preenchimento ou cor da fonte diferente de preto (qualquer uma das duas condições resolve meu problema) sejam ordenadas de acordo com a data da Coluna [Pgto/Vencimento].

As células que não possuem preenchimento ou que a cor da fonte seja preta (RGB 0,0,0) estão ordenadas da forma que desejo.
Preciso que a alteração do código atue somente nas células da coluna [Data] que possuem alguma cor de preenchimento, ordenando a células da Coluna [Data] que apresentem preenchimento (somente as que apresentem preenchimento) de acordo com a data da Coluna [Pgto/Vencimento] de maneira que as que apresentem data mais próxima do vencimento estejam mais próximas do topo da tabela.

Segue planilha com exemplificação da forma desejada de resultado.

Obrigado e bom dia.

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 16 Jul 2019 às 11:51
por Jimmy
Olá Sandro,

Veja a planilha anexa. Não é bem o que você pediu pois as células sem preenchimento colorido também serão classificadas pela coluna de Pagto / Vencto, como segundo critério.

Se não te atender, teremos que usar a macro para descobrir exatamente o que deve ser classificado, e atuar só ali.

Jimmy San Juan

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 17 Jul 2019 às 16:37
por SandroLima
Boa tarde, Jimmy.

Obrigado por se prontificar em ajudar novamente.

Então... gostaria que o restante da tabela (onde não há formatação condicional, ou onde ela deixou de existir) (sem cores) mantivesse a mesma ordem que fiz a classificação (datas mais antigas no fim da tabela e datas mais recentes no começo da tabela).

A adequação da macro seria somente para a parte da tabela em que as células da Coluna [Data] apresentasse preenchimento (formatação condicional). Para essas células gostaria que a classificação fosse de acordo com as datas da Coluna [Pgto/Vencimento], ou seja, as células da Coluna [Data] que apresentam formatação condicional e cuja data do [Pgto/Vencimento] estejam mais próximas fiquem mais perto do topo da tabela.

Em resumo:
1) as células da coluna [Data] que não apresentem ou não atendem a formatação condicional, devem ser classificadas da mais nova para a mais antiga.
2) as células da coluna [Data] que apresentem ou atendem a formatação condicional, devem ser ordenadas de acordo com as datas da Coluna [Pgto/Vencimento] onde as que estão mais próximas do vencimento estão próximas do topo da tabela.

Se olhar o código que eu fiz tentei traduzir a minha necessidade nele através de uma condição "IF"... porém não obtive êxito.

E obrigado por ajudar novamente.

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 17 Jul 2019 às 19:10
por Jimmy
Oi Sandro,

Pra fazer isso eu vejo 2 caminhos:

- A macro fuçar dentro das condicionais de cada célula pra ver de que cor a condicional está pintando. Uma vez eu tive que ir por esse caminho, mas tive problemas, porque havia células que tinhas várias condicionais, mas a macro só enxergava algumas delas.

- Encontrar outra forma de identificar as linhas coloridas. Eu observei que as linhas coloridas da planilha exemplo têm a coluna H em branco, ou tem "Aguardando pagamento". Ai a macro poderia facilmente saber o que é colorido e o que não é.

Você acha que a coluna H pode servir de base para isso?

Jimmy

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 17 Jul 2019 às 22:24
por SandroLima
Boa noite, Jimmy.
- Encontrar outra forma de identificar as linhas coloridas. Eu observei que as linhas coloridas da planilha exemplo têm a coluna H em branco, ou tem "Aguardando pagamento". Ai a macro poderia facilmente saber o que é colorido e o que não é.
Não vejo problemas quanto a usar outra coluna se atingir o resultado desejado.
Porém, alerto para que, além da condição "" ou "Aguardando pagamento" da Coluna H, a formatação condicional também depende da relação entre a data HOJE() e quantidade de dias para o vencimento (Coluna G).

Anexei a macro que faz a formatação condicional para melhor entendimento... veja o anexo.

Boa noite e obrigado novamente, Jimmy.

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 18 Jul 2019 às 07:42
por Jimmy
Bom dia Sandro,
SandroLima escreveu:Porém, alerto para que, além da condição "" ou "Aguardando pagamento" da Coluna H, a formatação condicional também depende da relação entre a data HOJE() e quantidade de dias para o vencimento (Coluna G).
Sim, mas pelo que notei, essa relação entre a data de hoje e o vencimento sempre é considerada quando não houve pagamento, logo, a coluna H estará vazia (caso o vencimento seja futuro) ou com "Aguardando pagamento" (caso o vencimento já tenha ocorrido.

Note que as célular coloridas perdem a cor quando qualquer coisa é digitada na coluna H, exceto "Aguardando pagamento".

Logo, pergunto: em qual condição a coluna H teria conteúdo difetente de vazio E de "Aguardando pagamento", porém com a célula da coluna DATA colorida?

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 18 Jul 2019 às 12:07
por SandroLima
Bom dia, Jimmy.
Note que as células coloridas perdem a cor quando qualquer coisa é digitada na coluna H, exceto "Aguardando pagamento".
Será quase isso... Na verdade elas perdem a formatação/cor quando recebem o Status "Pago" ou "-" ou "cancelado".
As outras situações são:
"" (vazio) - nessa situação a célula entra na formatação condicional e serve para lembrar que a célula está vazia e não foi atribuído nenhum Status ainda.
"Aguardando pagamento" - Quando ainda está dentro do prazo de pagamento mas não foi paga
"Vencido" - essa terceira quando ultrapassou a data de vencimento e ainda não foi paga.

Em síntese, as células da coluna [Data] recebem a cor da formatação condicional nas seguintes situações:
Sem cor - Quando o Status for "Pago" ou "-".
Cor Verde - Quando o Status for "" (vazio) ou "Aguardando pagamento" e estiver há 04 dias ou mais do vencimento.
Cor Vermelha - Quando o Status for "" (vazio) ou "Aguardando pagamento" e tiver ultrapassado o vencimento ou quando o "Status" for vencido.
Cor Laranja (escuro, médio e claro) - Quando o Status for "" (vazio) ou "Aguardando pagamento" e estiverem entre 1, 2 ou 3 dias do vencimento.
Logo, pergunto: em qual condição a coluna H teria conteúdo diferente de vazio E de "Aguardando pagamento", porém com a célula da coluna DATA colorida?
No caso para "Vencido".

Qualquer coisa estou à disposição... e obrigado pela atenção novamente.

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 18 Jul 2019 às 12:38
por Jimmy
Sandro,
Cor Verde - Quando o Status for "" (vazio) ou "Aguardando pagamento" e estiver há 04 dias ou mais do vencimento.
Cor Vermelha - Quando o Status for "" (vazio) ou "Aguardando pagamento" e tiver ultrapassado o vencimento ou quando o "Status" for vencido.
Cor Laranja (escuro, médio e claro) - Quando o Status for "" (vazio) ou "Aguardando pagamento" e estiverem entre 1, 2 ou 3 dias do vencimento.
Estou confuso! Veja que nas três possibilidades acima, não há nenhuma verificação com a palavra VENCIDO. Veja que todas elas começam com
Quando o Status for "" (vazio) ou "Aguardando pagamento" e ... ou sejam, só tem cor quandondo umas dessas 2 condições forem atendidas.

Eu fiz o teste e digitei VENCIDO na coluna H de uma linha colorida, e ela deixou de ficar colorida.
Pode ser que a formatação condicional não esteja fazendo o que deveria fazer. Eu notei uma série de condições com #REF, porém elas se aplicam à coluna B, e não D.

Acho que temos que esclarecer isso antes de prosseguir, porque o caminho da macro entrar na formatação condicional é tortuoso, e é a única forma que conheço para obter a cor de uma célula quando essa cor foi determinada por uma condicional.

Jimmy

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 18 Jul 2019 às 16:10
por SandroLima
Boa tarde, Jimmy.

Acho que corrigi o problema... verifique novamente, por favor.

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 19 Jul 2019 às 22:20
por SandroLima
Boa noite.

Precisando dessa funcionalidade:

Em resumo:
1) as células da coluna [Data] que não apresentem ou não atendem a formatação condicional, devem ser classificadas da mais nova para a mais antiga.
Do jeito que está na tabela está correto...
2) as células da coluna [Data] que apresentem ou atendem a formatação condicional, devem ser ordenadas de acordo com as datas da Coluna [Pgto/Vencimento] onde as que estão mais próximas do vencimento estão próximas do topo da tabela.
Ainda não chegamos em uma solução para isso.... As células da coluna {Data} que apresentam formatação condicional devem ser classificadas de modo inverso àquelas que não possuem formatação condicional... Ou seja, de acordo com as datas da coluna [Pgto/Vencimento] devem ser ordenadas de modo que as que possuem data de vencimento mais próximo fiquem no topo da tabela e as que possuem data de vencimento mais distante mais próximas do final da tabela.

Alguém mais tem alguma ideia?

Segue planilha aexa novamente.

Obrigado a quem puder colaborar.

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 20 Jul 2019 às 01:19
por Jimmy
Olá Sandro,

Desculpe a demora. Eu não abandonei o tópico. É que não pude mexer ontem, e não achei solução fácil.

Teste o código abaixo, com as mais diversas situações.

Altere apenas nas 2 primeiras linhas, o nome da planilha e o nome da tabela, porque estão com nomes de teste que eu fiz.
Código: Selecionar todos
Sub Ordena()

    Set Plan = Sheets("Jimmy")
    Set Tabel = Plan.ListObjects("TB_AtivDiarias24")
    
    Set Aqui = ActiveCell
    TabTotLin = Tabel.DataBodyRange.Rows.Count
    TabTotCol = Tabel.DataBodyRange.Columns.Count
    TabColIni = Tabel.DataBodyRange.Range("A1").Column
    TabLinIni = Tabel.DataBodyRange.Range("A1").Row
    TabColFim = TabColIni + TabTotCol - 1
    TabLinFim = TabLinIni + TabTotLin - 1
    ColDat = Tabel.ListColumns("Data").DataBodyRange.Column
    ColPgt = Tabel.ListColumns("Pgto / Vencimento").DataBodyRange.Column
    ColSta = Tabel.ListColumns("Status Pgto").DataBodyRange.Column
    
    LinCorte = Evaluate("CountIf(TB_AtivDiarias24[[#All],[Status Pgto]],""Aguardando pagamento"") + " & _
                        "CountIf(TB_AtivDiarias24[[#All],[Status Pgto]],"""")") + TabLinIni - 1
                        
    For Passo = 1 To 3
    
        If Passo = 1 Then Set RngTudo = Range(Cells(TabLinIni, TabColIni), Cells(TabLinFim, TabColFim)): _
                          Set RngColu = Range(Cells(TabLinIni, ColDat), Cells(TabLinFim, ColDat)): _
                          SortTipo = xlSortOnCellColor: SortOrder = xlDescending
        If Passo = 2 Then Set RngTudo = Range(Cells(TabLinIni, TabColIni), Cells(LinCorte, TabColFim)): _
                          Set RngColu = Range(Cells(TabLinIni, ColPgt), Cells(LinCorte, ColPgt)): _
                          SortTipo = xlSortOnValues: SortOrder = xlAscending
        If Passo = 3 Then Set RngTudo = Range(Cells(LinCorte + 1, TabColIni), Cells(TabLinFim, TabColFim)): _
                          Set RngColu = Range(Cells(LinCorte + 1, ColDat), Cells(TabLinFim, ColDat)): _
                          SortTipo = xlSortOnValues: SortOrder = xlAscending
        
        Plan.Sort.SortFields.Clear
        Plan.Sort.SortFields.Add Key:=RngColu, _
            SortOn:=SortTipo, Order:=SortOrder, DataOption:=xlSortNormal
        With Plan.Sort
            .SetRange RngTudo: .Header = xlGuess: .MatchCase = False
            .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
        End With
    
    Next
    
    Aqui.Select
   
End Sub
Se funcionar, te explico com detalhes.

Jimmy San Juan

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 21 Jul 2019 às 20:26
por SandroLima
Boa noite, Jimmy.

Obrigado pela colaboração.

Testei aqui e em um primeiro momento não trouxe o resultado esperado.

Com uma pequena alteração consegui a forma desejada.
If Passo = 3 Then Set RngTudo = Range(Cells(LinCorte + 1, TabColIni), Cells(TabLinFim, TabColFim)): _
Set RngColu = Range(Cells(LinCorte + 1, ColDat), Cells(TabLinFim, ColDat)): _
SortTipo = xlSortOnValues: SortOrder = xlDescending
Mas confesso que foi por pura tentativa... se puder me explicar o código ficaria muito agradecido.

A maneira como eu havia escrito... pq não aproveitou nada?
Foi a maneira que achei de mais fácil entendimento. Espero que eu consiga ir inserindo novas condições no seu código a medida que forem (se forem) necessárias. Uma nova condição que precisarei inserir na Coluna [Status Pgto] é a de"Valor retido" cujas células da coluna [Data] recebem formatação da mesma maneira que "Aguardando pagamento".

Mas espero que com as explicações do código eu consiga ir inserindo a medida que seja necessário.

Muito obrigado novamente e uma boa noite.

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 21 Jul 2019 às 21:39
por Jimmy
Salve Sandro,
Com uma pequena alteração consegui a forma desejada.
Opsss.... desculpe, falha minha.... Que bom que conseguiu encontrar o erro!!!

Na sua forma, a classificação era feita na tabela toda, logo, os critérios são aplicados a todas as linhas.
Sua necessidade é outra. Você precisa que a parte colorida seja classificada por uma coluna, um critério, e a que não é colorida, por outra coluna e outro critério.

A macro que te passei classifica 3 vezes:
Na 1a., classifica toda a tabela pela coluna DATA, critério COR, para que as células coloridas fiquem em cima.
Na 2a., classifica apenas as linhas com células coloridas, pela coluna PAGTO, critério VALORES ASCENDENTES.
Na 3a., classifica apenas as linhas com células não coloridas, pela coluna DATA, critério VALORES DESCENDENTES.
Isso é feito dentro de um FOR de 3 vezes, apenas para aproveitar a estrutura do SORT.
Os 3 IFs iniciais definem o bloco a ser classificado, a coluna de classificação e as condições, e o SORT é feito dessa forma.
Se preferir, elimine o FOR e coloque os 3 SORTs individualmente.

O problema central da classificação pedida neste tópico, é achar a linha onde as células coloridas acabam, para que as duas últimas classificações do FOR, saibam onde atuar (uma acima, e outra abaixo dessa linha). Na macro essa linha é indicada na variável LinCorte (linha de corte).

Até a primeira classificação, tudo tranquilo, mas após isso... não é fácil obter essa linha apenas varrendo as células e olhando para a COR, porque o VBA não retorna a cor que a célula tem após a aplicação da formatação condicional. Se retornasse seria apenas questão de achar a primeira célula sem cor, e encontraríamos a linha de corte, mas o VBA retorna a cor natural da célula, desconsiderando a condicional.

Para encontrar a linha de corte, a macro deveria, para cada célula de DATA da tabela, obter a lista das várias condições que atuam na formatação, verificar cada uma delas se é verdadeira ou não, obter a cor associada às condições que resultaram VERDADEIRO, e finalmente obter a cor final. Ou seja, o VBA teria que aplicar virtualmente a formatação condicional novamente por conta própria.
Complicando um pouco mais isso, temos a questão do idioma, porque as condições obtidas estão em português, e para executá-las tem que estar em ingles (idioma natural do VBA). Ou seja, o que é E vira AND, OU vira OR, ponto vira vírgula, etc.
Eu não segui esse caminho.

Analisando as condicionais da tua tabela, as que atuam na coluna DATA, concluí que TODAS as coloridas tinham OU pagto em branco, OU pagto = "Aguardando pagamento". Então, a linha de corte que separa a parte colorida da não colorida (variável LinCorte) é a soma da:
- linha inicial da tabela - 1
- quantidade de linhas com pagto em branco
- quantidade de linhas com pagto = "Aguardando pagamento"
Isso é obtido na instrução
Código: Selecionar todos
    LinCorte = Evaluate("CountIf(TB_AtivDiarias24[[#All],[Status Pgto]],""Aguardando pagamento"") + " & _
                        "CountIf(TB_AtivDiarias24[[#All],[Status Pgto]],"""")") + TabLinIni - 1
Para a sua nova condição ficaria:
Código: Selecionar todos
    LinCorte = Evaluate("CountIf(TB_AtivDiarias24[[#All],[Status Pgto]],""Aguardando pagamento"") + " & _
                        "CountIf(TB_AtivDiarias24[[#All],[Status Pgto]],""Valor retido"") + " & _
                        "CountIf(TB_AtivDiarias24[[#All],[Status Pgto]],"""")") + TabLinIni - 1
A classificação por cores é boa, mas em certos casos complica um pouco. As vezes, a criação de colunas auxiliares pode simplificar o problema.

Se ainda tiver dúvidas, fique a vontade pra perguntar.

Jimmy San Juan

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 29 Jul 2019 às 09:25
por SandroLima
Bom dia, usuários do fórum... Bom dia, Jimmy
Se ainda tiver dúvidas, fique a vontade pra perguntar.
Pode deixar que pergunto mesmo kkkk
A macro que te passei classifica 3 vezes:
Na 1a., classifica toda a tabela pela coluna DATA, critério COR, para que as células coloridas fiquem em cima.
Na 2a., classifica apenas as linhas com células coloridas, pela coluna PAGTO, critério VALORES ASCENDENTES.
Na 3a., classifica apenas as linhas com células não coloridas, pela coluna DATA, critério VALORES DESCENDENTES.
Entendi perfeitamente e baseado na sua macro e incorporando uma necessidade minha acrescentei 2 passos na classificação e um bloco If no 1º Passo...Mas não consegui o resultado esperado.

A finalidade seria ordenar a tabela através da coluna [Data] da menor para a maior, inserir a numeração de acordo com essa ordem na coluna registro e depois inverter a ordem dos registros na tabela... Somente após isso seguiria com a classificação como está na sua macro.

Essa situação é necessária para que não haja "saltos" nos números de registros... por exemplo ao pagar uma linha de registro o código atualiza a sequencia numérica da coluna registro.

Inseri na planilha 3 botões:
O primeiro deles com a macro inicial onde eu organizava a tabela mas sem priorizar as datas de vencimentos.
O segundo com a sua solução que serviu muito bem... mas que preciso incluir essa função de restabelecer a sequencia numérica da coluna registro sem "saltos".
No terceiro botão e baseado na sua macro tentei completar a minha necessidade mas o resultado esperado não foi alcançado... mas deixei a macro para vc entender o que preciso nela.

Pode verificar, por gentileza?

Segue planilha anexa.

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 29 Jul 2019 às 22:06
por Jimmy
Boa noite Sandro,

A parte de numeração da coluna de registro, apesar de estar logo abaixo do IF do Passo 1, ela não estava dentro do IF. Essa parte está fora dos IFs, logo, é executada a cada loop do FOR, ou seja, 5 vezes. O que te confundiu foi que eu montei o IF sem o END IF, e por não estar acostumado com essa forma, não percebeu onde terminava o IF. Mudei para a forma tradicional, que ocupa 2 linhas a mais, mas fica mais explícito.

Eu coloquei a numeração como Passo 2, então só será executada 1 vez, logo após o Passo 1. No passo 2 não é feita classificação alguma, apenas a renumeração.

A classificação seguinte, a que você havia colocado como Passo2, eu desativei, porque não consegui ver sentido nela. Veja:
... e depois inverter a ordem dos registros na tabela... Somente após isso seguiria com a classificação como está na sua macro.
Porque inverter a ordem dos registros, se logo em seguida haverá outra classificação, dos mesmos dados (tabela toda) por cores, que “destruirá” a classificação por ordem invertida de registros?

Quanto ao resultado, verifique se ficou da forma que você que você esperada.

Eu acho que talvez você deva estabelecer um critério de desempare para as 2 últimas classificações, porque a numeração não tá ficando legal quando há linhas com a mesma data. Veja as últimas 10 linhas como ficaram os registros. Creio que esse critério de desempate deve ser Registro / Descentente.

Jimmy San Juan

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 30 Jul 2019 às 21:34
por SandroLima
Boa noite, Jimmy

Obrigado por ajudar novamente... estamos quase lá.
Porque inverter a ordem dos registros, se logo em seguida haverá outra classificação, dos mesmos dados (tabela toda) por cores, que “destruirá” a classificação por ordem invertida de registros?
É justamente para ordenar os registros na parte em que as células perderam a formatação condicional... as linhas em que o campo data é o mesmo podem fazer com que a coluna registro fique "desordenada".
Na parte da tabela em que ainda permanece a formatação condicional funciona perfeitamente pq a ordenação passa a ser regrada pela data de vencimento.
Mas na parte da tabela em que as células perderam a formatação condicional eu utilizava do artifício de renumerar e inverter a ordem para manter os registros na ordem sequencial.

Sendo assim ou inserimos na macro o passo de inverter os registros antes da classificação por cores e data de vencimento ou seguimos a sua sugestão:
Eu acho que talvez você deva estabelecer um critério de desempate para as 2 últimas classificações. Creio que esse critério de desempate deve ser Registro / Descentente.
O que vc sugere?

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 01 Ago 2019 às 16:51
por Jimmy
Olá Sandro,
SandroLima escreveu:Obrigado por ajudar novamente...
Não precisa agradecer, aliás, já está agradecendo ao clicar na mãozinha nas mensagens que de alguma forma te ajudaram.

Agora entendi a segunda classificação que você incluiu. De fato, sem ela a coluna de registros fica em ordem crescente para grupos de linhas de mesma data.

Eu fiz esse acerto da ordem dos registros, incluindo um segundo critério de seleção no passo 5. Assim, quando as datas empatam, o Excel irá classificar por Registro. Dessa forma o resultado é mais seguro, pois pela outra forma, você conta com que os registros de mesma data, após a classificação por data, vão ficar na mesma ondem em que estão na tabela, mas isso pode mudar caso a Microsoft altere o algoritmo de classificação. Colocando o registro como segundo critério, não há como o Excel não fazer.

Teste, por favor.

Jimmy San Juan

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 03 Ago 2019 às 15:52
por SandroLima
Boa tarde, Jimmy.

Boa tarde, demais usuários do fórum.

Jimmy agradeço novamente sua atenção e ajuda.

Atendeu perfeitamente o "ajuste" realizado no código... deixou da maneira desejada.

Havia tentado resolver de outra maneira (acrescentado mais um passo) que também deu certo e que achei que ficou mais simples mas não sei se foi a melhor maneira (sendo assim resolvi seguir o seu código rsrs)... mas para aprendizado peço sua opinião sobre a maneira que escrevi o código: (vou colocar somente os passos pois o restante permanece inalterado)
Código: Selecionar todos
For Passo = 1 To 6
    
        'Classifica os dados da tabela por data => mais antiga (início) para a mais recente (final da tabela)
        
        Set RngTabela = Nothing:   Set RngCol = Nothing
       
        If Passo = 1 Then
            Set RngTabela = Range(Cells(IniLin, IniCol), Cells(UltLin, UltCol))
            Set RngCol = Range(Cells(IniLin, ColData), Cells(UltLin, ColData))
            SortTipo = xlSortOnValues: SortOrdem = xlAscending
        End If
        
        If Passo = 2 Then      'Insere um índice sequencial na coluna Registro e copia/cola os valores
            With Tabela.ListColumns("Registro").DataBodyRange
                .FormulaLocal = "=LIN()-LIN(TB_AtivDiarias[[#Cabeçalhos];[Registro]])"
                .Value = .Value2
            End With
        End If
            
        If Passo = 3 Then
            Set RngTabela = Range(Cells(IniLin, IniCol), Cells(UltLin, UltCol))
            Set RngCol = Range(Cells(IniLin, Colreg), Cells(UltLin, Colreg))
            SortTipo = xlSortOnValues: SortOrdem = xlDescending
        End If
        
        If Passo = 4 Then
            Set RngTabela = Range(Cells(IniLin, IniCol), Cells(UltLin, UltCol))
            Set RngCol = Range(Cells(IniLin, ColData), Cells(UltLin, ColData))
            SortTipo = xlSortOnCellColor: SortOrdem = xlDescending
        End If
           
        If Passo = 5 Then
            Set RngTabela = Range(Cells(IniLin, IniCol), Cells(LinCorte, UltCol))
            Set RngCol = Range(Cells(IniLin, ColVcto), Cells(LinCorte, ColVcto))
            SortTipo = xlSortOnValues: SortOrdem = xlAscending
        End If
                              
        If Passo = 6 Then
            Set RngTabela = Range(Cells(LinCorte + 1, IniCol), Cells(UltLin, UltCol))
            Set RngCol = Range(Cells(LinCorte + 1, ColData), Cells(UltLin, ColData))
            SortTipo = xlSortOnValues: SortOrdem = xlDescending
        End If
    
        If Not RngTabela Is Nothing Then
            Plan.Sort.SortFields.Clear
            Plan.Sort.SortFields.Add Key:=RngCol, _
                SortOn:=SortTipo, Order:=SortOrdem, DataOption:=xlSortNormal
                
            With Plan.Sort
                .SetRange RngTabela: .Header = xlGuess: .MatchCase = False
                .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
            End With
        End If
        
    Next

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 03 Ago 2019 às 17:17
por Jimmy
Olá Sandro,

Supondo que queira classificar uma tabela pelas colunas A e B, com prioridade para A, ou seja, apenas aquilo que empatar (linhas que tiverem o mesmo valor) em A, será classificado por B.

Você pode classificar a B primeiro, e depois, em uma segunda classificação, fazer a A. O resultado disso pode ser que seja o que deseja, mas pode ser que não. Os algoritmos de classificação agem com métodos distintos entre si, logo, a forma como ficará a coluna B após a segunda classificação, depende do método utilizado. Você não disse nada sobre B ao algoritmo, quando mandou classificar A, logo, ele não tem nenhum compromisso em manter B na ordem que estava nos casos em que A empata. No Excel isso funciona, em outro software pode não funcionar, e mesmo no Excel, pode ser que deixe de funcionar numa eventual alteração desse algoritmo.

Uma outra forma de classificar é dizer ao algoritmo exatamente o que quer: classificar pela A e em caso de empate, pela B. Isso se faz em uma só classificação, usando dois critérios de classificação. O Excel se compromete a fazer da forma que você solicitar (A, e em caso de empate, B). Qualquer outro software que tiver classificação e permita mais critérios, irá garantir o resultado que você procura.

Sandro, caso ainda haja coisas a fazer, vamos em frente sem problemas, mas caso esteja pensando em fechar o tópico, peço que aguarde mais um pouco. Estou pesquisando sobre a questão de obter a cor condicional da célula, via VBA, porque é uma questão interessante. Pode ser que surja alguma coisa que nos ajude neste caso. Te dou um toque quando eu terminar.

Jimmy San Juan

Re: VBA - Ordenar/Classificar Dados de Tabela

Enviado: 03 Ago 2019 às 17:39
por SandroLima
Olá, Jimmy.

Aproveitando o ensejo do tópico e do código gostaria de perguntar algumas coisas para meu aprendizado.

O que seria "SortTipo"? Um comando?
Código: Selecionar todos
SortTipo = xlSortOnCellColor: SortOrdem = xlDescending
E o que significam essas linhas?
Código: Selecionar todos
AquiP.Select
    AquiC.Select
Ainda aproveitando nosso tópico gostaria de pedir ajuda em mais uma demanda se vc achar razoável e puder me ajudar.
Além do que fizemos até aqui e está funcionando muito bem... a minha coluna [Registro] também possui formatação condicional que quando aplicadas significam que existe alguma pendência naquela linha.

Do modo antigo como eu fazia a classificação eu conseguia colocar na ordem desejada (e já explicarei qual é) mas agora com a classificação pela coluna [Pgto/Vencimento] me perdi um pouco em como eu poderia manter a classificação.

Na sequência da classificação da tabela o que preciso:
1) Que as linhas com data de vencimento mais próximo fiquem no topo da tabela (objetivo alcançado);
2) Na sequência teríamos as linhas em que a coluna [Registro] possui alguma "pendência" ou formatação condicional como vc pode observar na planilha anexa (essa seria a nova demanda);
3) Linhas em que não há nenhum tipo de formatação condicional na coluna [Data] ou [Registro] no final da tabela (objetivo alcançado)

Obs:
Se a linha apresentar formatação na coluna [Registro} e na coluna [Data] isso não altera a ordem de classificação a prioridade são sempre os vencimento próximos no topo da tabela.
A ordem sempre será:
1) Linhas com formatação condicional na coluna [Data]
2) Linhas com formatação condicional na coluna [Registro]
3) Linhas sem formatação condicional

Deixei a macro que eu completei na planilha pra que vc me dê um feedback sobre o modo como eu fiz.
Havia tentado resolver de outra maneira (acrescentado mais um passo) que também deu certo e que achei que ficou mais simples mas não sei se foi a melhor maneira (sendo assim resolvi seguir o seu código rsrs)... mas para aprendizado peço sua opinião sobre a maneira que escrevi o código: (vou colocar somente os passos pois o restante permanece inalterado)
Segue planilha anexa. Nela tem a forma desejada como exemplo.

Reforço... apenas se vc achar razoável de me ajudar a fazê-lo... já me ajudou muito até aqui.

Tenha um excelente final de semana