Supprimer les duplicates de la gamme laisse toujours une cellule vierge à la fin

Dans le cadre d'une macro plus grande, j'essaie de copyr une plage d'une feuille vers une autre feuille, de supprimer les duplicates et de définir les valeurs uniques restantes en tant que gamme. J'ai écrit ci-dessous qui fonctionne en principe, mais après avoir supprimé les duplicates et configuré les cellules restantes comme une plage, la dernière cellule de la gamme est toujours vide. Comment puis-je ignorer cette cellule vierge, donc ma gamme est sur les valeurs uniques?

lr = Data.Cells(Rows.Count, "B").End(xlUp).Row Data.Range("B5:B" & lr).Copy Sheets("Index").Range("B1") Sheets("Index").Range("B1:B10000").Copy Sheets("Index").Range("B1").PasteSpecial xlPasteValues Sheets("Index").Range("B1:B10000").RemoveDuplicates Columns:=1, Header:=xlNo Application.CutCopyMode = False lr = Sheets("Index").Cells(Rows.Count, "B").End(xlUp).Row Set MCH = Sheets("Index").Range("B1:B" & lr) 

FYI la raison pour laquelle je copyr des valeurs de pâte avec la gamme est parce qu'il copy une colonne 'helper' qui combine 2 noms, et ma macro n'a pas fonctionné sans faire cela. S'il y a un moyen plus efficace, je suis tout l'oreille.

Comme Gary's Student a noté, il y aura une rangée vide dans la gamme codée "B1:B10000" .

Essayez d'utiliser votre dernière logique de ligne pour ajuster le 10000 – je pense que vous collez de B5 vous pouvez régler de lr à (lr+4) :

 lr = Data.Cells(Rows.Count, "B").End(Excel.xlUp).Row Data.Range("B5:B" & lr).Copy Sheets("Index").Range("B1") Sheets("Index").Range("B1:B" & (lr+4)).Copy Sheets("Index").Range("B1").PasteSpecial Excel.xlPasteValues Sheets("Index").Range("B1:B" & (lr+4)).RemoveDuplicates Columns:=1, Header:=Excel.xlNo Excel.Application.CutCopyMode = False lr = Sheets("Index").Cells(Rows.Count, "B").End(Excel.xlUp).Row Set MCH = Sheets("Index").Range("B1:B" & lr) 

Une approche très différente, mais beaucoup plus jolie, consiste à utiliser un tableau et une collection comme celle-ci:

 Sub unique() Dim arr As New Collection, a Dim aFirstArray() As Variant Dim i As Long Dim Data as Excel.worksheet Set Data = Thisworkbook.sheets("Data") lr = Data.Cells(Rows.Count, 2).End(Excel.xlUp).Row aFirstArray() = Data.Range("B5:B" & lr) On Error Resume Next For Each a In aFirstArray arr.Add a, a Next For i = 1 To arr.Count Sheets("Index").Cells(i, 2) = arr(i) Next End Sub 

Les arrays sont très rapides – j'imagine que c'est plus rapide.

J'aimerais que cette seconde scipt soit mon code original, mais c'est une adaptation. Référence:
vba: obtenez des valeurs uniques du tableau

S'il y a des cellules dans une colonne qui contiennent des Nulls avant que les duplicates ne soient supprimés; alors au less une cellule contenant un Null sera dans la colonne après la suppression des duplicates.

Vous pouvez enlever le Null par la suite.