Réaliser une petite boucle en vba

Fermé
vieuxray - 11 oct. 2018 à 18:12
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 - 29 oct. 2018 à 21:51
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
11 oct. 2018 à 22:41
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
Modifié le 12 oct. 2018 à 10:02
(.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
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
12 oct. 2018 à 13:03
pourquoi ne pas changer le nom de UserForm1?
Me est un nom réservé.
0
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > vieuxray
12 oct. 2018 à 15:03
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
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
Modifié le 12 oct. 2018 à 18:33
U1 a exactement la même accessibilité que UserForm1 avait avant.
si tu as un doute, essaie dans un nouveau module.
0
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > vieuxray
13 oct. 2018 à 10:37
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
Modifié le 13 oct. 2018 à 11:26
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
13 oct. 2018 à 12:03
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
13 oct. 2018 à 13:52
et tes labels vont toujours de 5 à 36?
0
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
13 oct. 2018 à 14:56
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
13 oct. 2018 à 15:24
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
Modifié le 13 oct. 2018 à 18:57
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
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
14 oct. 2018 à 20:40
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
15 oct. 2018 à 08:49
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
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
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
15 oct. 2018 à 14:55
je suggère de créer plutôt un nouveau sujet pour ton nouveau petit soucis.
0
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 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
15 oct. 2018 à 22:57
peux-tu marquer ceci comme résolu?
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
29 oct. 2018 à 21:51
peux-tu marquer ceci comme résolu?
0