Commande "flag" - VBA

Bonjour,

j'ai écrit avec un peu d'aide la macro suivante et j'aimerais savoir quel est la fonctionnalité exacte de la commande "flag=true/false" et comment elle se décline.

Aussi, si quelqu'un pourrait m'expliquer cette ligne de macro step by step:

For i = 0 To ListBox1.ListCount - 1

Merci d'avance!

Private Sub CommandButton1_Click()

Bonjour,

Pour faciliter la lecture des codes postés, le forum est équipé d'une mise en forme automatique. Il te suffit de sélectionner ton code et d'appuyer sur au moment de le poster.

Merci d'avance.

Bonjour,

D'ordinaire on utilise les "flag" pour éviter les commandes de macro qui tournent en boucle.

Un Flag=True en début

un Flag=False à la fin de la boucle.

Puis un test du flag pour sortir avec la fonction "Exit sub"

Merci pour la réponse, mais je ne comprend pas encore tout à fait pourquoi 'flag' est ici utilisé et en quoi c'est en lien avec ma macro?

Aussi, je serais très reconnaissantes d'explication de type 'pas à pas' de la macro que j'ai envoyé, du style expliquer chaque commande, chaque fonctions et retranscrire en littéraire le but de chacune des commandes (si vous êtes à l'aise avec toutes ces variables et que vous en connaissez les fonctionnalités bien sûr), merci en avance pour les explications

Bonsoir juliak,

tu trouveras dans ce post l'« explication de type 'pas à pas' » que tu as demandée. je le précise pour Jean-Eric, sinon, il va encore râler et prétendre que je poste que des messages inutiles, juste pour faire augmenter mon compteur ; c'est pas croyable c'qu'il est devenu grincheux et Môssieur-j'me-mêle-de-tout, celui-là ! mais en fait, son opinion de gros ronchon, ça m'intéresse pas !


ton code VBA utilise .Selected ; c'est pour une liste déroulante dont on peut sélectionner plusieurs éléments à la fois ; .Selected n'est pas utile pour une liste où un seul item peut être sélectionné ; .Selected renvoie True pour un élément de la liste qui est sélectionné ; False dans le cas contraire.

flag = True : selon le contexte : flag est vrai ➯ on suppose au départ que la liste ne comporte aucun élément sélectionné.

For i = 0 To ListBox1.ListCount - 1 .. Next i : boucle i, pour parcourir un par un tous les éléments de la liste ; comme le 1er item de la liste a l'indice 0, l'indice du dernier item est le nombre d'items de la liste moins un.

    If ListBox1.Selected(i) Then
      flag = False
    End If

c'est plus simple en une seule ligne : If ListBox1.Selected(i) Then flag = False ; idem que :

If ListBox1.Selected(i) = True Then flag = False : si un élément de la liste est sélectionné, flag est mis à faux ; donc en sortie de boucle, après le Next i : flag vaut vrai si au moins un élément de la liste est sélectionné ; sinon, il vaut faux ; le nom flag traduit en français est « drapeau », car les anciens cheminots se servaient de drapeaux pour demander au conducteur d'un train d'aiguiller sa locomotive sur une voie ou sur une autre ; sur les pistes d'aéroport aussi, certaines personnes aiguillent les avions à l'aide de drapeaux pour indiquer au pilote de rouler au sol en direction de telle ou telle piste ; drapeaux de direction : idem sur un porte-avions (cf Top Gun).

flag n'est pas un mot-clé VBA, c'est juste le nom d'une variable ; tu peux le nommer autrement : flg, ou f, ou encore bidule si t'as envie.

If flag Then .. End If : idem que If flag = True Then .. End If : ah, ben voilà le test de flag ; tout vient à point à qui sait attendre ! donc c'est seulement si aucun élément de la liste est sélectionné qu'on va afficher le long message, sinon on fait rien ; le voilà, ton aiguillage, grâce au drapeau flag ; tu vois, VBA, c'est aussi des voies ferrées et des pistes d'avion ; et quand ça déraille, ou en cas de crash, faut pas s'étonner si y'a un bug !

attends, c'est pas fini : si le test est vrai, on affiche le long message, mais note qu'il y a un espace au bout, jute après l'email :

microassurance@adie.org " ; est-il en trop ? ça dépend ; oui si on veut afficher le texte « au plus juste » ; non si le programmeur a ajouté cet espace exprès pour éloigner un peu le bord droit de la boîte de dialogue afin d'avoir une marge droite un peu plus grande.

note bien que le Exit Sub est tout à fait inutile, et donc tu peux le supprimer ; mais cela seulement car y'a aucune instruction entre le End If et le End Sub ; donc même sans le Exit Sub : on sort de la sub avec le End Sub

enfin, ce serait mieux en ajoutant au début une déclaration des variables : Dim flag As Boolean, i%

i% : idem que i As Integer (en plus court ; voir dans l'aide VBA les « caractères de déclaration de type »)


voilà, j'espère que ma longue explication détaillée t'aura plu, que tu ne l'as pas trouvée trop rébarbative, et je t'excuse d'avance au cas où tu te serais endormie en chemin.

screen

coucou, Jean-Eric, j'ai ajouté cette image aussi pour toi ; qui sait ? ça te déridera peut-être un peu ?

oh, miracle ! il a souri : (il me fait marrer, le Jean-Eric, avec ses grands airs supérieurs ! )

dhany

Dhany,

merci beaucoup d'avoir pris le temps de détailler la macro step by step, ça me permet de voir les choses plus claires!

Commentaires:

Non pas d'espace en trop, tout est bon.

Merci encore

Julia

Bonjour,

@ Juliak,

Un exemple de ce pourrait être ta procédure révisée.

L'utilisation du flag n'était pas justifiée, du moins dans sa forme.

Xmenpl l'a clairement écrit.

Bon, cela a permis à Dhany de s'exprimer à tout va comme à son habitude.

Quand aurons-nous des messages clairs et concis ?

Cdlt.

8juliak-v2.xlsm (24.09 Ko)
Private Sub CommandButton1_Click()
Dim n As Long, Counter As Long, Found As Boolean, Message As String
    'nombre de valeurs dans la liste (base 0)
    'dans l'exemple de zéro à 11, soit 12 valeurs (mois)
    n = Me.ListBox1.ListCount - 1
    'on boucle tant que Counter <= 11 et que Found soit égal à true
    Do While Counter <= n And Not Found    'ou Found=False
        If Me.ListBox1.Selected(Counter) Then Found = True
        Counter = Counter + 1
    Loop
    Message = "Si l'activité n'apparait pas dans la nomenclature, il est probable qu'il s'agisse d'une activité non éligible." & vbNewLine
    Message = Message & "En cas de doute, tu peux solliciter un avis auprès du service micro-assurance: microassurance@adie.org"
    'si aucune sélection
    If Not Found Then MsgBox Message
    'si sélection
    If Found Then
        MsgBox "Choix : " & Me.ListBox1.Value
        Unload Me
    End If
End Sub

Bonjour Juliak,

Jean-Eric a écrit :

Quand aurons-nous des messages clairs et concis ?

Juliak a écrit :

merci beaucoup d'avoir pris le temps de détailler la macro step by step, ça me permet de voir les choses plus claires !

merci pour ton retour ! je savais bien que mon explication détaillée te plairait, même si la longueur de mon post déplaît à Môssieur Jean-Eric-le-grincheux ! je crois que Jean-Eric-le-gros-ronchon est comme celui qui voit la moitié vide de la bouteille au lieu de voir la moitié pleine : avec un peu (beaucoup plus) d'optimisme, au lieu de se plaindre que mon post fait plusieurs paragraphes, il devrait se réjouir que mon post ne fait pas 20 pages d'affilée ! et difficile de faire une bonne explication détaillée sans qu'elle soit longue ; c'est plutôt contradictoire !

(remarque : le gros ronchon n'est pas obligé d'lire mes posts, hein ? personne ne l'y oblige ! il peut lire que mes posts courts, ou même aucun ! )


sauf si tu as autre chose à demander, merci de passer le sujet en résolu : clique sur à droite de (coin haut droit du post); ça permet aussi de clôturer le fil de la discussion (toi seule peut le faire, car c'est toi qui a créé ce sujet).

dhany

Bonjour Pedro,

j'ai vu que toi aussi tu as apprécié mon long message détaillé sur l'explication du code VBA ; merci pour le !

comme quoi on ne peut pas plaire à tout l'monde : y'aura toujours des mécontents, comme Jean-Eric-le gros-ronchon !

dhany

Re,

Une nouvelle colère ?

Ne penses-tu pas que ma proposition est claire et concise ?

Quand vous écrivez, préférez la concision au texte long, confus et inorganisé qui passera à l’as ! Mais attention à rester clair pour atteindre avec certitude vos deux objectifs : être lu et compris.

Cdlt.

@J-E-gros-ronchon

Jean-Eric a écrit :

Une nouvelle colère ?

ce n'est pas une colère ; c'est juste une constatation ; et j't'oblige pas à lire mes posts s'ils ne te plaisent pas.


Juliak a écrit :

merci beaucoup d'avoir pris le temps de détailler la macro step by step, ça me permet de voir les choses plus claires !

Jean-Eric a écrit :

« texte confus et inorganisé »

« texte confus et inorganisé » ? pour l'instant, t'es bien le seul à le juger ainsi ; et même s'il y en avait d'autres, l'essentiel est que le demandeur Juliak ait apprécié ma réponse, même si elle est longue ; je dirai même : c'est justement pa'c'que mon explication de code est longue et détaillée que Juliak l'a appréciée ! alors ton avis m'est complètement égal !


comme ton appréciation est en totale contradiction avec l'avis de Juliak (qui est la principale intéressée) et avec l'avis de Pedro (qui m'a attribué un ♡), alors l'expression « heureusement que le ridicule ne tue pas » te va à ravir, comme un gant !

dhany

Bonjour,

Tu ne réponds pas à la question posée !...

Cdlt.

Rechercher des sujets similaires à "commande flag vba"