Copie en fonction du Temps et de la catégorie

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 :rolleyes: 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

  • test_temps.zip
    19.3 KB · Affichages: 38
  • test_temps.zip
    19.3 KB · Affichages: 37
  • test_temps.zip
    19.3 KB · Affichages: 35

job75

XLDnaute Barbatruc
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

  • spilo (1).zip
    22.9 KB · Affichages: 22
Dernière édition:

job75

XLDnaute Barbatruc
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

  • spilo (2).zip
    23.5 KB · Affichages: 23
  • spilo (2).zip
    23.5 KB · Affichages: 27
  • spilo (2).zip
    23.5 KB · Affichages: 25

spilo

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

EXTRA :D

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 :cool:

Je vais "décortiquer" tout ça, encore merci à vous.
 

Monique

Nous a quitté
Repose en paix
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

  • TempsSpilo.zip
    14.4 KB · Affichages: 27

spilo

XLDnaute Nouveau
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 :confused:
 

job75

XLDnaute Barbatruc
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

  • spilo (2).zip
    23.5 KB · Affichages: 27
  • spilo (2).zip
    23.5 KB · Affichages: 27
  • spilo (2).zip
    23.5 KB · Affichages: 28

Discussions similaires

Statistiques des forums

Discussions
312 495
Messages
2 088 971
Membres
103 995
dernier inscrit
Flodk