Lancement automatique d'une macro
Bonjour,
Je fais suite à un ancien post sur lequel personne n'as répondu
J'ai fais quelques recherche et j'ai avancer mais je bloque sur un truc
Je voudrais que dès qu'une valeur dans une plage de cellule change alors une macro ce lance
Sur le fichier feuille "COURSE 9 CLASSEMENT", j'ai déjà une macro qui me classe les temps quand je lui demande
mais je voudrais que si une v aleur change dans la plage K12:U16 alors la macro déjà faite se lance.
ma première macro :
Sub classementcourse()
'
' classementcourse Macro
'
ActiveSheet.Unprotect ("aviron")
ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1").Sort. _
SortFields.Clear
ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1").Sort. _
SortFields.Add Key:=Range("Tableau1[[#All],[Temps]]"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1"). _
Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveSheet.Protect ("aviron")
End Sub
Bonjour,
Ce que vous cherchez existe !
Il faut passer par les surveillance événementielle d'Excel.
Un clic droit sur l'onglet que vous voulez surveiller au niveau d'un changement de valeur de cellule, puis "afficher le code".
VBA s'ouvre sur le code de l'onglet sélectionné. A la place de "général" sélectionnez "worksheet"
A la place de Selection Change, choisir Change
Tout ce qui se trouve alors dans ce private_sub sera exécuté dès lors qu'une valeur de la feuille sera modifiée.
Target représente la ou les cellules concernées par ce changement.
Pour vous seul un :
Call classementcourse
pourrait marcher, à essayer...
Voilà pour un bon début, non ?
@ bientôt
LouReeD
Dsl mais cela ne fonctionne pas automatiquement
j'ai ceci :
Private Sub Worksheet_Change(ByVal Target As Range)
Call classementcourse
End Sub
Sub classementcourse()
'
' classementcourse Macro
'
ActiveSheet.Unprotect ("aviron")
ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1").Sort. _
SortFields.Clear
ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1").Sort. _
SortFields.Add Key:=Range("Tableau1[[#All],[Temps]]"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1"). _
Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveSheet.Protect ("aviron")
End Sub
Re
vous avez même un "intersect" ce qui est bien on surveille que les colonnes que l'on veut...
Mais le soucis vous n'avez pas accepté la modification des cellules de la zone surveillée, puisqu'il y a la protection...
Les cellules modifiables, au niveau de leur format, dans l'onglet protection, il faut "décocher" verrouillé, afin qu'elles soient modifiables même avec la protection de feuille en place.
Modification du code VBA pour la protection et déprotection
Unprotect "aviron"
Protect Password:="aviron"
Nota : Loureed ajouté mais pas pris en compte...
@ bientôt
LouReeD
le tableaux que tu as surligné n'est qu'un rappel des classement par serie.
Le classement qui se tri, est liée avec chaque course et non ce tableaux.
Ce qu'il me faut c'est que la macro detecte un changement de valeur (Le resultat, pas la formule) et face le tri.
Pour l'instant je ne demande que ça mais il va me falloir beaucoups d'autre macro comme par exemple le remplissage automatique du programme de l'aprem en fonction du matin.
Oups, petite erreur de compréhension...
Bonsoir,
Si les valeurs changent sur les feuilles "série" le tableau de la feuille "classement" doit se mettre à jour.
Donc le "change" n'est pas à surveiller au niveau de la feuilles mais DES feuilles ce qui implique de mettre le code dans "thisworkbook" avec en procédure :
Private Sub Workbook_SheetChange
Tout changement sur une des feuilles lance la procédure de reclassement de la feuille classement.
@ bientôt
LouReeD
Le code que tu as mis
Private Sub Worksheet_Change(ByVal Target As Range)
' If Not Application.Intersect(Target, Range("K12:U16")) Is Nothing Then
' classementcourse
' End If
End Sub
Sub classementcourse()
'
' classementcourse Macro
'
' ActiveSheet.Unprotect "aviron"
' ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1").Sort. _
' SortFields.Clear
' ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1").Sort. _
' SortFields.Add Key:=Range("Tableau1[[#All],[Temps]]"), SortOn:= _
' xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
' With ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1"). _
' Sort
' .Header = xlYes
' .MatchCase = False
' .Orientation = xlTopToBottom
' .SortMethod = xlPinYin
' .Apply
' End With
' ActiveSheet.Protect Password:="aviron"
End Sub
Si je comprends bien
Private Sub Worksheet_Change(ByVal Target As Range)
' If Not Application.Intersect(Target, Range("K12:U16")) Is Nothing Then
' classementcourse
' End If
End Sub
Ca fonctionne sur toutes les feuilles ou c'est lié aux 3 series?
Car lorsque je vais faire le fichier final il risque d'y avoir plusieurs courses avec des series.
Il faudrait que la macro fonctionne uniquement que sur les series concernées par le classement.
Dans ce cas il faut mettre le code change sur toutes les feuilles concernées par cette surveillance.
Au début je pensais qu'une feuille, après je pensais toutes les feuilles...
donc uniquement les feuilles de séries particulières, alors copie du code que sur ces feuilles...
Cela vous convient-il ?
@ bientôt
LouReeD
Si je crée la course 10 et qu'elle contient 2 series.
Si je modifie une valeur en course 9. Es ce que la macro va s'activé pour la course 9 et 10 ou uniquement la 9?
Cette année il y avait 5 courses qui contenaient des series.
Je ne me rappelle plus trop des numéros.
Course 9 : 3 series
Course 12 : 2 series
Course 15 : 3 series
Course 20 : 2 series
Course 25 : 2 series
Si je modifie une valeur dans la serie 1 de la course 9, es ce que la macro va s'activé pour les 5 courses?
J'inciste un peu mais j'essaie de comprendre et j'ai l'impression de ne pas comprendre la fonction de ce code.
Bonsoir,
Je viens de faire un nettoyage des macros.
Le résultat :
le tableau du classement de la course 9 qui se trouve sur la feuille "course 9 classement", se met à jour en fonction des trois feuille de série de la course 9.
La macro est lancée par une surveillance événementielle de changement de valeur sur ces feuilles
Si à l'avenir vous avez des série pour la course 10 avec trois feuilles pour les séries, il faudra mettre cette macro sur les feuilles des série de la course 10 en modifiant le nom du tableau de la feuille de classement course 10 etc...
@ bientôt
LouReed
Bonjour,
J'ai un beug quand je modifie une valeur.
Private Sub Worksheet_Change(ByVal Target As Range)
' si il y a des changements de valeur détectés sur cette feuille alors on lance la procédure
' de mise à jour du classement qui se trouve sur la feuille "course 9 classement"
' on déprotège la feuille "course 9 classement"
Sheets("COURSE 9 CLASSEMENT").Unprotect "aviron"
' on supprime les filtres éventuels du tableau1 de la feuille "course 9 classement"
ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1").Sort. _
SortFields.Clear
' on sélectionne la colonne "temps" du tableau1 de la feuille "course 9 classement"
' et on classe par ordre croissant (xlascending)
ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1").Sort. _
SortFields.Add Key:=Range("Tableau1[[#All],[Temps]]"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("COURSE 9 CLASSEMENT").ListObjects("Tableau1"). _
Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' on reprotège la feuille
Sheets("COURSE 9 CLASSEMENT").Protect Password:="aviron"
End Sub
VBA me dis qu'il y a un beug dans la section surligné
Bonjour,
Je m'en suis aperçu cet nuit mais à 1h31....
Moi même je ne comprend pas car c'est ce que me donne l'enregistreur de macro...
Faut que je "gratte" un peu...
Sans vouloir vous faire peur, je suis en train de modifier voir de repenser ce que vous vouliez faire...
Une chose, la plus importante : utiliser les formats temps d'Excel (heure:minutes:secondes,centième) afin d'éviter les nombreux concatener dans les formules, qui plus est transforme une valeur temps chronomètre en texte, ce qui fait que lorsque vous demander de classer du plus petit au plus grand 10 secondes se retrouve avant 3 seconde car par ordre alphabétique 1 est avant 3...
Je vous tiens au courant
LouReeD