Olá caros leitores.
Já recebi vários pedidos de ajuda de usuários do Excel com a necessidade de mesclar valores de mais de uma tabela para uma nova lista que recebesse o conteúdo de ambas mas de forma que estes valores não viessem repetidos. Ou seja, era imperativo listar tudo que estivesse na planilha 1, por exemplo, e também na planilha 2, porém, os valores que fossem iguais, só deveriam ser listados uma vez.
Sei que esta ainda é uma dificuldade de muitas pessoas, por isso, hoje vou escrever a respeito disso. Espero que gostem deste artigo.
Para o exemplo que vamos trabalhar hoje, imaginemos a situação:
Plan1 – Contém uma listagem dos alunos do curso de Excel no turno da manhã.
Plan2 – Contém uma listagem dos alunos do curso de Excel no turno da noite.
As duas planilhas têm o mesmo formato e disposição das colunas. São elas:
Coluna A – Nome do Aluno
Coluna B – Sobrenome do Aluno
Coluna C – Idade do Aluno
Vamos criar a Plan3 para exibirmos a nossa lista de resultado com valores agrupados.
Vamos criar nosso código acessando o ambiente VBA (ALT + F11).
Insira um módulo ao projeto e crie uma sub-rotina chamada MergeDistinct e coloque o código abaixo descrito.
A rotina pode ser chamada normalmente como a uma macro comum. Menu Ferramentas > Macro > Macros… (ALT + F8) e mandar executar a macro MergeDistinct.
Sub MergeDistinct()
Dim R As Range
Dim LastCell As Range
Dim WS As Worksheet
Dim N As Long
Dim M As Long
Dim StartList1 As Range
Dim StartList2 As Range
Dim StartOutputList As Range
Dim ColumnToMatch As Variant
Dim ColumnsToCopy As Long
' Nesta coluna estão os valores que serão comparados no teste
ColumnToMatch = "C"
' Número de colunas que serão copiadas a partir da coluna de comparação
ColumnsToCopy = 1
' A lista gerada inicia nesta célula.
Set StartOutputList = Worksheets("Plan3").Range("A1")
' A primeira lista a ser mesclada inicia aqui.
Set StartList1 = Worksheets("Plan1").Range(ColumnToMatch & "1")
Set WS = StartList1.Worksheet
With WS
M = 1
' Retorna a última célula usada nesta planilha.
Set LastCell = .Cells(.Rows.Count, StartList1.Column).End(xlUp)
' Loop para comparar os valores
For Each R In .Range(StartList1, LastCell)
If R.Value <> vbNullString Then
N = Application.CountIf(StartOutputList.Resize(M, 1), _
R.EntireRow.Cells(1, ColumnToMatch).Text)
' Se N = 0, então o item ainda não foi colocado na nova lista
' então será copiado. Se N > 0, nós já o listamos
' e não faremos mais nada.
If N = 0 Then
StartOutputList(M, 1).Resize(1, ColumnsToCopy).Value = _
R.Resize(1, ColumnsToCopy).Value
' M é o número de linhas da lista agrupada. É incrementado neste loop.
M = M + 1
End If
End If
Next R
End With
' A segunda lista a ser mesclada inicia aqui.
Set StartList2 = Worksheets("Plan2").Range(ColumnToMatch & "1")
Set WS = StartList2.Worksheet
With WS
Set LastCell = .Cells(.Rows.Count, StartList2.Column).End(xlUp)
For Each R In .Range(StartList2, LastCell)
If R.Value <> vbNullString Then
N = Application.CountIf(StartOutputList.Resize(M, 1), _
R.EntireRow.Cells(1, ColumnToMatch).Text)
If N = 0 Then
StartOutputList(M, 1).Resize(1, ColumnsToCopy).Value = _
R.Resize(1, ColumnsToCopy).Value
M = M + 1
End If
End If
Next R
End With
End Sub
Para baixar o arquivo de exemplo, clique no link abaixo, no final dessa matéria.
Espero que tenham gostado.
Um abraço.
Créditos: Esse código foi adaptado do original desenvolvido por Chip Pearson
www.cpearson.com/Excel/MergeListsToDistinct.aspx
Oi…amigo sua home tá mt legal…de fácil entendimento e com mtas dicas bacanas.
Um super bjo.
Obrigado Cris…. só me falta mais tempo pra cuidar desse espaço…
Mas em breve terei mais novidades aqui.
Bjo
Muito bacana esta procurando este tipo de ajuda,copiei o codigo mas deu erro de sintase na linha:
Set StartList1 = Worksheets(“Plan1”).Range(ColumnToMatch & “1”)
O que posso ter feito de errado?
att
Altair
Caro Altair, este erro está ocorrendo porque, como você disse, você copiou e colou o código diretamente do site. Acontece que algumas configurações da linguagem HTML não são decodificadas corretamente nos módulos de programação, que são do tipo texto puro. Em breve vou colocar uma opção de cópia dos códigos no site, mas você corrigir o seu trabalho, faça assim:
– Redigite as ocorrências de aspas (“”).
– Substitua (& amp;) por apenas &.
– Substitua (& lt;) por apenas <.
– Substitua (& gt;) por apenas >.
Um abraço
Cara vc é muito inteligente. F
Ficou muito 100% está planilha
Vê se me quebra essa, fiz uma validação na plan2 de uma lista de nome na plan1 até ai beleza mas agora quero que ela se autocomplete a medida que digito os nomes isso é possivel?
Desculpe se postei no lugar errado.
Fala Gladson..
A validação de dados não tem o recurso autocompletar não. 🙁
Muito obrigado pelo esclarecimento.
Sua home é a melhor em conceito de Excel que eu já vi, vc traz dicas muitos interessantes.
Continue assim e muito sucesso para vc.
Abraços
Olá!
Parabéns pelas dicas…estão me ajudando muito.
E aproveitando, tenho o Excel 2003 e utilizei o recurso “validação” para listar algumas informações, mas quero ter a opção “auto completar” nesse campo, para facilitar a digitação. Tem alguma macro, ou código VBA que posso aplicar para ter essa facilidade?
Agradeço!
Priscila
Olá Priscila, obrigado pelo comentário.
Não existe um autocompletar específico na ferramenta de Validação. Uma forma possível para você contornar essa deficiência seria colocar os dados de sua lista-base nas células imediatamente acima das células com restrições e ocultá-las.
Dessa maneira, o recurso autocompletar da própria célula seria utilizado, ok.
Abçs
Olá!
É, já tinha pensado nisso mesmo…acho que é o único jeito de resolver esse problema…obrigada pela ajuda!
Priscila
Cara vc é muito inteligente [2]. Muito legal.
Eu vou aproveitar esse tópico para fazer mais uma pergunta. Ali em “Set LastCell = .Cells(.Rows.Count, StartList1.Column).End(xlUp)” você encontra a última célula. Eu não consegui criar uma função que faça apenas isso, encontrar a última célula que contenha algo na planilha (para depois tomar o endereço de sua linha .row e de sua coluna .column para usar como limite máximo de um for aqui). Até então usei dezenas de linhas pra ter conseguido algo parecido.
Sim. Pega a última célula utilizada na planilha. Esta célula, contudo, pode não estar escrita, mas, corresponde a referência da última linha e última coluna utilizadas na planilha.
Abç
Show de bola este código….
Já adaptei perfeitamente a minha necessidade!!!
Muito boas as dicas, poderia apresentar algumas dicas de vloockup, comparacao de planilhas, as minhas as vezes dao certo e outras nao, gostaria de me aprofundar nesse assunto. Obrigada!
Olá Lucileyne,
Dá uma lida neste artigo aqui:
https://www.exceldoseujeito.com.br/2012/02/17/aprenda-a-usar-procv-para-pesquisar-na-planilha/
Abraço