Réaliser une petite boucle en vba - VB / VBA

A voir également:Réaliser une petite boucle en vbaPetite boucle en vba... ✓ - Forum - VB / VBA Sortir d'une boucle for vba ✓ - Forum - Excel Boucle if vba ✓ - Forum - VB / VBA Sortir d'une boucle for - Forum - Programmation Boucle en vba Excel ✓ - Forum - VB / VBA

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

Forum

A voir également:Réaliser une petite boucle en vbaPetite boucle en vba... ✓ - Forum - VB / VBA Sortir d'une boucle for vba ✓ - Forum - Excel Boucle if vba ✓ - Forum - VB / VBA Sortir d'une boucle for - Forum - Programmation Boucle en vba Excel ✓ - Forum - VB / VBA

Web: www.shapebootstrap.net

18 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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()

Merci yg_be 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM a aidé 33049 internautes ce mois-ci

Reply

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

(.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

Merci yg_be 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM a aidé 33049 internautes ce mois-ci

Reply

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    pourquoi ne pas changer le nom de UserForm1?
    Me est un nom réservé.

  • auteur

    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

  • auteur

    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.

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    U1 a exactement la même accessibilité que UserForm1 avait avant.
    si tu as un doute, essaie dans un nouveau module.

  • auteur

    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

  • auteur

    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.

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    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.

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    as-tu le soucis même en ayant une durée comme 50 secondes?
    que veux-tu dire par "j'en cherche une autre"?

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    et tes labels vont toujours de 5 à 36?

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    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".

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    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?

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    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.

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    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.

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    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     

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    je suggère de créer plutôt un nouveau sujet pour ton nouveau petit soucis.

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    peux-tu marquer ceci comme résolu?

  • auteur

    peux-tu marquer ceci comme résolu?

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed