Rapport de message :*
 

Re: cellule clignotante

Titre du sujet : Re: cellule clignotante
par myDearFriend! le 09/04/2009 23:14:04

Bonsoir JeanSolla, le Forum,

Bienvenue sur XLpages.com !

Je vais essayer de t'expliquer le fonctionnement de ce classeur Cellules et Alertes clignotantes

Tout d'abord, il te faut quelques notions de VBA, ou au moins savoir comment te rendre dans l'éditeur VBE pour y observer le code utilisé. Je pense notamment que tu as lu cet Article qui traite de la méthode OnTime et t'expliquera le fonctionnement des procédures Clign() et StopClign(). Se sont elles qui gère le clignotement proprement dit.

Maintenant, passons plus précisément à l'objet de ta question : comment sont déclenchées ces procédures ?

Tout se passe dans la procédure évènementielle Workbook_SheetChange() que tu retrouves dans le module de code de l'objet ThisWorkbook et qui se présente comme suit :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim F As Worksheet
    If Target.Count > 1 Then Exit Sub
    If Not Application.Intersect(Target, Sh.Range("B3")) Is Nothing Then
        'S'assure que la même valeur apparaisse en B3 sur chaque feuille
        Application.EnableEvents = False
        For Each F In Worksheets
            If F.Name <> Sh.Name Then
                F.Range("B3").Value = Target.Value
            End If
        Next F
        Application.EnableEvents = True
        'Lance ou stoppe le clignotement
        If Val(Target.Value) > 9 Then Clign Else StopClign
    End If
End Sub

Je vais décomposer cette procédure pour tenter de t'expliquer...

Tout d'abord, l'évènement lui même :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
...
...
...
End Sub
C'est dans cette procédure que tout se passe... Cet évènement se déclenche lorsque l'utilisateur modifie le contenu de n'importe quelle cellule sur n'importe quelle feuille du classeur. Dès que l'utilisateur valide une modification dans une cellule, le code VBA situé à l'intérieur de cette procédure se déclenche. L'argument Sh pointe sur la feuille en cours et l'argument Target pointe sur la cellule qui vient d'être modifiée.

   If Target.Count > 1 Then Exit Sub
Avec cette ligne de code, on décide de ne prendre en compte que la modification d'une cellule isolée : Target.Count donne le nombre de cellules en cours de sélection au moment de la modification par l'utilisateur. Si la sélection contient plusieurs cellules (et non une seule), alors on sort de la procédure sans rien faire (Exit Sub).
Par exemple, si l'utilisateur sélectionne une plage de cellules et appuie sur la touche Suppr, alors Target.Count sera supérieur à 1 (c-à-d que plus d'une cellule vient d'être modifiée), on sort donc de la procédure sans continuer le traitement qui suit.

   If Not Application.Intersect(Target, Sh.Range("B3")) Is Nothing Then
       ...
       ...
       ...
    End If
Le code VBA situé à l'intérieur de ce bloc conditionnel ne sera exécuté que si Target correspond à la cellule B3 (quelque soit la feuille de calcul). Autrement dit, on ne fait le traitement qui suit que si l'utilisateur vient de modifier une cellule située en "B3" (c'est là qu'est la fameuse valeur qu'il convient de surveiller !)

       'S'assure que la même valeur apparaisse en B3 sur chaque feuille
        Application.EnableEvents = False
        For Each F In Worksheets
            If F.Name <> Sh.Name Then
                F.Range("B3").Value = Target.Value
            End If
        Next F
        Application.EnableEvents = True
L'utilisateur vient donc de modifier la cellule B3 d'une feuille de calcul. Comme le précise le commentaire en vert dans le code, ce bloc d'instructions permet de reporter cette même valeur dans chaque cellule B3 sur chacune des feuilles du classeur (pour que chaque onglet réponde au même test de valeur).

       'Lance ou stoppe le clignotement
        If Val(Target.Value) > 9 Then Clign Else StopClign
Je pense que c'est cette dernière partie qui répondra à ta question : c'est ici que la procédure Clign() ou la procédure StopClign() sera déclenchée. On teste ici la valeur de Target et on lance Clign() si cette valeur est supérieure à 9. On lancera StopClign() dans le cas contraire.

Voilà, j'espère que ça t'aidera un peu à comprendre le fonctionnement de l'ensemble...

A vrai dire, j'ai fait ce classeur Exemple il y a à peu près 3 ans... Je m'aperçois aujourd'hui qu'il conviendrait que je revois un peu ce code VBA à l'occasion. Ca demande certainement un peu d'optimisation me semble-t'il...

Cordialement,