| ||||||||
Petit astucien | Bonjour à tous La colonne A (identifiant) du classeur dont je joins le lien contient des doublons . j'ai numéroté chaque occurence de chaque doublon dans la colonne numéro d'ordre, en leur attribuant un numéro de ligne. je souhaiterais à partir d'une macro en VBA , repérer pour chaque identifiant le numéro d'ordre ayant la plus grande valeur, ou en colorisant la cellule dans la colonne C, ou en ajoutant un indicateur ici une x, dans une colonne à droite. J'ai volontairement fait le travail "à la main en colorisant en jaune" les valeurs les plus élevées ou en mettant la X. J'ai trouvé sur le net des macros à cet effet qui copient dans une autre feuille les lignes contenant la valeur maximale pour chaque doublon, mais je souhaiterais effectuer ce traitement sur la feuille source. http://cjoint.com/?DACpUS018BE je suis novice en vba.
Je vous remercie de votre aide. Bonne journée à tous. | |||||||
Publicité | ||||||||
| ||||||||
![]() ![]() | Bonjour Est-ce que les "doublons" sont toujours consécutifs comme cela est sur ton exemple ? c-à-d peux t-on retrouver un "233" en A26 par exemple ? A quoi sert la colonne "Etapes" ? Faut-il aussi la remplir ? @ + | |||||||
Petit astucien | Bonjour Poussebois,
Effectivement les doublons sont consécutifs car le fichier est trié à la base par la colonne A. La colonne étapes doit rester en l'état ; le "repérage" de la valeur la plus forte du numéro d'ordre pour chaque identifiant doit s'effectuer en colorisant les cellules concernées de la colonne C ou alors par un marqueur comme une X dans la colonne D.
Un grand merci ! Bonne fin de journée.
| |||||||
![]() ![]() | Bonsoir, Tu peux obtenir le même résultat avec des formules : En C2 : =NB.SI($A$2:A2;A2) à tirer sur la colonne En D2 : =SI(A3<>A2;"x";"") à tirer sur la colonne Pour en plus colorer en jaune les "max" de C, une MFC basée sur les "x" de la colonne D. http://cjoint.com/?DACtdMjNnB5 | |||||||
Petit astucien | Bonsoir Ferrand et merci.
Effectivement, on peux tout à fait le faire par formule. Simplement j'aurais aimé le faire par VBA en collant le code dans une macro déjà existante pour éviter une saisie manuelle de formule. mon fichier fait en fait 9000 lignes mais je peux tout-à-fait incrémenter les formules et la MFC.
Au pire des cas, je ferais appel effectivement à ta solution.
En tout cas merci de ta disponibilité.
Bonne soirée.
| |||||||
![]() ![]() |
Tel que tu as posé la question, il ne me paraissait pas très intéressant de bâtir une macro pour cet usage. Si le problème est en fait plus large, il faut voir dans le nouveau contexte... Donne un peu plus de détails sur les tenants et aboutissants, et sur la macro existante (ce qu'elle fait et comment elle est lancée), on reverra les réponses... | |||||||
Petit astucien | Bonjour Ferrand, J'ai vu que tu avais travaillé tard dans la soirée vue l'heure de ton post et je t'en remercie. Effectivement ma demande peut s'inscrire à la suite d'une macro existante. Cete dernière attribue des numéros d'ordres à chaque doublon de la colonne "identifiant". Je reposte une autre version du classeur avec le code VBA dans le module du classeur. http://cjoint.com/?DADiWBwm5VW par contre un détail, pour que la macro fonctionne, la colonne où il y a les doublon ne doit pas être en colonne A mais au moins au colonne B, c'est pour cela que j'ai déplacé la colonne identifiant en B La macro s'exécute sur la feuille "Feuil2 copie" Le but est ensuite de répérer par VBA comme tu me l'as gentiment montré par formule, le numéro d'ordre maxi pour chaque identifiant, soit en le colorisant, soit avec un marqueur dans la colonne immédiatement à droite du numéro d'ordre, de type cell.Offset(, 1).value ="x".
Encore un grand merci et bonne journée. | |||||||
Petit astucien |
Re bonjour Ferrand, je pense que le code ne figure pas dans le classeur que je viens de poster. le voici ci-dessous à placer dans le module du classeur : encore merci.
Sub A_Identifiantdoublons() | |||||||
![]() ![]() | Un truc me chiffonne, c'est la façon dont se présente le tableau à traiter après saisie et avant traitement. Je déduis de tes différents posts qu'il se présente avec 2 colonnes : Identifiant et Etapes. Tu dis qu'il est trié sur la colonne Identifiant. Dans ton modèle ce n'est pas le cas, si les identifiants sont regroupés, ils ne sont ni dans un ordre ascendant ni dans un ordre descendant. La question 1 est donc : à l'issue de la saisie, est-ce que les identifiants se présentent en désordre ? Et faut-il les trier ? [Tri qui peut parfaitement être intégré au traitement.] Et dans quel ordre ? (Et les identifiants se présentent-ils toujours sous cette forme de données numériques ?) La question 2 : est-ce les étapes sont saisies en même temps que les identifiants ? Et toujours sous la forme étapes 1, 2, 3, ... ? (Ce qui paraît redondant avec l'attribution d'un numéro d'ordre distinguant les saisies d'un même identifiant). Et je ne comprends plus les nouveaux numéros d'ordre de la feuille copie qui sont, eux, l'attribution d'un numéro à chaque identifiant ! Je réserve mon avis en attendant la clarification de ces questions, car s'il y a une macro, elle doit une fois la saisie effectuée mettre le tableau dans l'état souhaité (sans qu'on ait une quelconque autre manipulation avant). Modifié par ferrand le 29/01/2014 10:49 | |||||||
Petit astucien | Ferrand, tu me vois désolé ; j'ai mis la pagaille et j'espère ne t'avoir pas fait perdre trop de ton temps. Effectivement le classeur précédent que j'ai posté est très farfelu, suite à l'éxécution de la macro qui figure dans mon précédent message et dont le code n'était pas très fiable. Je réponds à tes questions (mes réponses en gras) : Je déduis de tes différents posts qu'il se présente avec 2 colonnes : Identifiant et Etapes. Tu as raison La question 1 est donc : à l'issue de la saisie, est-ce que les identifiants se présentent en désordre ? Et faut-il les trier ? [Tri qui peut parfaitement être intégré au traitement.] Et dans quel ordre ? (Et les identifiants se présentent-ils toujours sous cette forme de données numériques ?) Les identifiants sont triés par ordre croissant mais on peut tout à fait les trier à la base dans une macro ; oui ce sont des données numériques pour l'instant mais il est question qu'une lettre soit intégrée dans l'identifiant. La question 2 : est-ce les étapes sont saisies en même temps que les identifiants ? Et toujours sous la forme étapes 1, 2, 3, ... ? (Ce qui paraît redondant avec l'attribution d'un numéro d'ordre distinguant les saisies d'un même identifiant). Oui les étapes sont saisies en même temps que les identifiants ; ce n'est toujours pas le mot étape qui revient
Je reposte donc le classeur qui se compose de 3 onglets.
http://cjoint.com/?DADnYY9vcp7
l'onglet "énoncé" est l'original. je l'ai trié par ordre croissant des identifiants. l'onglet "résultats attendus avec formule" correspond aux solutions que tu m'as proposées avec les formules et la MFC l'onglet "résultats macro actuelle" est le résultat de la macro dont je copie le module ci-dessous.
J'espère avoir répondu à tes attentes et te renouvelle mes excuses.
Voici le code de la macro, si tu veux l'éxécuter.
Sub A_Identifiantdoublons() Application.DisplayAlerts = False 'si tu as envie de lancer la macro, suppression de la feuille "résultats macro actuelle" si elle existe 'sélection de la feuille énoncé qui est la feuille de départ Sheets("résultats macro actuelle").Select Set mondico = CreateObject("Scripting.Dictionary") 'génère dans la colonne D des numéros d'ordre par identifiants sous la forme 0001-1, 0001-2 pour le 1er identifiant, 0002-1,002-2,002-3 pour le deuxième identifiant Set mondico2 = CreateObject("Scripting.Dictionary")
c.Offset(, -1) = Right(c, 1) 'on récupère le chiffre de droite (valeurs possibles = de 1 à 9) et on inscrit ce chiffre qui devient le numéro d'ordre en colonne c Range("D1").Select 'on nomme la colonne D "max de la série" en prévision du marquage du numéro d'ordre le plus fort pour chaque identifiant, si on y arrive par macro. ActiveCell.FormulaR1C1 = "il reste à coloriser les numéros d'ordre les plus forts ou à mettre un marqueur dans la colonne Max de la série"
| |||||||
![]() ![]() | OK ! Quelques courses à faire, je vois de plus près dans la soirée. Pas eu le temps de regarder le détail de ta nouvelle macro, je verrai tout à l'heure, ça me paraît plutôt long pour ce qui est à faire (on verra). Si la logique est de mettre la colonne Identifiants avant la colonne Etapes, je ne vois aucune nécessité pour faire l'inverse ! Si j'ai bien suivi tes précisions, le tri se fait uniquement sur la colonne Identifiants, ce qui laisse la colonne Etapes dans l'ordre d'inscription quel que soit le libellé de l'étape concernée. A+ | |||||||
Petit astucien | Tu as parfaitement compris et je te remercie de ton temps ; bien évidemment si tu veux reprendre ma amcro, je t'en serai reconnaissant; Comme le le disais, je ne suis pas super performant en vba.
a bientôt. | |||||||
![]() ![]() | WINNIE0931 a écrit : Bonsoir, C'était bien mon intention. J'ai été un peu retardé par un problème informatique ailleurs... Tu le deviendras ! Quelques remarques qui pourront peut-être t'être utiles : • Déclarer les variables utilisées n'est pas une perte de temps, c'est une sécurité qui évite parfois des résultats imprévus et cela permet de se repérer plus facilement dans une macro lorsqu'on sait à l'avance de quel type sont les variables. Cela peut se faire assez rapidement (en tête de procédure pour les variables locales ou en tête de module pour les variables de niveau module) sous la forme Dim nomvar As type ou en utilisant pour certains type le caractère de déclaration de type (exemple : Dim a As Integer ou Dim a% sont synonymes pour déclarer une variable de type Integer, de même Dim chaine As String ou Dim chaine$ pour une variable de type String). • Plusieurs fragments sont issus de macros enregistrées et mériteraient d'être repris pour les alléger. C'est les .Select (ou .Activate) à répétition : il est normal de les trouver dans un enregistrement qui décrit tes manipulations à la souris mais VBA n'en a nul besoin pour le même résultat et tu lui fais faire autant d'opérations supplémentaires avant d'y parvenir. C'est aussi l'énumération d'une masse de propriétés par défaut, notamment lors de mise en forme de cellules, rappelées par l'enregistreur, inutilement pour la plupart dans la mesure où tu ne les modifies pas. On peut aussi rattacher à l'enregistreur quelques autres commandes qui pourraient être ignorées dans le contexte et l'utilisation quasi systématique des arguments nommés. Il est en général plus rapide de les faire se succéder dans le bon ordre (en tenant compte le cas échéant des arguments facultatifs qu'on n'utilise pas [on ne met rien entre les virgules correspondant au rang d'un tel argument]. Pour ma part je ne les utilise que pour les copies ou déplacements de feuilles (plus facile à lire quand on a after:= ou before:=) et pour les commandes de recherche (méthode .Find) et tri (méthode .Sort) et également les filtrages, car ce type de commande a de nombreux arguments dont certains doivent être utilisés systématiquement car leur définition reste mémorisée dans Excel pour les utilisations suivantes (alors qu'on ne souhaitera pas forcément faire la même chose). Pour le reste, tu affineras et personnaliseras ton style à l'usage. Chacun a ses 'tics' ou préférences, au fil des procédures écrites et au gré des erreurs ou difficultés rencontrées. Je ne vais pas m'étendre plus et vais te proposer une méthode assez classique pour ton cas...
| |||||||
![]() ![]() | Suite : Je suis parti de ta feuille "énoncé" que j'ai un peu modifiée pour tests. J'ai rétabli Identifiants en A et Etapes en B, ainsi qu'une colonne Numéro d'ordre en C, et alignés la mise en forme des en-têtes en considérant que cela est fait au départ une fois pour toutes lors de la préparation de la feuille. J'ai aussi "retrié" les données saisies pour les mélanger de façon à pouvoir s'assurer du tri lors des tests. Je n'ai pas défait la mise en forme mais on verra les effets sur la colonne C... Donc on se situe après saisie, et on lance macro qui va faire le reste. Sub ClasserIdentifiants() Commentaires : - Tu la nommeras bien sûr comme tu l'entends, cela ne change rien. De même, à toi de voir le lancement après saisie (bouton, raccourci, ...) - Déclarations de variables : 3 variables Integer, 1 variable chaîne (String). J'ai anticipé sur le fait que les identifiants deviendront des chaînes de texte. Le fait que pour l'instant ce soient des nombres n'a aucune incidence dans la mesure où on ne les utilise pas comme nombre. - Worksheets (1) : tu peux laisser si la feuille de saisie est la première feuille du classeur, sinon mettre son nom à la place de 1. Eventuellement ActiveSheet si la macro est toujours lancée alors que cette feuille est la feuille active. - n va servir à mémoriser le numéro de la dernière ligne de saisie. J'ai repris ta détection à partir de la ligne 65000, mais note qu'on utilisait traditionnellement 65536 (nb de lignes jusqu'à Excel 2003) mais depuis 2007 il y a plus 1 million de lignes et une nouvelle habitude se dessine pour mettre: - La ligne suivante trie le tableau sur la colonne A. Et la suivante efface les colorations jaune en C (qui existeront si on traite un fichier déjà traité après une nouvelle saisie d'éléments à la suite ; j'ai opté pour la coloration qui évite une 4e colonne...) - On initialise ensuite itdf sur la valeur du premier identifiant en A2 et k à 0 [cette affectation est inutile puisque k non initialisé serait apprécié à la valeur 0, mais cela facilite la lecture] avant de lancer une boucle de 2 à n (i étant variable-compteur) pour tester à chaque ligne la valeur de la cellule en A : si elle correspond à itdf [ce qui est forcément le cas pour la première cellule testée] on incrémente k [ce pourquoi il devait être à 0 au départ] et on affecte la valeur de k à la cellule en C ; sinon, on réaffecte itdf [pour les tests suivants], on ramène k à 1, on affecte cette valeur à la cellule en C et on colore la cellule en C de la ligne précédente [qui avait donc atteint son numéro max pour l'identifiant précédent]. En fin de boucle, on colore la cellule en C de la ligne n car c'est nécessairement un max et elle n'a pas été colorée dans la boucle puisqu'il n'y avait pas de cellule suivante à tester. - Ensuite partant de l'idée qu'après la première utilisation, les éléments préexistants auront été mis en forme et n'ont plus à l'être une nouvelle fois, je lance un boucle de n à 2, qui va tester en partant de la dernière ligne si la cellule en C est bordée à droite. Si elle ne l'est pas, la ligne est à mettre en forme : pour ce faire, une macro auxiliaire est lancée. Sub MFormCell(c As Range) La mise en forme concerne la police et sa taille, les alignements et les bordures. Si j'ai oublié quelque chose, c'est à compléter. Et si on modifie la mise en forme, une macro complémentaire sera plus facile à modifier que les même éléments dans la macro principale. Je crois que j'ai fait le tour. | |||||||
![]() ![]() | J'ai failli oublier | |||||||
Petit astucien | Bonjour Ferrand, Eh bien que te dire ! un grand merci pour ton temps mais également pour tes explications et tes conseils. Je vais regarder tes explications tranquilement. Je suis un passionné d'excel et je me suis mis au VBA depuis peu mais de manière autodidacte et c'est bien le problème ; au départ copier coller de codes sur internet, enregistreur de macros et une petite marge d'autonomie depuis peu. Puis je abuser de ta gentillesse en me recommandant un ouvrage ou un site internet pour apréhender le VBA avec méthode ? comme on prend vite goût aux bonnes choses, je pense que je reviendrai assez rapidement sur le forum. Au plaisir peut être d'échanger avec toi. En tout cas encore merci ; Bonne journée.
| |||||||
![]() ![]() |
Tu trouveras pas mal de sites dédiés à Excel et VBA en faisant quelques recherches au gré de tes besoins. Tu m'excuseras de n'être pas revenu rapidement mais il m'a fallu un délai pour pouvoir fouiller dans mes archives... Pour avoir une vue d'ensemble de la programmation VBA : ftp://ftp-developpez.com/bidou/Cours/VBA/formationVBA.pdf (je mets le lien direct car je ne suis pas parvenu à le retrouver en naviguant sur le site (développez.com) (!) ; je n'ai pu trouver qu'un article plus récent du même auteur). Je te le joins aussi : http://bidou.ftp-developpez.com/Cours/VB/VB-excel2.pdf N'oublie pas l'utilité de l'aide dans l'éditeur VBA : on a régulièrement besoin en cours de programmation de vérifier des propriétés et méthodes d'un objet, une syntaxe d'appel, etc. et c'est souvent le moyen le plus rapide. Egalement bien sûr : http://boisgontierjacques.free.fr/index.htm Cela n'est pas limitatif, il y a de nombreux sites intéressants, sur lesquels tu tomberas lors de recherches ciblées sur tel ou tel aspect. Bonne continuation. | |||||||
Petit astucien | Bonjour Ferrand.
Un grand merci. je vais me plonger dans les sites que tu m'as gentiment indiqués. a bientôt. | |||||||
|
Les bons plans du moment PC Astuces | Tous les Bons Plans | ||||||||||||||||||
|