Réaliser une petite boucle en vba

vieuxray -  
yg_be Messages postés 23541 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

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
(.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
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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
pourquoi ne pas changer le nom de UserForm1?
Me est un nom réservé.
0
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > 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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
U1 a exactement la même accessibilité que UserForm1 avait avant.
si tu as un doute, essaie dans un nouveau module.
0
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > 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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
et tes labels vont toujours de 5 à 36?
0
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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
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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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
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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
je suggère de créer plutôt un nouveau sujet pour ton nouveau petit soucis.
0
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
peux-tu marquer ceci comme résolu?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
peux-tu marquer ceci comme résolu?
0