Code VBA : Instructions "Flag"
Bonjour,
Les macros du fichier ci-joint avaient été préparées à partir de celles d’un autre fichier ; je ne sais donc plus si toutes les instructions en place sont utiles ou si elles pourraient être en partie supprimées.
Quelqu’un pourrait-il donc m’expliquer les raisons et influences des instructions ayant à voir avec FLAG ?
Par exemple :
If Flag Then Exit Sub If Not Application.Intersect(Target, Range("B1")) Is Nothing Then
Flag = True
...............
Flag = False
End IfPublic Flag As Boolean
Sub test()
Flag = False
End SubA vous relire
Bonjour,
Quelqu’un pourrait-il donc m’expliquer les raisons et influences des instructions ayant à voir avec FLAG ?
Lors de l'exécution d'une macro Private Worksheet Change, tu modifies une donnée (ici par exemple B1) sur ta feuille. Le fait de ne pas prévoir une variable de type Boolean, va relancer la macro depuis le départ puisque celle-ci réagit en fonction d'un changement sur cette feuille.
Ici dans ton code, pour éviter que la macro ne soit relancée, on place juste avant les instructions une variable que l'on met à TRUE pendant l'exécution des instructions et à FALSE à la sortie des instructions.
La macro sera toutefois relancée mais le fait de mettre IF FLAG =TRUE the Exit SUB en début de macro, permettra d'éviter une exécution en boucle et de continuer le code.
Cela fonctionne comme ci-dessous dans ton code où il y a deux instructions entre FLAG = TRUE et FLAG = FALSE
Exemple pour B1:
1. If Not Application.Intersect(Target, Range("B1")) Is Nothing Then
2. Flag = True
3. exécution de la première instruction (Target.Offset(8, 0).ClearContents)
4. le code retourne au début --> PRIVATE WORKSHEET_CHANGE
5 FLAG est toujours à TRUE --> il exécute --> IF FLAG =TRUE the Exit SUB --> on sort de la macro
6. exécution de la deuxième instruction (Target.Offset(9, 0).ClearContents)
7. le code retourne au début --> PRIVATE WORKSHEET_CHANGE
6. FLAG est toujours à TRUE et exécute --> IF FLAG =TRUE the Exit SUB -> on sort de la macro
7. Flag = False
8. End If
Si souci dis moi
Amicalement
Salut Dan,
Merci beaucoup pour ta réponse. Il m'a fallu quelques heures pour la ruminer et - me semble-t-il - pour l'avoir finalement digérée
Si je t'ai bien compris, de telles instructions "Flag" ne sont nécessaires que si les différentes parties de la macro font référence les unes aux autres ; par exemple si le fait de modifier la cellule B1 va modifier automatiquement la cellule B2, alors que le fait de modifier la cellule B2 irait modifier la cellule B3 qui - si elle est modifiée - va avoir une influence sur la cellule B1. Est-ce bien exact ?
En ayant fait des essais supplémentaires, je me suis également rendu compte que la partie
Sub test()
Flag = False
End Subn'est pas vraiment utile. Peux-tu me le confirmer ?
De plus, j'ai constaté que l'on pouvait remplacer le mot Flag par n'importe quel autre mot. Sais-tu pourquoi avoir utilisé "Flag" ?
A te relire.
re,
Si je t'ai bien compris, de telles instructions "Flag" ne sont nécessaires...
Elles sont nécessaires dans une Private sub Worksheet change. Ce type de macro événementielle est déclenchée à chaque changement sur ta feuille et ce sur n'importe qu'elle cellule.
Sans l'utilisation de cette variable Flag, tu pourrais dans certains cas tourner en boucle indéfiniment.
Essaie ce code dans une feuille :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
Target.Value = Target.Value + 1
End If
End SubCe code va ajouter 1 à A1. Ce changement va déclencher l'événement change en continu (ESC pour sortir de la boucle)
Le principe général est donc de suspendre l'événement pendant l'exécution d'une instruction. Quelques fois tu verras que des codes comportent l'instruction APPLICATION.ENABLEEVENTS= TRUE qui est remise à FALSE plus loin. A éviter !
En ayant fait des essais supplémentaires, je me suis également rendu compte que la partie...
Effectivement elle ne sert pas. Je n'ai d'ailleurs pas compris pourquoi tu avais ce code. Il a surement servi à faire des tests.
Par contre juste avant tu as une instruction PUBLIC FLAG... qui elle, doit rester puisqu'il s'agit de la déclaration de variable.
De plus, j'ai constaté que l'on pouvait remplacer le mot Flag par n'importe quel autre mot. Sais-tu pourquoi avoir utilisé "Flag" ?
Flag ou une autre mot, peu importe. Tu peux mettre "yvouille" si tu veux. Le principal est de déclarer cette variable comme BOOLEAN.
Amicalement
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonsoir Yvouille, Dan
la macro "test"
Sub test()
Flag = False
End Subsert au cas ou une macro avec Flag= True planterai avant l'instruction Flag= False (ce qui arrive)
dans ce cas les Private Sub événementiels resteraient désactivés avec True,
d'où l'utilité de ce petit code pour remettre à False.
Amicalement
Claude
re,
Oui et non Claude car s'il y un plantage, la fermeture du fichier fera que Flag sera de nouveau False à sa réouverture.
Par contre dans ce code j'aurais mis Flag = False juste en fin de code juste avant End sub putôt qu'après chaque groupe d'instructions. A vérifier dans le fonctionnement bien sûr
Amicalement
Salut Dan, Salut Claude,
Merci pour vos informations fort intéressantes.
Ca commence à voler bien haut et je me sens un peu largué ... mais qu'un peu
Bonne soirée à tous deux.