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

Rechercher des sujets similaires à "lancement automatique macro"