Macro excel VBA pour tri complexe

Résolu/Fermé
gillessimon Messages postés 10 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 8 décembre 2012 - 10 mars 2008 à 14:29
gillessimon Messages postés 10 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 8 décembre 2012 - 11 mars 2008 à 15:06
Bonjour,

J'ai un fichier excel formatté comme suit:

En colonne A, j'ai une série de numéros de concours (concours équitation) dont certains se répètent (le même numéro de concours peut se trouver sur plusieurs lignes), puis en colonne B un code de maximum 5 caractères indiquant la nature de l'épreuve (Concours Classique, Concours Libre...) et en colonne C, un code de 6 caractères max indiquant la catégorie de l'épreuve (4ème catégorie, Cycle Libre 1ère Année..), en voici un petit exemple

Col A Col B Col C
200801055 CC 4 (200801055 en colA, CC en colB et 4 en colC)
200801055 CC 5a
200801055 CC 5b
200801055 CL CL1
200802015 CL CL1
200802015 CC 4
200802015 CL CL2
200802015 CC 5
......

je suis à la recherche d'une macro excel VBA me permettant de formatter le tableau différemment de manière à ce que la concaténation des colonnes B et C soit affichée en regard d'un numéro de concours unique.

En reprenant l'exemple ci-dessus, voici ce que je devrais avoir en résultat:

Colonne D Colonne E
200801055 CC4 CC5a CC5b CLCL1 (200801055 en colA, CC4 CC5a CC5b CLCL1 en colE)
200802015 CLCL1 CC4 CLCL2 CC5
.....

Le fichier étant très grand et sa taille varie en fonction des mois et du nombres de concours/épreuves, il serait bon de faire une boucle jusqu'à apparition d'une cellule vide en colonne A, marquant alors la fin de la macro.

Par avance merci,
Gilles.
A voir également:

7 réponses

LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
10 mars 2008 à 15:38
Déjà, le bonjour d'une cavalière (Moi, c'est une gestion de complet avec Access que j'ai mise en place...)

Je procèderais comme suit.
D'abord, concaténer tes valeurs:
En colonne D :
=B2 & C2
pour obtenir CC5a
Les concaténer tant que le numéro de concours ne change pas:
=SI(A3=A2;D2 &" "& B3 & C3;B3 & C3)
Marquer dans la colonne E le changement de numéro:
=SI(A3=A4;"";"Fin")

Les formules des colonnes D et E recopiées sur toutes les lignes concernées
Et ensuite, filtrer ta liste sur la colonne E...

200801055 CC 4-------CC4
200801055 CC 5a------CC4 CC5a
200801055 CC 5b------CC4 CC5a CC5b
200801055 CL CL1----CC4 CC5a CC5b CLCL1-----Fin
200802015 CL CL1----CLCL1
200802015 CC 4-------CLCL1 CC4
200802015 CL CL2----CLCL1 CC4 CLCL2
200802015 CC 5-------CLCL1 CC4 CLCL2 CC5-----Fin

Eventuellement tu peux automatiser ça par une macro si tu dois le faire souvent, sinon tu crées une feuille modèle avec ces formules, dans lesquelles tu colles les données du mois...
0
gillessimon Messages postés 10 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 8 décembre 2012
10 mars 2008 à 17:44
Merci pour cette brillante idée mais il me faut impérativement une ligne par numéro de concours.
Je dois donc obtenir:

200801055 CC4 CC5a CC5b CLCL1 (200801055 en colA, CC4 CC5a CC5b CLCL1 en colE)
200802015 CLCL1 CC4 CLCL2 CC5

et cela par macro, mais là je ne sais pas faire....c'est là ou le bas blesse.

Merci tout de même à la cavalière de complet !!!
Gilles.
0
LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
10 mars 2008 à 21:50
Oui, mais c'est juste la suite logique. Une fois que tu as fait ça, tu écris la macro suivante:

Range("A1").Select
Selection.CurrentRegion.Select
Selection.AutoFilter
Selection.AutoFilter Field:=5, Criteria1:="Fin"
Selection.Copy
Sheets("NomDeLaFeuilleDeDestination").Select
Range("A1").Select
ActiveSheet.Paste


Je détaille:
On envoie la sélection en A1
On sélectionne toutes les données - Quelqu'en soit le nombre
On applique le filtre
On filtre sur colonne E = "Fin", donc ligne de concours entière
On sélectionne tout
On copie
On colle en A1 dans une autre feiulle.

Ca ne fait pas l'affaire?
0
gillessimon Messages postés 10 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 8 décembre 2012
11 mars 2008 à 12:36
En fait, je souhaiterais faire l'ensemble de la manipulation en une seule macro, sans traitement des donées au préalable.
Merci tout de même.

J'espère qu'un guru de la programmation VBA va pouvoir m'aider,

D'avance merci,
Gilles
0
LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
11 mars 2008 à 14:41
Fais gaffe à la façon dont tu rédiges tes messages....

Merci tout de même.

J'espère qu'un guru de la programmation VBA va pouvoir m'aider,


La voilà, ta solution:
Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 11/03/2008 par LatelyGeek
'

'
Range("D2").Select
ActiveCell.FormulaR1C1 = "=RC[-2]&RC[-1]"

While ActiveCell.Offset(1, -1) <> ""
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaR1C1 = _
"=IF(RC[-3]=R[-1]C[-3],R[-1]C&"" ""&RC[-2]&RC[-1],RC[-2]&RC[-1])"
Wend

Range("E1").Select
While ActiveCell.Offset(1, -1) <> ""
ActiveCell.Offset(1, 0).Select
ActiveCell.FormulaR1C1 = "=IF(RC[-4]=R[1]C[-4],"""",""Fin"")"

Wend

Selection.CurrentRegion.Select
Selection.AutoFilter
Selection.AutoFilter Field:=5, Criteria1:="Fin"
Selection.CurrentRegion.Select
Selection.Copy
Sheets("Feuil2").Select
ActiveSheet.Paste
End Sub

De rien,

signé
Un guru de la programmation...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gillessimon Messages postés 10 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 8 décembre 2012
11 mars 2008 à 14:59
merci pour tout et désolé pour le message précédent, il n'était pas offensant.

Gilles
0
LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
11 mars 2008 à 15:05
Ca fonctionne, au moins?
0
gillessimon Messages postés 10 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 8 décembre 2012
11 mars 2008 à 15:06
oui, merci encore mille fois,

Gilles
0