Réaliser une petite boucle en vba

vieuxray -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonsoir a tous et toutes , forum bonsoir,



Je souhaiterai apporter un plus a mon programme en l'agrémentant d'un bargraff
mais il me faut faire une boucle (du moins, je pense) et c'est la ou je ne sais pas faire
d'où mon appel a vos connaissances.

J'ai mis des explications et modèle a l'intérieur du fichier ci-joint sur le lien ci-dessous.

https://www.cjoint.com/c/HJlqevG5AMz

Merci a vous pour votre aide, je vous souhaite la bonne soirée.

Cdlt VieuxRay

18 réponses

Résumé de la discussion

La discussion porte sur l'ajout d'un bargraph dans une interface VBA sous Windows 10 et Excel 2007, en utilisant une boucle pour visualiser l'avancement avec des labels. Des solutions expliquent comment rendre visibles des labels via une boucle For i = 5 To 36 et comment manipuler les contrôles dans des blocs Sub Blink et Sub StartBlink pour synchroniser l'affichage. D'autres interventions clarifient les notions de progression, en détaillant l'avancement de la progressbar et la longueur du bargraph, ainsi que des conseils sur l'accessibilité et le renommage des formulaires. En dernier, des échanges évoquent des alternatives de minuterie et des choix de nommage pour améliorer la lisibilité du code, avec des tests et des ajustements prévus à venir.

Bobot (l'IA à votre service)
  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    je pense qu'il suffit d'ajouter
    Dim i As Integer
              For i = 5 To 5 + (36 - 5) * (.ProgressBar1.Value - .ProgressBar1.Min) / (.ProgressBar1.Max - .ProgressBar1.Min)
                .Controls("Label" & CStr(i)).Visible = True
            Next i

    avant le end with dans Sub Blink(), et
    Dim i As Integer
         For i = 5 To 36
            .Controls("Label" & CStr(i)).Visible = False
         Next i

    avant le end with dans Sub StartBlink()
    1
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    (.ProgressBar1.Value - .ProgressBar1.Min), c'est l'avancement dans la progressbar
    (.ProgressBar1.Max - .ProgressBar1.Min), c'est la longueur de la progressbar
    en divisant l'avancement par la longueur, on obtient un nombre entre 0 et 1, qui indique la progression dans la progressbar
    (36 - 5), c'est la longueur du bargraph
    en multipliant cette longueur par la progression dans la progressbar, on trouve l'avancement dans le bargraph, auquel on ajoute 5, qui est le début du bargraph
    1
  3. vieuxray
     
    Salut yg_be,

    Merci pour ta réponse et pour le code, c'est gentil a toi.

    Sinon tout fonctionne bien, rien a dire, enfin si, merci LOL

    Tu peux svp détaillé la formule, je ne comprends pas trop son déroulement, jamais fait de maths.

    Passe une bonne journée et juste avec un peu d'avance bon W-end.

    Cdlt Ray


    Dim i As Integer
    For i = 5 To 5 + (36 - 5) * (.ProgressBar1.Value - .ProgressBar1.Min) / (.ProgressBar1.Max - .ProgressBar1.Min)
    .Controls("Label" & CStr(i)).Visible = True
    Next i
    0
  4. vieuxray
     
    Salut yb_be,

    Merci pour toutes ces explications, je regarde ca de près.

    Dit moi, svp, je vais avoir besoin d'écrire dans mon USF1 ainsi que les Labels etc etc

    Comment je peux déclarer en variable Public pour tout mon projet l'USF1 afin de pouvoir réduire le code et d'éviter de me répéter Ex: UserForm1. etc etc

    Je pensais Me=UserForm1 ou Me remplacerai UserForm1 plus simple a écrire et j'ai déjà vu ça dans différents codes sur le net.
    J'ai chercher j'ai trouver du code mais je ne sais pas comment bien procéder et mettre ou les bons codes.

    Merci a toi,

    Cdlt Ray

     
    UserForm1.Label2 Je pensais Me.Label2= etc etc
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      pourquoi ne pas changer le nom de UserForm1?
      Me est un nom réservé.
      0
    2. vieuxray
       
      Re

      J'ai remplacer Userform1 par Me

      j'ai relancer mon programme et j'ai l'erreur suivante (Utilisation incorrecte du mot clé Me)
      j'ai regarder dans l'aide et ça me dit de ne pas mettre Me dans un module qui n'ai pas prévu a cet effet.

      Donc baht je sais plus du coup

      Quand pense tu svp ???

      A plus tard et merci

      Cdlt Ray
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > vieuxray
         
        Me étant un nom réservé, il ne faut donc pas l'utiliser.
        Je t'avais suggéré de changer le nom de UserForm1. Tu peux par exemple le changer en U1, via les propriétés du formulaire.
        Je pense qu'il s'appelle UserForm1 parce que tu as choisi de lui laisser ce com au moment de le créer.
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. vieuxray
     
    ok Merci pour ta réponse bien compris.

    Lors de la création je voulais que l'USF1 soit considérer comme Public de façons a ce quelle soit accessible dans tout le projet sans avoir a écrire tout le temps "Userform1" qui pour moi rends le code pas très lisible selon les lignes de codes.

    Donc du coup elle restée sous son nom d'origine, je me méfierai la prochaine fois.
    Je vais essayer de la baptisée U1 comme tu me le conseille c'est très bien et court.

    je te tient au courant.

    Cdlt Ray
    0
  7. vieuxray
     
    Voila j'ai fait comme conseillé

    j'ai mis (U1) pour le nom de l'Userform
    j'ai mis le nom (Dépenses) dans le bandeau bleu de (l'U1)

    ça a l'air de fonctionner pas de plantage aux essais
    Mais je ne sais pas si (U1) est accessible dans tout le projet donc Public si je puis dire ainsi.

    Comment svp je peux tester si (U1) est bien accessible

    Merci pour ton aide a plus tard

    Cdlt Ray
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      U1 a exactement la même accessibilité que UserForm1 avait avant.
      si tu as un doute, essaie dans un nouveau module.
      0
    2. vieuxray
       
      Salut yg_be,

      Désoler pour le retard de ma réponse,

      Mais merci pour ta réponse, j'ai donc fait l'essai conseillé et c'est bon pour moi ça fonctionne bien, pas de soucis.

      Pour le bargraff couleur, ça fonctionne mais un truc qui fait môche très môche les labels de couleurs se déplacent par deux ou trois voir quatres en même temps.

      Serait t'il possible svp de les faire évoluer un par un en modifiant la formule.

      Merci pour ton aide, je te souhaite un très bon W-end.

      Cdlt Ray
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > vieuxray
         
        sans doute parce que la technique utilisée (basée sur Now) donne une précision de l'ordre d'une seconde.
        pour être certain, essaie en remplaçant le 0 par 1 dans le round.
        0
  8. vieuxray
     
    Salut

    Merci de ta réponse.

    J'ai fait l'essai que tu dit remplacer le 0 par 1 dans round.

    Mais aucun changement même en jouant sur la durée.

    Ce qui m'ennuie c'est qu'on voie franchement l'avancée des labels couleurs mais par paquets.

    Tu crois qu'un autre code de minuterie serai plus malléable.

    Bonne journée.

    Cdlt ray
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      même en ayant une durée comme 50 secondes?
      la minuterie n'est pas en cause, c'est la technique utilisée pour mesurer le temps. d'autres techniques existent.
      0
  9. vieuxray
     
    Ok je comprends, dommage cette tempo que avais trouver était bien
    car elle permets d'avoir du clignotement rapide et réglable
    comme la durée, la fréquence etc etc

    Donc comment peut t'on faire alors, dit moi svp s'il faut que j'en cherche une autre ???

    Bon app a plus tard et merci

    Cldt Ray
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      as-tu le soucis même en ayant une durée comme 50 secondes?
      que veux-tu dire par "j'en cherche une autre"?
      0
  10. vieuxray
     
    Re,

    Alors essai avec 50 secondes = les 3 premiers labels bleus démarrent puis affichage 2x2 avec une raté 2x3.

    Essai avec 60 secondes presque bien = 2 labels bleus démarrent puis affichage 1x1 avec toutefois 2 ratés aléatoires.

    (R) j'en cherche une autre tempo qui pourrai être plus facilement utilisable vu que je souhaiterai de courtes tempos environ 5 a 15 secondes de durée maxi mais une fréquence plus ou moins rapide mais réglable.

    merci du coup de main

    Cdlt Ray
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      et tes labels vont toujours de 5 à 36?
      0
  11. vieuxray
     
    Non j'en ai rajouter 4 ils vont de 5 a 40 mais sur une autre version, la même mais cette version me sert a faire les essais au cas ou je planterai, comme ca toujours un secours.

    Mais je fais les essais sur les labels de 5 a 36 version officielle
    L'effet est le même avec labels de 5 a 36 ou bien labels de 5 a 40

    je suis ça rigoureusement sinon si tu bosses de ton coté et moi du mien, va y avoir des soucis.

    T'inquiète pas c'est déjà très gentil a toi de m'aider, je ne vais pas aller chercher les ennuies LOL

    Merci a toi
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      ne ne comprends pas qu'avec 50 secondes et 32 labels, tu aies ceci: "les 3 premiers labels bleus démarrent puis affichage 2x2 avec une raté 2x3".
      0
  12. vieuxray
     
    En fait j'observe le plus souvent que des moments c'est aléatoire des fois ca corresponds a la durée puis ça redéconne puis ça retombe pil poil même en modifiant la durée ça parait bien marcher plusieurs fois puis zut c'est plus bon.

    les labels sont tous identiques sauf la couleur bien entendu leurs captions égal 0 propriété identique et rien de changer au niveau code

    je ne sais pas pourquoi ça tourne pas rond

    Pur moi c'est la formule qui devrai s'adapter selon la durées avec un même nombre de labels juste la durée peut être mofifier

    a plus tard merci
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      chez moi, le comportement est toujours le même. le soucis, c'est que l'avancement ne se fait qu'une fois par seconde, donc c'est saccadé quand la durée en secondes est inférieure au nombre de labels. la barre de progression est également saccadée, pour les mêmes raisons.
      je pourrais modifier pour éviter que cela ne soit fait qu'une fois par seconde.
      chez toi, je suspecte que l'ordi fait autre chose et que Excel ne puisse pas travailler: le clignotement est-il bon?
      0
  13. vieuxray
     
    Ok je comprends bien.

    J'ai un Pc super équipé pas de disque dur mais des SSD, carte graphique 4 gigas processeur 4gigas 16 gigas de ram rapide.

    Mon Pc ne fait rien sans que je le vois par l'intermédiaire du gestionnaire des taches.

    Je suis sous Windows 10 et le pack office 2007 installer d'où mon Excel 2007.

    Je ne joue a aucun jeu sauf mon kéno LOL et il ni a que moi qui se sert de mon PC ma famille a chacun le sien LOL.

    Le clignotement est correct j'ai déjà essayer plusieurs codes ici ou la sur le net et pas de soucis.

    Perso moi, je te rejoints a tes explications que tu me dit, a savoir que
    la minuterie n'est pas en cause, c'est la technique utilisée pour mesurer le temps. d'autres techniques existent.

    Je connais les ordis les démontés / remontés ne me pose aucun problème.

    Avant je faisais des programmes en Basic rien avoir avec VBA

    A 66 ans plus envies de longues études alors je me débrouille bien mais c'est aussi grâce aux forums et aux gens bénévoles qui partage leurs savoirs, tout comme toi, merci pour ça.

    A plus tard Ray
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      suggestion d'une autre technique pour mesurer le temps plus précisément:
      ajouter dans un module la fonction suivante:
      Function actuellement() As Date
      Dim cejour As Date
      cejour = Date
      actuellement = cejour + Timer / 24 / 60 / 60
      Do While cejour <> Date
          cejour = Date
          actuellement = cejour + Timer / 24 / 60 / 60
      Loop
      End Function

      et remplacer
      Maintenant =now
      par
      Maintenant = actuellement()

      en faisant cela, plus de saccade chez moi, même en 2 secondes.
      0
  14. vieuxray
     
    Re

    Une petite vidéo, de 8Mo c'est pas terrible mais bon, ça reste dans le domaine du visible.

    J'ai filmer deux fois la séquence de l'affichage.

    https://www.cjoint.com/c/HJnqyWsJ1Rz

    avec les paramètres suivants

    With U1
    .Label3.Caption = Round((m_fin - Maintenant) * 24 * 3600, 0)
    .ProgressBar1.Value = .ProgressBar1.Max - .Label3.Caption

    For i = 5 To 5 + (40 - 5) * (.ProgressBar1.Value - .ProgressBar1.Min) / (.ProgressBar1.Max - .ProgressBar1.Min)
    .Controls("Label" & CStr(i)).visible = True
    Next i
    .Repaint
    End With
    End If
    End Sub

    Public Sub StartBlink()
    Dim Fréquence As Long, Duree As Long, i As Integer
    Fréquence = 100: Duree = 8 'Fréquence de clignotement, en millisecondes et Durée du clignotement, en secondes

    With U1
    .Show 0 'Ouvre l'USF1 (0) Pour que les feuill


    bonne soirée a toi

    Cdlt Ray
    0
  15. vieuxray
     
    Bonjour yg_be,

    Merci pour ta réponse et ce nouveau code effectivement c'est moins saccadé.

    Sur un temps de durée de 2 secondes tous le labels sont affichés en deux fois.
    Sur un temps de durée de 60 secondes tous les labels sont affichés plus ou un par un.

    Je serai curieux de savoir comment ils font pour affichés 35 labels en 2 secondes une a une, sur ça doit être très rapide.

    Mais sur 60 seconds du coup faut affichés les 35 labels minimum 2x2.

    Je ne sais pas si je suis dans le vrai mais bon.

    Bon dimanche a toi et merci beaucoup.

    Cdlt Ray
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      ta vidéo confirme mon observation: l'affichage des labels est saccadé parce qu'il ne change qu'une fois par seconde.
      avec le dernier code proposé, l'affichage devrait changer à chaque clignotement, donc être presque parfaitement fluide.
      je ne comprends pas bien ton dernier message.
      "tous les labels sont affichés en deux fois": donc très saccadé, ou c'est bien?
      pour afficher 35 labels en 2 secondes un par un, il suffit de diminuer le temps entre 2 clignotements.
      pourquoi écris-tu: "60 seconds du coup faut affichés les 35 labels minimum 2x2"? ce n'est pas du tout ce que j'observe.
      0
  16. vieuxray
     
    Salut yg_be,

    Donc je te confirme bien que c'est moins saccadé.

    J'ai accoler tous les labels les uns au autres, du coup je me retrouve avec une barre multicolore.

    J'ai fait l'essai comme ça, hé bien figure toi que je trouve que c'est très fluide et même donne un affichage propre.

    Par contre, je voudrais bien virer le progressBar pour ne garder que les labels.

    Mais je n'arrive pas a recoder correctement, il y a toujours quelque chose qui ne va pas.

    Ma question du jour: Le progressBar1 est t'il indispensable pour faire fonctionner les labels.

    Et les labels peuvent t'ils fonctionner seuls. ?

    Pour le reste du message laisse tomber, je crois bien avoir dit des conneries.

    Bon début de semaine a toi et merci pour ton aide.

    Cdlt Ray
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      exemple sans progressbar:
      Option Explicit
      
      Const Duree As Integer = 10  'Durée du clignotement, en secondes
      Private Declare Function SetTimer Lib "User32" (ByVal hWnd As Long, ByVal nIDEvent As Long, _
                                           ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
      Private Declare Function KillTimer Lib "User32" (ByVal hWnd As Long, _
                                           ByVal nIDEvent As Long) As Long
      Public m_TimerID As Long, m_fin As Date
      
      Private Sub Blink()
                Dim xCell As Range: Dim maintenant As Date
      Dim Ecoule As Single
                      maintenant = actuellement()
                Set xCell = Range("F2")
      With ThisWorkbook.Worksheets("Feuil1").Range("F2").Font
           If xCell.Font.Color = vbRed Then
              xCell.Font.Color = vbWhite
        Else
              xCell.Font.Color = vbRed
           End If
      End With
      If maintenant > m_fin Then
          Unload usf1                                         'Ferme l'USF1
          Call StopBlink                                               'Appel macro arrèt clignotement "STOPBLINK"
      Else
          With usf1
                Ecoule = Duree - (m_fin - maintenant) * 24 * 3600
                .Label3.Caption = Round(Duree - Ecoule, 0)
                Dim i As Integer
                For i = 5 To 5 + (36 - 5) * Ecoule / Duree
                  .Controls("Label" & CStr(i)).Visible = True
              Next i
          End With
      End If
      End Sub
      Public Sub StartBlink()
               Dim Duration As Long
      Duration = 50                 'Fréquence de clignotement, en millisecondes
      With usf1
            .Show 0               'Ouvre l'USF1 Pour que les feuilles de calcul restent accessibles passer la boite de dialogue en mode non modal La propriété ShowModal doit être égale à False.
            .Label1.Caption = "ATTENTION" + Chr$(13) & Chr$(10) + "Une erreur de formule est survenue" + Chr$(13) & Chr$(10) + "Veuillez réparer en recopiant la formule" _
                     + Chr$(13) & Chr$(10) + "avec la poignée en croix de la cellule" + Chr$(13) & Chr$(10) + "du dessus ou du dessous, svp."                                       'Affiche message Label1
           Dim i As Integer
           For i = 5 To 36
              .Controls("Label" & CStr(i)).Visible = False
           Next i
      End With
         
         m_fin = Now + TimeSerial(0, 0, Duree)
      If m_TimerID = 0 Then
          If Duration > 0 Then
               m_TimerID = SetTimer(0, 0, Duration, AddressOf Blink)
            If m_TimerID = 0 Then
              MsgBox "Echec de l'initialisation du minuteur."
            End If
      Else
              MsgBox "La durée doit être supérieure à zéro."
          End If
        Else
              MsgBox "Timer déja démarré."
        End If
      End Sub
      
      Public Sub StopBlink()
               If m_TimerID <> 0 Then
                 KillTimer 0, m_TimerID
                 m_TimerID = 0
          Else
                MsgBox "Timer non actif."
              End If
      End Sub
      
      
      
      
      
      0
  17. vieuxray
     
    Salut yg_be,

    Désolé pour la réponse tardive, RDV ce matin contrôle de santé.

    Tout va bien moi et les Labels LOL

    Alors j'ai adapter et maintenant c'est bon j'ai virer le progressBar

    me reste les Labels qui ça fonctionne bien et je t'en remercie bien.

    Je te fait une chtite vidéo après déjeuner bon app a plus tard

    Saccade = zéro nickel mème avec durée modifiée

    Encore merci pour la modification

    Cdlt Raymond
    0
  18. vieuxray
     
    Salut

    Voici la vidéo promise 13Mo et j'ai filmer deux fois les labels
    j'ai filmer également un soucis que je rencontre sur l'ensemble de mon fichier
    je t'en parle après si tu veux bien svp regarder.

    je te redonnerai mon fichier tel qui l'ai actuellement, mais chaque chose en son temps.

    Les labels ne sont plus pertubés par le progressBar et ça m'a l'air de fonctionner très bien.

    https://www.cjoint.com/c/HJpmngsEf3z

    Je te parle du petit soucis que j'ai filmer et qui se trouve après les deux vidéos des labels ceci quand tu sera dispo et si tu veux bien.

    Bonne après midi et merci a toi

    Raymond
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je suggère de créer plutôt un nouveau sujet pour ton nouveau petit soucis.
      0
  19. vieuxray
     
    Ok bien recu.

    Je vais donc nommer le nouveau sujet "Petit bug sur fichier VBA"

    j'attendrai que tu me répondre et je te posterai mon fichier. a ce moment.

    Merci a toi
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      peux-tu marquer ceci comme résolu?
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        peux-tu marquer ceci comme résolu?
        0