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.
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.
Reply
Reinaldo Coral Reply:
abril 1st, 2010 at 13:32
Obrigado Cris…. só me falta mais tempo pra cuidar desse espaço…
Mas em breve terei mais novidades aqui.
Bjo
Reply
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
Reply
Reinaldo Coral Reply:
maio 21st, 2010 at 13:05
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
Reply
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.
Reply
Reinaldo Coral Reply:
maio 22nd, 2010 at 17:07
Fala Gladson..
A validação de dados não tem o recurso autocompletar não. :-(
Reply
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
Reply
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
Reply
Reinaldo Coral Reply:
junho 23rd, 2010 at 9:59
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
Reply
Priscila Reply:
junho 24th, 2010 at 11:54
Olá!
É, já tinha pensado nisso mesmo…acho que é o único jeito de resolver esse problema…obrigada pela ajuda!
Priscila
Reply