Salut.
Code:
1
2
3
4
5
6
7
8
9
10
11
12 Function gettblContacts() SortContacts gettblContacts = Range("t_Contacts") End Function Function SortContacts() With Range("t_Contacts").ListObject.Sort.SortFields .Add Key:=Range("t_Contacts[Nom]"), SortOn:=XlSortOn.xlSortOnValues, Order:=XlSortOrder.xlAscending .Add Key:=Range("t_Contacts[Prénom]"), SortOn:=XlSortOn.xlSortOnValues, Order:=XlSortOrder.xlAscending End With Range("t_Contacts").ListObject.Sort.Apply End Function
Pour suivre dans la logique mise en place, il vaut mieux créer une fonction qui trie, et appeler cette fonction dans la fonction getTblContacts. C'est plus propre et tu restes dans l'idée qu'une fonction n'a qu'une seule responsabilité. GetTblContacts a la responsabilité de créer un tableau VBA avec les contacts présents dans la table, pas de trier les données. Il faut donc un fonction SortContacts qui trie les données. Cette fonction sera appelée soit avant le GetTblContacts, soit par GetTblContacts. C'est l'option que j'ai choisie ici. Elle illustre que sortir la création du tableau du flux principal était une bonne idée, puisque maintenant, la fonction getTblContacts doit proposer un tableau trié. A partir de maintenant, tout code qui aura besoin d'un tableau VBA des contacts le recevra trié. On n'a plus besoin d'y penser à chaque fois. Sa responsabilité change puisque maintenant, elle consiste à fournir un tableau trié. Le code principal, quant à lui, n'a pas été modifié d'un iota.
De plus, en procédant ainsi, tu as à ta disposition une fonction qui trie ton tableau et tu peux l'appeler d'où tu veux. Tu ne dois pas réécrire ce code spécifique, parfois plusieurs fois, au sein d'un code spaghetti chaque fois que tu en as besoin puisqu'il suffit d'appeler la fonction. Et si demain la règle de gestion est modifiée et que tu dois proposer les contacts triés par prénom puis par nom, il te suffit d'inverser les lignes d'ajout de niveau de tri dans la fonction SortContacts et tout client de la fonction bénéficie directement de la modification. Vu que tu n'as écrit le tri qu'une fois, tu ne dois le modifier qu'une fois. Et pour finir, tu peux trouver très rapidement la petite fonction qui a cette responsabilité, surtout si tu donnes des noms parlants à tes procédures et fonctions.
Il n'y a que des avantages à procéder ainsi.
Dans l'exemple proposé et pour faire simple, le tri se fait sur le nom et le prénom par ordre croissant et n'est donc pas souple. On pourrait imaginer plein de paramètres pour rendre cela plus simple, mais je ne pense pas que ce soit l'objectif.
Pour ce qui est du tri en lui-même, les tables de données proposent une meilleure gestion du tri en VBA. Je pense que la fonction que je te propose ci-dessous est assez parlante sans commentaires. Pour me connecter à la table de données t_Contacts et bénéficier des outils de tri liés au ListObject, j'utilisee la propriété ListObject de la plage avec le code With Range("t_Contacts").ListObject.
Pour ce qui est de la plage nommée, c'est un résidu d'anciens tests et elle peut être supprimée.
PS: Il n'est pas utile de reprendre des réponses complètes en citation. Si tu souhaites appuyer ta réaction sur une partie de message, ne reprends que cette partie. La lecture de la discussion s'en trouvera allégée ;)