par , 09/11/2020 à 23h32 (2239 Affichages)
Bonsoir à tous,
La méthode RemoveDuplicates peut très bien s'affecter à un tableau structuré.

1 2 3
| Sub billet_remove()
Worksheets("mafeuille").ListObjects("T_monbotablo").Range.RemoveDuplicates Columns:=Array(1,4), Header:=xlYes
End Sub |
Rien d'original si ce n'est que
- le paramètre Header doit être affecté de la valeur xlYes
- pour rappel, la méthode n'est pas sensible à la casse (majuscules = minuscules)
Mais, comme je l'ai reporté dans mon précédent billet (sur les filtres de tableau structuré), je n'aime paaaaaaaaaas le type de notation 1,4
1ère et 4ème colonnes, pour ce qui me concerne, ne veut pas dire grand chose.
Je préfère retourner la place du nom de champ (colonne) par sa propriété Index
A priori, je voulais créer un array à partir des champs souhaités, non de leur place.
Et intégrer cet array à une procédure générique.
De plus, l'array pourrait être de dimension variable.
On peut vouloir, en effet, supprimer les doublons sur un nombre de colonnes variable.
Or, le paramètre Columns de la méthode RemoveDuplicates accepte un array.
En résumé, on passe l'array, de dimension variable donc ParamArray, en paramètre de la procédure et elle est affectée au paramètre Columns.
Or:
Worksheets("mafeuille").ListObjects("T_monbotablo").Range.RemoveDuplicates Columns:=tabarray, Header:=xlYes
Je m'y suis pris à plusieurs fois mais, ainsi codée, cette méthode retourne une erreur

En fait, VBA ne considère pas l'Array défini comme un Array 
L'on doit donc évaluer cet Array soit en écrivant le nom de la méthode soit, en plus concis, (je ne suis pas fan)
Ce qui donne
Procédure d'appel
1 2 3 4 5
| Sub épure_doublons()
Call billet_remove("parent", "ville")
End Sub |
Procédure paramétrée
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Sub billet_remove(ParamArray listechamps() As Variant)
ReDim tabarray(0 To UBound(listechamps)) As Variant
Dim i As Long
With Worksheets("mafeuille").ListObjects("T_monbotablo")
For i = 0 To UBound(tabarray)
tabarray(i) = .ListColumns(listechamps(i)).Index
Next i
.Range.RemoveDuplicates Columns:=Evaluate(tabarray), Header:=xlYes
End With
End Sub |
Par avance, je vous remercie pour vos précieuses remarques.
Bonne fin de soirée à tous.