Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Copie en fonction du Temps et de la catégorie

  • Initiateur de la discussion Initiateur de la discussion spilo
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

spilo

XLDnaute Nouveau
Bonjour à Tous,

Voilà je cherche à remplir un tableau (meilleurs temps par catégories) en fonction des résultats de temps saisis sur une autre feuille...

Dans mon exemple lorsque je saisis le temps effectué par un compétiteur (feuille LISTING TEMPS), je souhaiterai qu'il se mette automatiquement à jour dans le tableau correspondant à sa catégorie (feuille MEILLEUR TEMPS), mais je ne souhaiterai que n'apparaisse dans ce tableau que les 8 meilleurs temps...

Je suis réellement un (grand !) débutant 🙄 sur excel alors si vous pouviez m'expliquer la logique à suivre vous me seriez d'un grand secours...

D'avance merci

ps: ci-joint un fichier d'exemple
 

Pièces jointes

Re : Copie en fonction du Temps et de la catégorie

Re,

J'ai revu ma copie, donc reprenons.

On peut résoudre ce problème entièrement par macro. On verra ça plus tard (moi ou un autre).

Voici une solution mixte, avec les formules en colonnes B C D de la feuille MEILLEURS TEMPS.

En colonne D les formules sont matricielles (validation par Ctrl+Maj+Entrée).

Il y a une formule différente pour chaque catégorie, à copier vers le bas (collage spécial-Formules).

Le problème, et vous l'aviez bien vu, est celui des ex aequo.

Il se résoud en ajoutant au temps un nombre très petit, différent pour chaque ligne.

Cela se fait par cette macro, à placer dans le code de la feuille LISTING TEMPS :

Code:
Private Sub Worksheet_Change(ByVal cel As Range)
Application.EnableEvents = False [COLOR="Red"]'désactive l'action des évènements[/COLOR]
For Each cel In Range([E5], [E65536].End(xlUp)) [COLOR="Red"]'recalcule toute la plage (en cas d'ajout ou suppression de lignes)[/COLOR]
  If IsNumeric(CStr(cel)) Then _
    cel = Application.Floor(cel, 1 / 864000) + cel.Row / 10 ^ 12 [COLOR="Red"]'ajoute au temps un nombre très petit, toujours différent[/COLOR]
Next
Application.EnableEvents = True
End Sub

Fichier joint.

Edit 1 : attention, il faut un accent à TOUTES CATÉGORIES

Edit 2 : j'ai modifié les formules pour éviter les valeurs d'erreur #NOMBRE! mais cela les alourdit un peu...

A+
 

Pièces jointes

Dernière édition:
Re : Copie en fonction du Temps et de la catégorie

Bonjour spilo, le forum,

Voici une solution en VBA sans aucune formule.

Elle est finalement plus simple que la précédente.

Effacez les colonnes B C D de la feuille MEILLEURS TEMPS et entrez une valeur n'importe où dans la feuille LISTING TEMPS.

La macro utilise la Feuil3 comme feuille auxiliaire :

Code:
Private Sub Worksheet_Change(ByVal cel As Range)
Application.EnableEvents = False [COLOR="Red"]'désactive l'action des évènements[/COLOR]
With Sheets("Feuil3")
[B4:E1000].Copy .[A1] [COLOR="Red"]'copie du tableau vers la cellule A1 de la Feuil3[/COLOR]
For Each cel In Sheets("MEILLEURS TEMPS").Range("A2,A11,A20,A29,A38,A47")
.[A1].AutoFilter Field:=1, Criteria1:=cel [COLOR="Red"]'filtrage en Feuil3 selon critère[/COLOR]
.[B2:D1000].SpecialCells(xlVisible).Copy .[A1001] [COLOR="Red"]'copie de la plage filtrée vers A1001[/COLOR]
.[A1001:C2000].Sort Key1:=.[C1001], Order1:=xlAscending, Key2:=.[A1001], Order2:=xlAscending, Header:=xlNo [COLOR="Red"]'tri ascendant[/COLOR]
cel.Offset(, 1).Resize(8, 3).Value = .[A1001:C1008].Value [COLOR="Red"]'copie des 8 premières lignes de la plage vers la feuille MEILLEURS TEMPS[/COLOR]
.[A1].AutoFilter [COLOR="Red"]'désactivation du filtre[/COLOR]
Next
.[A:D].Clear [COLOR="Red"]'efface tout en Feuil3[/COLOR]
End With
Application.EnableEvents = True
End Sub

A+
 

Pièces jointes

Re : Copie en fonction du Temps et de la catégorie

EXTRA 😀

Merci beaucoup Job75, c'est exactement ça...

Pour ce petit nombre ajouté il est généré aléatoirement ?

y'a plus qu'à espérer qu'il n'y ai pas plus de 8 ex aequo 😎

Je vais "décortiquer" tout ça, encore merci à vous.
 
Re : Copie en fonction du Temps et de la catégorie

Re,

En fait, dans la 2ème méthode, on peut supprimer les 2 lignes :

Application.EnableEvents = False

Application.EnableEvents = True

A+
 
Re : Copie en fonction du Temps et de la catégorie

Bonjour,

Format [mm]:ss,0 pour pouvoir afficher plus de 60 minutes

Par formule, avec plages nommées (Insertion - Nom - Définir)
Formule matricielle, à valider par ctrl, maj et entrée

La plage des temps nommée "Temps"
=DECALER($E$5;;;NB($A:$A))

Pour départager les ex aequo :
une plage "virtuelle" nommée "Temps2" :
=Temps+LIGNE(Temps)/9^9
 

Pièces jointes

Re : Copie en fonction du Temps et de la catégorie

J'ai encore un ptit soucis, j'ai modifié quelque peu le projet ...

Désormais les champs "nom" et "prénom" sont des formules ... je m'explique :

J'ai couplé avec le fichier de tous les joueurs licenciés un recherche, aussi désormais en ne saisissant que le n° de licence les champs "nom" et "prénom" sont donc remplis automatiquement sauf que désormais je n'ai plus que des #REF dans le tableau "meilleurs temps"...

J'ai donc tenté un :

Code:
Private Sub Worksheet_Change(ByVal cel As Range)
Application.EnableEvents = False 'désactive l'action des évènements
With Sheets("Feuil3")
[B4:E1000].Copy[B][COLOR="Red"]Values[/COLOR][/B] .[A1] 'copie du tableau vers la cellule A1 de la Feuil3
For Each cel In Sheets("MEILLEURS TEMPS").Range("A2,A11,A20,A29,A38,A47")
.[A1].AutoFilter Field:=1, Criteria1:=cel 'filtrage en Feuil3 selon critère
.[B2:D1000].SpecialCells(xlVisible).Copy .[A1001] 'copie de la plage filtrée vers A1001
.[A1001:C2000].Sort Key1:=.[C1001], Order1:=xlAscending, Key2:=.[A1001], Order2:=xlAscending, Header:=xlNo 'tri ascendant
cel.Offset(, 1).Resize(8, 3).Value = .[A1001:C1008].Value 'copie des 8 premières lignes de la plage vers la feuille MEILLEURS TEMPS
.[A1].AutoFilter 'désactivation du filtre
Next
.[A:D].Clear 'efface tout en Feuil3
End With
Application.EnableEvents = True
End Sub
Mais bien sur ne connaissant pas la syntaxe ça ne fonctionne pas 😕
 
Re : Copie en fonction du Temps et de la catégorie

Re,

Utilisez cette macro :

Code:
Private Sub Worksheet_Change(ByVal cel As Range)
With Sheets("Feuil3")
[COLOR="Red"].[A1:D1000].Value = [B4:E1003].Value[/COLOR] 'copie du tableau vers Feuil3
For Each cel In Sheets("MEILLEURS TEMPS").Range("A2,A11,A20,A29,A38,A47")
.[A1].AutoFilter Field:=1, Criteria1:=cel 'filtrage en Feuil3 selon critère
.[B2:D1000].SpecialCells(xlVisible).Copy .[A1001] 'copie de la plage filtrée vers A1001
.[A1001:C2000].Sort Key1:=.[C1001], Order1:=xlAscending, Key2:=.[A1001], Order2:=xlAscending, Header:=xlNo 'tri ascendant
cel.Offset(, 1).Resize(8, 3).Value = .[A1001:C1008].Value 'copie des 8 premières lignes de la plage vers la feuille MEILLEURS TEMPS
.[A1].AutoFilter 'désactivation du filtre
Next
.[A:D].ClearContents 'efface en Feuil3
End With
End Sub

Fichier joint.

A+
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…