Worksheet_selectionChange(ByVal Target As Range) utilisable avec Case ?? lenteur

pitoupef

XLDnaute Nouveau
bonjour.
Je suis novice en matière VBA. Mais à l'aide de tutoriels, forums et sites comme notre hôte, je suis arrivé à faire une petite appli sur Excel 2010.
le principe est d'avoir pleins de boutons et cases à cocher dans tous les sens. Pour une raison esthétique, j'ai plutôt mis des actions sur les cellules directement, en codant la feuille avec Worksheet_selectionChange(ByVal Target As Range). Il y en a 45 en tout. De ce fait, l'outil est devenu lent. Chaque fois que je clic sur un des choix, les macros tournent lentement. Un ami a regardé et m'a expliqué que dans mon code, tous les if sont parcourus, ce qui explique la longueur de temps. Il m'a dit qu'il y avait certainement une autre solution, en utilisant la fonction CASE ou CASE IS. j'ai bien cherché mas je ne trouve pas.
J'ai mis en pj un bout de code (il y a des if qui correspondent à des simples boutons, d'autres qui ont des conditions, et d'autres qui sont comme des cases à cocher), mais il faut imaginer qu'il y a plus de 45 if.

Quel est le moyen de, une fois que mon action est terminée (le clic de ma cellule déclenchant les macros), arriver directement au End Sub ?

merci de votre aide.
 

Pièces jointes

  • W_selectChange.txt
    1 KB · Affichages: 36

GeoTrouvePas

XLDnaute Impliqué
Re : Worksheet_selectionChange(ByVal Target As Range) utilisable avec Case ?? lenteur

Bonjour,

Tu peux éventuellement utiliser un Select Case comme ceci :

Code:
Select Case Target.Address
Case "$B$4"
    'Ton action1
Case "$M$9"
    'Ton action2
End Select

Mais il faudrait toutefois voir un fichier exemple pour avoir une réponse plus précise.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Worksheet_selectionChange(ByVal Target As Range) utilisable avec Case ?? lenteur

Bonjour Pitoupef, bonjour le forum,

Le problème n'est pas tellement au niveau des If, mais le fait qu'avec l'événement SelectionChange il se déclenche dès qu'une nouvelle cellule est sélectionnée. Dans ton code par exemple la ligne :
Code:
Cells(1, 1).Activate
va le relancer...
Tu n'as pas donné le code des macros (1, 2 et 3) mais si elles contiennent des Select ou Activate ils vont une fois de plus relancer la procédure SelectionChange.
Pour contouner ces problèmes deux propositions :
• Déterminer une plage de cellules pour limiter l'action de l'événement SelectionChange avec :
Code:
Private Sub Worksheet_selectionChange(ByVal Target As Range)
Dim PL As Range
Set PL = Application.Union(Range("B4"), Range("AF5"), Range("M9"))
If Application.Intersect(PL, Target) Is Nothing Then Exit Sub
• Utiliser une variable booléenne pour éviter de reboucler sur l'événement. Attention celle-ci est Private, au dessus de la procédure ! Je préfère ce système à l'utilisation du code : Application.EnableEvents = False / True qui peut poser problème en cas de plantage... (sauf si c'est fait par Pierrot mais j'ai oublié son code)
Ça donne le code ci-dessous (avec un Select Case mais c'est pas ça qui accélère le code le code ou si peu...) :
Code:
Private test As Boolean

Private Sub Worksheet_selectionChange(ByVal Target As Range)
Dim PL As Range

If test = True Then Exit Sub

Set PL = Application.Union(Range("B4"), Range("AF5"), Range("M9"))
If Application.Intersect(PL, Target) Is Nothing Then Exit Sub
test = True
Select Case Target.Address
    ' 1er type : si on clic sur , alors on déclenche une macro
    Case "$B$4"
        Call macro1

    '2ème type : si on clique sur AF, et que la valeur de la cellule BE2 est 2, on déclenche une macro, sion, pn déclanche une autre macro
    Case "$AF$5"
        If Cells(2, 57) = 2 Then '
            Call macro2
        End If
        If Cells(2, 57) <> 2 Then
            Call macro3
        End If
    End If

    Case "$M$9"
        If Cells(6, 57) = 200 Then
            Cells(6, 57) = 201
            Range("$M$9:$P$10").Font.ColorIndex = 2
        Else
            Cells(6, 57) = 200
            Range("$M$9:$P$10").Font.Color = -16777024
        End If
        Cells(1, 1).Activate
    Case Else
        Cells(6, 57) = Cells(6, 57)

End Select
test = False
End Sub

[Édition]
Bonjour GeoTrouvePas on s'est croisé...
 
Dernière édition:

néné06

XLDnaute Accro
Re : Worksheet_selectionChange(ByVal Target As Range) utilisable avec Case ?? lenteur

Bonjour pitoupef, bonjour le forum.

A mon avis, mais je me trompe peut-être, la lenteur vient du fait que la procédure change rencontre une inscription sur une autre cellule, donc la procédure change recommence.
Il serait souhaitable de placer au début de change:
Application.EnableEvents = False et à la fin de la procédure change:
Application.EnableEvents = True
Le mieux aurait été d'avoir un pièce-jointe avec la procédure !!
C'est ce qu'a mis Robert!!(Mais il à oublié le Application.EnableEvents = True à la fin.

A+

René
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Worksheet_selectionChange(ByVal Target As Range) utilisable avec Case ?? lenteur

Bonjour le fil, bonjour le forum,

Arf René ! Quand j'oublie l'orthographe exacte d'une expression VBA je l'écris dans le code et automatiquement, si elle est juste, elle prend certaines lettres en majuscule.
C'est exactement ce qui s'est passé avec le EnableEvents et j'ai oublié de supprimer la ligne par la suite. Merci pour ta remarque, j'ai corrigé mon code.
D'ailleurs, je disais que je n'aimais pas ce système et lui préférais une booléenne. Parce qu'il m'est arrivé que mon code plante avant d'avoir rétablie la valeur de EnableEvents à True. Après... Plus de macro événementielle ! Il faut une autre macro pour rétablir ou fermer Ecxel et le rouvrir...
 

pitoupef

XLDnaute Nouveau
Re : Worksheet_selectionChange(ByVal Target As Range) utilisable avec Case ?? lenteur

je viens de tester la solution de GeoTrouvePas, et elle fonctionne nickel. Comme je dois mettre mon appli rapidement en service, je vais laisser comme ça, mais je pense que je regarderai avec attention ce que m'a suggéré Robert et René.
Merci bien pour vos réponses ultra rapide en tous cas...

au plaisir
 

Discussions similaires

Statistiques des forums

Discussions
312 316
Messages
2 087 173
Membres
103 490
dernier inscrit
zatougraf