Sélectionner une plage sans une certaine colonne variable

Bonjour,

Mon problème est le suivant, je voudrais sur vba pouvoir sélectionner une plage sans une certaine colonne qui dépend de la valeur d'une cellule. Je m'explique : J'ai un tableau duquel je renvoie le titre de la colonne correspondant aux plus petites valeurs placées sur une ligne correspondant à une date. Le problème est qu'avec la fonction Small, j'arrive à obtenir la 1ère, la 2ème, la 3ème, est la 4ème valeur, ainsi que les titres de colonne correspondant, mais lorsqu'il y a des doublons, la fonction continu de renvoyer le titre de la 1ère valeur qui est en double ou triple sur la même ligne. Comme si excel n'en avait rien à faire des autres valeurs qui sont identiques, et donc prenait juste la première puisque c'est la même que les autres.

J'ai tenté quelque chose sans succès, qui est de regarder à la fin de l'opération, si la cellule qui renvoie un titre est identique à la cellule précédente(sur la gauche) et donc ensuite de faire en sorte que la plage sélectionnée pour petite.valeur de contienne pas la 1ère valeur identique aux autres(car c'est celle qu'il prend par défaut).

EDIT: C'est même encore plus bizarre, pour la date 14/08/2015, la fonction de prend même pas en compte la 1ère plus petite valeur(qui est en triple sur la ligne), et reste sur la deuxième plus petite pour tous les indices. En changeant la 1ère plus petite valeur, cela fonctionne fort logiquement, mais uniquement pour le 1er indice...

J'espère que l'explication n'est pas trop tordue, je met le fichier en pièce jointe, la macro c'est mini(), il y a déjà un bouton pour l'activer.

Je remercierais fortement ceux qui pourraient au moins m'aiguiller, histoire que je me débloque. Je ne suis pas très très bon en vba mais en même temps j'ai appris ça en 2 semaines pour mon taf, donc il y a plein de subtilités qui m'échappent...

21test-3.xlsm (25.52 Ko)

Salut,

Une autre approche dans le fichier ci-joint.

28test-4.xlsm (24.99 Ko)

Cordialement.


Et une variante avec laquelle tu sélectionnes la date désirée avant de lancer la macro par le bouton 'Ter'.

20test-5.xlsm (23.27 Ko)

Salut,

Merci pour cette réponse! je vais plutôt prendre le test(4) qui correspondrait mieux à mon fichier où ce sera avec une cellule qui sera égale à la date choisie sur un userform(calendar), ou j'utiliserais tout simplement la valeur du calendar.

Par contre pourrais tu m'expliquer cette ligne ? : Range("BA1:BB" & Rows.Count).Sort Key1:=Range("BB1"), Order1:=xlAscending, Header:=xlNo

J'ai compris que ça mettait dans l'ordre mais je ne comprend pas les termes, comme Rows.Count et Header:=xlNo.

J'imagine que Key1:=Range("BB1") est la référence utilisée pour ce tri et Order1:=xlAscending signifie "par ordre croissant"?

Par contre, est-ce que cette fonction se débrouille bien( dans le sens, est-ce que ça fige ou pas le pc pendant un certain moment) lorsque les données se retrouve par centaines sur un onglet, donc par milliers sur plusieurs onglets?

Salut,

J’inscris provisoirement les données de la ligne concernée dans les colonnes BA et BB et je trie ces colonnes par cette ligne de code que tu mentionnes.

La plage triée est les colonnes BA et BB et la référence de tri est effectivement la cellule BB1 (je présume qu’il faut toujours indiquer la première cellule de la colonne servant de base de tri). Afin d’indiquer la plage j’ai utilisé l’instruction Range("BA1:BB" & Rows.Count) mais je présume que j’aurais également pu indiquer Range("BA:BB").

Rows.count compte le nombre de lignes de la version d’Excel utilisée et correspond donc à la dernière ligne possible. Pour une version Excel 2003, ça correspond à 65'536 lignes alors que pour une version Excel 2007 et postérieurs, ça correspond à 1'048'576 lignes.

Dans ton cas précis, j’aurais pu ne trier que les 6 premières lignes puisqu’il n’y en aurait pas plus selon tes premières informations, mais si finalement tu augmentes le nombre de données à trier, mon instruction n’a pas besoin d’être modifiée.

Header:=xlNo veut dire qu’il n’y a pas de titre dans les colonnes à trier. Si tu avais un titre (qui ne doit pas être compris dans le tri), tu indiquerais Yes et la cellule de référence (comme dans ton cas la cellule BB1) serait la cellule du titre.

tinky31 a écrit :

Order1:=xlAscending signifie "par ordre croissant"?

Effectivement. Le contraire = Descending

Pour toutes ces questions, tu pourrais également placer ton curseur le terme inconnu et taper F1. L’aide Excel qui s’ouvre alors est souvent très, très intéressante. Mais cherche de l’aide par exemple sur le mot Header plutôt que sur xlNo.

Je présume que l’instruction de tri ne devrait pas ralentir ta machine terriblement, mais ça dépend bien entendu de la rapidité de celle-ci. A tester.

Si tu as l’impression qu’un code est ralenti parce que trop de mise à jour d’écran sont effectuées en cours de route, ajoute au début du code l’instruction Application.ScreenUpdating = False.

Amicalement.

Re,

il y a un problème en fait, c'est que je ne veux que les 4 plus petites valeurs, or ici cette fonction prend en compte toutes les valeurs de la ligne. Il ne me faudrait en fait que les 4 titres correspondant aux 4 plus petites valeurs à la date choisie, car c'est ceux que je vais afficher sur une page de synthèse qui montrera donc les 4 plus petites valeurs et leurs titres pour chaque onglet.

Il me semble que si ça compte toutes les valeurs pour une date dans chaque onglet, sachant que je vais avoir plus de 10 onglets différents, avec environ 40 colonnes, ça va prendre hyper longtemps ... C'est d'ailleurs pour ça que j'utilisais la fonction Small pour faire incrémenter l'indice jusqu'à 4 seulement.

J'essaie aussi de l'intégrer à mon code en remplaçant range("M5") par Calendar1 et ça me dit "impossible de lire la propriété "match" etc"

Bref je galère toujours autant...

Veux-tu que je mette le code global de ma page de synthèse pour que tu voies mieux ce que je veux faire?

Re-bonjour,

Tes remerciements pour mes explications détaillées sont tout acceptés

tinky31 a écrit :

Veux-tu que je mette le code global de ma page de synthèse pour que tu voies mieux ce que je veux faire?

Il vaudrait mieux que tu me fournisses ton fichier complet.

Amicalement.

Salut,

Merci de rester sur le Forum pour poursuivre la discussion.

tinky31 a écrit :

Bonjour,Navré je suis tellement sur mon truc que j'en oublie que tu donnes de ton temps pour moi! Merci beaucoup pour tout ça, dans tout les cas ça me servira, mais je me retrouve bloqué quand même au final. Mon fichier est censé être confidentiel, donc je sais pas vraiment si je peux l'envoyer comme ça...

Si ton fichier est confidentiel, essaie tout d’abord de le ‘’déconfidentialiser’’ en n’y laissant que le nombre de lignes nécessaires à la démonstration de ton problème et en remplaçant les données sensibles par des données bidons. Nom 1, Nom 2, Nom 3 …. remplacent par exemple aisément des noms de clients.

Si tu ne peux vraiment pas agir de la sorte, fournis-moi alors ton fichier en privé et reste sur le Forum pour nos échanges.

Amicalement.

Salut,

Finalement j'ai réussi à l'adapter à mon fichier, bien que cette méthode nécessite de prendre toutes les valeurs de la ligne traitée, donc actuellement en faisant pour 2 onglets cela prend un peu plus d'une seconde. J'espère que ça ne va pas trop augmenter avec le nombre d'onglet car ça risque d'être assez énervant pour l'utilisateur. En fait j'ai mis un calendrier, et avec une fonction calendar_afterupdate cela change donc les valeurs à chaque fois qu'on change de date.

En tout cas merci beaucoup pour tes réponses, j'ai pu finaliser mon fichier comme ça.

Salut,

tinky31 a écrit :

J'espère que ça ne va pas trop augmenter avec le nombre d'onglet car ça risque d'être assez énervant pour l'utilisateur

Si un utilisateur te casse son ordinateur sur la tête, n’attends pas qu’un deuxième en fasse de même, mais fournis-moi ton fichier

Chaleureusement.

Rechercher des sujets similaires à "selectionner plage certaine colonne variable"