Removendo Valores Duplicados no Excel com VBA
In this Article
Este tutorial demonstrará como remover duplicatas usando o método RemoveDuplicates no VBA.
Método RemoveDuplicates
Quando os dados são importados ou colados em uma planilha do Excel, muitas vezes eles podem conter valores duplicados. Talvez seja necessário limpar os dados de entrada e remover as duplicatas.
Felizmente, há um método fácil no objeto Range do VBA que permite fazer isso.
Range("A1:C8").RemoveDuplicates Columns:=1, Header:=xlYes
A sintaxe é:
RemoveDuplicates([Columns],[Header]
- [Columns] – Especifica quais colunas são verificadas quanto a valores duplicados. Todas as colunas devem corresponder para serem consideradas duplicadas.
- [Header] – Os dados têm um cabeçalho? xlNo (padrão), xlYes, xlYesNoGuess
Tecnicamente, ambos os parâmetros são opcionais. Entretanto, se você não especificar o argumento Columns, nenhuma duplicata será removida.
O valor padrão para Header é xlNo. É claro que é melhor especificar esse argumento, mas se você tiver uma linha de cabeçalho, é improvável que a linha de cabeçalho corresponda a uma duplicata.
Notas de Uso do RemoveDuplicates
- Antes de usar o método RemoveDuplicates, você deve especificar um intervalo a ser usado.
- O método RemoveDuplicates removerá todas as linhas com duplicatas encontradas, mas manterá a linha original com todos os valores.
- O método RemoveDuplicates só funciona em colunas e não em linhas, mas o código VBA pode ser escrito para corrigir essa situação (veja mais adiante).
Dados de Amostra Para Exemplos de VBA
Para mostrar como o código de exemplo funciona, são usados os seguintes dados de amostra:
Remover Linhas Duplicadas
Esse código removerá todas as linhas duplicadas com base apenas nos valores da coluna A:
Sub RemoverDupsEx1()
Range("A1:C8").RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
Observe que definimos explicitamente o intervalo “A1:C8”. Em vez disso, você pode usar o UsedRange. O UsedRange determinará a última linha e coluna usadas de seus dados e aplicará RemoveDuplicates a todo esse intervalo:
Sub RemoverDups_UsedRange()
ActiveSheet.UsedRange.RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
O UsedRange é incrivelmente útil, pois elimina a necessidade de você definir explicitamente o intervalo.
Depois de executar esse código, sua planilha terá a seguinte aparência:
Observe que, como apenas a coluna A (coluna 1) foi especificada, a duplicata “Maçãs” anteriormente na linha 5 foi removida. Entretanto, a Quantidade (coluna 2) é diferente.
Para remover duplicatas, comparando várias colunas, podemos especificar essas colunas usando um método Array.
Remover Duplicatas Comparando Várias Colunas
Sub RemoverDups_MultiplasColunas()
ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2) , Header:=xlYes
End Sub
O Array informa ao VBA para comparar os dados usando as colunas 1 e 2 (A e B).
As colunas da matriz não precisam estar em ordem consecutiva.
Sub ExemploSimples()
ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(3, 1) , Header:=xlYes
End Sub
Neste exemplo, as colunas 1 e 3 são usadas para a comparação duplicada.
Esse exemplo de código usa todas as três colunas para verificar se há duplicatas:
Sub ExemploSimples()
ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2, 3) , Header:=xlYes
End Sub
Remoção de Linhas Duplicadas de uma Tabela
O RemoveDuplicates também pode ser aplicado a uma tabela do Excel exatamente da mesma forma. Entretanto, a sintaxe é ligeiramente diferente.
Sub ExemploSimples()
ActiveSheet.ListObjects("Tabela1").DataBodyRange.RemoveDuplicates Columns:=Array(1, 3), _
Header:=xlYes
End Sub
Isso removerá as duplicatas da tabela com base nas colunas 1 e 3 (A e C). No entanto, ele não organiza a formatação de cores da tabela, e você verá linhas em branco coloridas na parte inferior da tabela.
Remover Duplicatas de Matrizes
Se precisar remover valores duplicados de uma matriz, é claro que você pode gerar a matriz no Excel, usar o método RemoveDuplicates e reimportar a matriz.
Entretanto, também escrevemos um procedimento VBA para remover duplicatas de uma matriz.
Remoção de Duplicatas de Linhas de Dados Usando VBA
O método RemoveDuplicates só funciona em colunas de dados, mas com um pouco de pensamento “fora da caixa”, você pode criar um procedimento VBA para lidar com linhas de dados.
Suponha que seus dados tenham a seguinte aparência em sua planilha:
Você tem as mesmas duplicatas de antes nas colunas B e E, mas não pode removê-las usando o método RemoveDuplicates.
A resposta é usar o VBA para criar uma planilha adicional, copiar os dados para ela transpondo-os para colunas, remover as duplicatas e, em seguida, copiá-los novamente transpondo-os de volta para linhas.
Sub DuplicatasEmLinhas()
'Desative a atualização da tela e os alertas - queremos que o código seja executado sem problemas, sem que o usuário veja
'o que está acontecendo
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Adicionar uma nova planilha
Sheets.Add After:=ActiveSheet
'Chamar a nova planilha de "PlanilhaCopia"
ActiveSheet.Name = "PlanilhaCopia"
'Copiar os dados da planilha original
Sheets("DadosEmLinhas").UsedRange.Copy
'Ativar a nova planilha que foi criada
Sheets("PlanilhaCopia").Activate
'Colar transpor os dados para que fiquem em colunas
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
'Remover as duplicatas das colunas 1 e 3
ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 3), Header _
:=xlYes
'Limpar os dados da planilha original
Sheets("DadosEmLinhas").UsedRange.ClearContents
'Copiar as colunas de dados da nova planilha criada
Sheets("PlanilhaCopia").UsedRange.Copy
'Ativar a planilha original
Sheets("DadosEmLinhas").Activate
'Colar transpor os dados não duplicados
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
'Excluir a PlanilhaCopia - não é mais necessária
Sheets("PlanilhaCopia").Delete
'Ativar a planilha original
Sheets("DadosEmLinhas").Activate
'Voltar a ativar a atualização da tela e os alertas
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Esse código pressupõe que os dados originais em linhas sejam mantidos em uma planilha chamada ‘DadosEmLinhas’
Depois de executar o código, sua planilha terá a seguinte aparência:
A duplicata “Maçãs” na coluna E foi removida. O usuário está de volta a uma posição limpa, sem planilhas estranhas por perto, e todo o processo foi feito sem problemas, sem cintilação da tela ou mensagens de aviso.