XL 2016 Private Sub Worksheet_Change(ByVal Target As Range) - Comment enchainer

Krist-Rider

XLDnaute Nouveau
Bonjour,
J'aurais besoin d'un conseil éclairé. Dans le fichier en PJ je gère des courses (cyclo-cross, cross-country ...). Le fichier permet de lancer un chronométre au départ de l'épreuve, puis par la saisie du dossard lors du passage du coureur de gérer le nombre de tours accomplis (colonnes B, K, T, etc) et en fin d'épreuve (colonne DH) le scratch de l'arrivée. Lors le la saisie du dossard en DH le temps s'inscrit dans la colonne DS.
En fait je souhaiterais à chaque tour avoir les temps intermédiaires qui s'inscrivent de la même manière dans les colonnes G, P, AH etc. à la saisie du numéro de dossard.
Pour l'arrivée de l'épreuve, cela fonctionne avec le code VBA suivant :
Private Sub Worksheet_Change(ByVal Target As Range)
'rien ne se passe en dehors d'une saisie dans la colonne 112
If Target.Column <> 112 Then Exit Sub
'rien ne se passe si plusieurs cellules sont modifiées d'un coup
If Target.Cells.Count > 1 Then Exit Sub

If Target.Row < 1 Then Exit Sub

'donne la valeur du chrono à chaque saisie dans la colonne 112. Ne change pas une valeur de chrono déjà inscrite
If Target.Offset(0, 11) = 0 Then Target.Offset(0, 11) = Range("DQ3")

End Sub

Par contre je ne sais pas comment faire pour que cela fonctionne à chaque tour.
Merci d'avance pour votre aide, je joins le fichier d'exemple
PS. Je ne suis pas un Pro du VBA, mes codes sont certainement perfectibles !!!
 

Pièces jointes

  • CX 24102021_GestionClassement r03-2021-Beta.xlsm
    640.2 KB · Affichages: 8

herve62

XLDnaute Barbatruc
Pb réseau pas possible joindre fichier
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Target, Range("DH5:DH104")) Is Nothing Then
 
Ad = Target.Address
Col = Target.Column + 9
Rang = Target.Row

If Target.Count > 1 Then Exit Sub

Cells(Rang, Col) = Range("DQ3")

End If

End Sub
Pour la Sub RAZ : mettre Application.screenupdating=false après ton 1er message
puis remmetre à True avant ton message de fin
 

herve62

XLDnaute Barbatruc
Bon en relisant le sujet j'arrive au fichier joint , ne maîtrisant pas Le MOD (modulo) de DRANREB j'ai fais
avec plage , le résultat est le même
Pour finir ; Si déjà un temps final en DQ5 et que en DS5 un temps s'est inscrit DQ5 ne sera pas modifié donc pas le temps non plus
Je mets mon fichier , tu pourras reprendre la Sub Change pour le tien ; Il faudrait mettre aussi les Col temps de chaque tour à un format 'heure' comme 00:00:00 c'est plus parlant

PS : Bizarre tu écrases tes formules en DQ avec les résultats ? je pense que c'est à revoir
 

Pièces jointes

  • CX 24102021_GestionClassement r03-2021-Beta-HD.xlsm
    649.4 KB · Affichages: 6

Krist-Rider

XLDnaute Nouveau
Bonsoir Hervé62,
Merci beaucoup pour ton intervention rapide et efficace. C'est parfait je n'ai modifié qu'une chose : "Col1 = Target.Column + 9" devient : "Col1 = Target.Column + 11" pour ne pas écraser la formule en DQ et écrire le temps en DS. Bonne remarque pour le format, mais comme je n'avais pas su écrire les temps intermédiaires le format n'avait pas été finalisé ;-)
Pour DQ je ne fais qu'un "Range("DQ3").Select Selection.ClearContents" qui remet le chronomètre à 0. Les formules dans la colonne DQ ne sont pas touchées.
Encore un grand merci pour ton intervention
Bonne soirée
 

herve62

XLDnaute Barbatruc
Re
Bon content que ça aille , regarde aussi le screenUpdating =false quand tu effaces cela évite toutes les transitions d'écran pendant le déroulement
et le blocage de cel pour ne pas modifier l'arrivée alors ???
je sais qu'il y a une faille .... mais non réparable A toi de deviner ? c'est pour les 'Tordu" dans mon genre
car je suis tombé dessus en testant !!!!!!!
sinon pour ta gouverne je suis passé par la "validation de données"
Ton appli est bien "chiadé" , bonne continuation
 

Krist-Rider

XLDnaute Nouveau
Salut herve62,
ScreenUpdating=false c'est parfait !!!
Pour le blocage des valeurs dans les cellules (temps de chaque tour et temps à l'arrivée) je ne sais pas faire.
En fait l'idéal serait de pouvoir "figer" la cellule si elle a été implémentée une fois. Exemple concret : saisie d'un numéro de dossard érroné : le fait de modifier le numéro de dossard modifie également le temps, mais de fait, seul le numéro de dossard doit être modifié. Bon je vais y réfléchir ...
Test en grandeur nature ce WE sur un cyclo-cross ... cross the fingers !!!
Merci pour ta collaboration, ça permet de progresser.
A+
 

herve62

XLDnaute Barbatruc
Bonsoir @Krist-Rider
Pour le blocage d'une cellule tu fais Menu : données > validation des données (2 fois) là tu as options : > Autoriser : il faut selectionner Personnalisé puis tu mets ta formule
du genre = DS4="-'
Ce qui veut dire que dans ta cellule ( DH4 =5) tu n'autorise la saisie que si DS4="-" donc si DS4="00:58:34" .. ben tu peux plus changer car c'est pas = à "-"
Au début c'était "-" donc tu as pu entrer le N° de dossard le temps s'est inscrit
Je pense qu'avec ces explications tu pourras implémenter toutes les cellules de chaque tour

le fait de modifier le numéro de dossard modifie également le temps, mais de fait, seul le numéro de dossard doit être modifié.

OUh là !! ça part dans le marécage !!!! va falloir que tu réfléchisse beaucoup 🙃 vu que déjà si je pige ton chrono ......court toujours

 
Dernière édition:

Krist-Rider

XLDnaute Nouveau
Bonjour Hervé62
Pour être un peu plus clair : l'opérateur peut faire une erreur de saisie sur un numéro de dossard. Corriger postérieurement le n° du dossard ne signifie pas modifier également le temps capturé, au contraire. Le temps de passage est correct, seul le numéro de dossard est à corriger.
Validation des données n'est pas adaptée car le message d'alerte Excel fait perdre beaucoup trop de temps dans la saisie (5/6 coureurs peuvent se présenter quasi en même temps).
Bref, j'ai fais ce que tu m'as conseillé : "va falloir que tu réfléchisses beaucoup" ... J'ai donc réfléchis et la lumière est venue avec une modification du VBA :
...
If Target.Offset(0, 11) = 0 Then Target.Offset(0, 11) = Range("DQ3")
'Cells(Rang, Col1) = Range("DQ3")
et
If Target.Offset(0, 5) = 0 Then Target.Offset(0, 5) = Range("DQ3")
'Cells(Rang, Col2) = Range("DQ3")

Nouveau step : récupérer dans une synthèse les temps de passage de chaque coureur à chaque tour, je vais m'y coller prochainement ...
Bon WE
 

herve62

XLDnaute Barbatruc
Bonsoir
Slt @Krist-Rider
J'ai déjà eu le tour avec ce genre de Pb ; en fait Excel n'a pas de fonction "mémoire" de cellule donc j'enregistrais dans une cel équivalente dans un autre onglet et donc dans le Change on compare ces 2 valeurs
en fait on fait un clone ou copie d'infos ailleurs
Bonne réflexion , j'espère qu'il en découlera une solution
Bon WE aussi
 

Discussions similaires

Statistiques des forums

Discussions
298 030
Messages
1 965 289
Membres
200 895
dernier inscrit
Lisa Lisa