Ir ao conteúdo
  • Cadastre-se

Excel Classificar colunas usando o VBA


Posts recomendados

Ja procurei no fórum e não encontrei nenhum código que funcionasse, provavelmente eu não estou sabendo utilizar ja que comecei a programar em vba a pouco tempo.

Meu problema acredito seja simples, eu coloquei um Botão na minha Plan1 e quando ele é acionado ele precisa buscar os dados na Plan7. Porém, antes que o algorítimo comece, ele precisa classificar a Plan7 por Coluna A, em seguida por Coluna D e depois por Coluna C.

Public Sub Listar_Mapeamentos_Pendentes()

Dim x, y, z, i, a, b, treinamento As Integer

Dim curso, gerencia As String

.

.

.

.

.

End Sub

A classificação deve ser feita via VBA pois a planilha precisará ser reclassificada em outras rotinas.

Agradeço a ajuda de todos.

Link para o comentário
Compartilhar em outros sites

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:A6")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply

End With

Substitua A1:A6 pelo que você precisa ordenar

Link para o comentário
Compartilhar em outros sites

Não funcionou aqui, ficou da seguinte maneira:

Public Sub Listar_Mapeamentos_Pendentes()
Dim x, y, z, i, a, b, treinamento As Integer
Dim curso, gerencia As String
ActiveWorkbook.Worksheets("Sheet1").Sort.SortField s.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortField s.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:A6")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply

End With
End Sub  

.

.

.

.

 

Ao acionar o botão apareceu mensagem "Erro de compilação: Erro de sintaxe". Estou usando o Excel 2003 SP3.

Link para o comentário
Compartilhar em outros sites

Ja procurei no fórum e não encontrei nenhum código que funcionasse, provavelmente eu não estou sabendo utilizar ja que comecei a programar em vba a pouco tempo.

Meu problema acredito seja simples, eu coloquei um Botão na minha Plan1 e quando ele é acionado ele precisa buscar os dados na Plan7. Porém, antes que o algorítimo comece, ele precisa classificar a Plan7 por Coluna A, em seguida por Coluna D e depois por Coluna C.

.

Acho que sei bem menos sobre macro que você. Fiz os testes aqui também não consegui classificar os dados da plan7 como um botão na plan1. Até agora só consegui classificar colocando o botão dentro da própria plan7.

Vou deixar a minha simplória planilha aqui. Pode ser que os sábios em Excel aprimore o Código.

Link da planilha que fiz aqui:http://www.sendspace.com/file/nmoh1h

Boa sorte amigo!

Link para o comentário
Compartilhar em outros sites

... eu coloquei um Botão na minha Plan1 e quando ele é acionado ele precisa buscar os dados na Plan7. Porém, antes que o algorítimo comece, ele precisa classificar a Plan7 por Coluna A, em seguida por Coluna D e depois por Coluna C.

A classificação deve ser feita via VBA pois a planilha precisará ser reclassificada em outras rotinas.

Agradeço a ajuda de todos.

Me tira uma dúvida: Quando você aciona esse botão na Plan1, você vai parar na Plan7?......Então no intervalo de tempo entre o apertar o botão e ser levado para a Plan7 você quer que as colunas A, D e C ffiquem em ordem alfabética? .... É isso mesmo?

Um só botão executando 2 macros?

Link para o comentário
Compartilhar em outros sites

  • 11 anos depois...

Como vi que ninguém postou uma solução para esse tópico e assim como eu outras pessoas procurando podem encontrá-lo, estou deixando aqui a solução.

 

Esse código de cima não está correto, por dois motivos, primeiro porque isso é código de macro gravada e pode apresentar muitos erros ao tentar adaptá-la, sem falar que é contraproducente você utilizar tantas linhas de códigos, sendo que para classificar em VBA usa-se apenas duas linhas, que no seu caso (considerando que Plan7 seja o nome dado a planilha pelo VBA e não aquele que aparece na navegação na parte inferior da planilha) seriam:

Plan7.Activate

Columns("A:D").Sort key1:=Range("A1"), order1:=xlAscending, key2:=Range("D1"), order2:=xlAscending, key3:=Range("C1"), order3:=xlAscending, Header:=xlYes

 

Considerando:

Plan7 = Pode ser qualquer planilha que queira classificar, basta trocar pela nome dado pelo VBA na lista de objetos ou pelo nome que você colocou lá na navegação, aí basta colocar: Worksheets("nome da planilha").Activate

Columns = É o Range da tabela, como você não colocou quantas colunas tinham a tabela, considerei apenas aquelas que você citou, então presumi que fossem de A até D

key1 = A primeira coluna que queira usar na classificação, no seu caso era a A1

order1 = A forma de classificação usada, como você também não falou presumi que seja crescente, então basta colocar xlAscending

key2, order2... = Você coloca quantas colunas quiser para realizar a classificação, sempre indicando primeiro o Range em "key" e depois a forma de classificação em "order"

Header = Para informar ao Excel se existe cabeçalho na sua planilha ou não, caso exista você precisa colocar xlYes, senão ele irá classificar todas as linhas

 

Pronto! Só inserir essas linhas na ordem em que você deseja que o algoritmo seja executado.

Para mais formas de usar o Método Range.Sort pega o bisu aí no link:

https://docs.microsoft.com/pt-br/office/vba/api/excel.range.sort

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Olá Rafael!

 

Li sua solução e achei bom, mas, como não sou expert em VBA não consegui reproduzir sua instrução adaptando para a minha nescessidade. Vou postar a minha planilha e peço sua ajuda para isso.

Eu acabei fazendo igual a nosso colega, usando os códigos de gravação do VBA. A primeira lista foi de boa, mas, na segunda dá erro e não saio disso. Gostaria de aplicar seu metodo. Mas, se alguém entendeu e puder me ajudar, serei grato também.

Na minha planilha, tenho um codigo para incluir e excluir linha, conforme a lista vai aumentando. Por isso, tenho no codigo o esquema para encontrar a última linha e a última coluna visivel. Com isso, consigo encontrar as outras variáveis para montar o range, o que não consigo é concluir a classificação.

 

Sub Classificar_Lista()
'
' Classificar_Lista Macro
' Classifica as listas de 'Empresas Anfitriã' e 'Oradores'
'
   Dim UltimaLinha          As Long
   Dim UltimaColuna         As Long
   Dim PrimeiraLinha        As Long
   Dim PrimeiraColuna       As Long
   Dim PrimeiraLinhaClass   As Long
   Dim PrimeiraColunaClass  As Long
   
   Application.ScreenUpdating = True

'  Interrompe a atualização da tela;
   Application.ScreenUpdating = False

'  Desprotege a Aba;
   ActiveSheet.Unprotect

'  Seleciona a planilha ativa;
   Set sh = ActiveSheet
   
'  Obs. pessoal: Não entendi este comando, futuramente pesquisar o que está acontecendo aqui,
'                mas, o comando é nescessário para a execução a seguir;
   Set rng = sh.Range("A1").SpecialCells(xlCellTypeLastCell)
   
'  Recupera a última linha VISIVEL;
   UltimaLinha = rng.Row

'  Recupera a última coluna VISIVEL;
   UltimaColuna = rng.Column

'  Retorna o resultado em uma caixa de texto na tela;
'   MsgBox "A última linha é: " & UltimaLinha & vbCrLf & "A última coluna é: " & UltimaColuna, vbInformation

'   Posiciona na última célula à esquerda na tabela à classificar
    UltimaLinha = UltimaLinha - 4
    UltimaColuna = UltimaColuna - 11

'   Posiciona na primeira célula que há valor na coluna
    Selection.End(xlUp).Select
    Selection.End(xlUp).Select

    PrimeiraLinha = ActiveCell.Row
    PrimeiraColuna = UltimaColuna

    PrimeiraLinha = PrimeiraLinha + 2

'  Estabelece os parâmetros para a classificação da coluna ORADORES

    Range(Cells(PrimeiraLinha, PrimeiraColuna), Cells(UltimaLinha, UltimaColuna)).Select
    ActiveWorkbook.Worksheets("Empresas").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Empresas").Sort.SortFields.Add Key:=Range(Cells(PrimeiraLinha, PrimeiraColuna), Cells(UltimaLinha, UltimaColuna)), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Empresas").Sort
        .SetRange Range(Cells(PrimeiraLinha, PrimeiraColuna), Cells(UltimaLinha, UltimaColuna))
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
   
   UltimaLinha = 0
   UltimaColuna = 0
   PrimeiraLinha = 0
   PrimeiraColuna = 0
   
'   Iniciaa classificação para a segunda tabela na aba.
'  Obs. pessoal: Não entendi este comando, futuramente pesquisar o que está acontecendo aqui,
'                mas, o comando é nescessário para a execução a seguir;
   Set rng = sh.Range("A1").SpecialCells(xlCellTypeLastCell)

'  Recupera a última linha;
   UltimaLinha = rng.Row

'  Recupera a última coluna;
   UltimaColuna = rng.Column

'  Retorna o resultado em uma caixa de texto na tela;
'   MsgBox "A última linha é: " & UltimaLinha & vbCrLf & "A última coluna é: " & UltimaColuna, vbInformation

'   Posiciona na última célula à direita na tabela a classificar
    UltimaLinha = UltimaLinha - 4
    
'   Posiciona na última célula à direita na tabela a classificar
    
    PrimeiraColuna = UltimaColuna - 7

'   Posiciona na primeira célula que há valor na coluna
    Selection.End(xlUp).Select
    Selection.End(xlUp).Select
    
    PrimeiraLinhaClass = UltimaLinha
    PrimeiraColunaClass = PrimeiraColuna
    PrimeiraLinha = ActiveCell.Row
    PrimeiraLinha = PrimeiraLinha + 2

    
    Range(Cells(PrimeiraLinha, PrimeiraColuna), Cells(UltimaLinha, UltimaColuna)).Select
    ActiveWorkbook.Worksheets("Empresas").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Empresas").Sort.SortFields.Add2 Key:=Range( _
        Cells(PrimeiraLinha, PrimeiraColuna), Cells(UltimaLinha, UltimaColuna)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Empresas").Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range(Cells(PrimeiraLinha, PrimeiraColuna), Cells(UltimaLinha, UltimaColuna)), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Range(Cells(PrimeiraLinha, PrimeiraColuna), Cells(UltimaLinha, UltimaColuna))
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
'  Salvando Planilha;
   ActiveWorkbook.Save

'  Protege a planilha;
   ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

'  Apenas posiciona o cursor;
   ActiveSheet.Cells(C1).Select

'  Reativa a atualização da tela;
   Application.ScreenUpdating = True
   
'
End Sub

 

 

Pasta1.xlsx

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!