XL 2016 Compte à rebours dans un userform

Goose

XLDnaute Occasionnel
Bjr à tous,
voilà je n'arrive pas identifier le bug dans le code suivant:
VB:
Private Sub CommandButton1_Click()
a = UserForm2.TextBox1.Value
b = UserForm2.TextBox2.Value
c = UserForm2.TextBox3.Value
d = UserForm2.TextBox4.Value
e = UserForm2.TextBox5.Value
f = UserForm2.TextBox6.Value

n = a * 10 * 60 * 60 + b * 60 * 60 + c * 10 * 60 + d * 60 + e * 10 + f
Unload Me
UserForml.Show
UserForml.Label1.Caption = a & b & ":" & c & d & ":" & e & f
For i = 1 To n
Application.Wait (Now + #12:00:01 AM#)
DoEvents
UserForml.Label1.Caption = Format(DateAdd("s", -1, UserForml.Label1.Caption), "hh:mm:ss")
UserForml.Label3.Width = 276 - 276 * i / n
If UserForml.Label1.Caption < #12:00:11 AM# Then
Beep
End If
Next
End Sub
je joint un fichier explicatif
merci d'avance
bye
 

Pièces jointes

  • Marqueur-2eEcran.xlsm
    28.3 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
re
Bonjour
si je puis me permettre il n'y a pas que là que ça déraille
pour commencer
1° c'est pas a*60 ....etc... c'est val(a)*60...etc (pareil pour b,c,d...)

2° ensuite tu unload ton userform
donc tes variables sont vidées
donc ta boucle for N ne bouclera pas puisque N vaut zero

3° et pour couronner le tout
tu fait un wait de 12 heures et 1 secondes
je ne suis pas sur ça correspond à ton intention
et dans le cas ou ça le serait ça implique que le pc soit allumé ainsi que le fichier excel lui même soit ouvert dans 12 heures et 1 secondes
il y a les taches planifiées pour ça


ça dénote ta méconnaissance et compréhension de ton ton environnement vba excel
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
tu fait un wait de 12 heures et 1 secondes
Ça n'a pas l'air d'être ça, non.
Mais ça m'a choqué aussi en voyant écrites ces constantes VBA que pour ma part je n'utilise jamais.
Alors j'ai fais des tests genre :
VB:
Sub test()
   MsgBox Format(#12:00:00 AM#, "hh:mm:ss") _
      & vbLf & Format(#1:00:00 AM#, "hh:mm:ss")
   End Sub
La logique assez descriptive, voire de niveau école maternelle anglo-saxonne, que je pense avoir compris c'est que le premier nombre donne le numéro du cadran sur lequel est passé en dernier la petite aiguille, celle des heures. 0 n'existe donc pas. Les deux suivants, rien de spécial, le nombre de subdivisions comptées par la grande aiguille et la trotteuse, enfin le dernier terme indique si c'est le matin ou l'après midi.
À titre indicatif je joins mon classeur portant plein d'affichages de temps.
 

Pièces jointes

  • Progression.xlsm
    283.8 KB · Affichages: 2
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bien vu @Dranreb j'aurais du faire le test avant
c'est vrai que c'est troublant
mais en effet 12:00:01 Am donne bien 1 seconde
pourtant effectivement c'est faux car 12:00:00 am ca ne peut être que midi et 1 seconde
car 12:00:01 pm ne peut exister non plus
bref je suppose que c'est cela que tu cherche à faire
VB:
Private Sub CommandButton1_Click()
Dim a, b, c, d, e, f, h, m, s, n, w
a = UserForm2.TextBox1.Value
b = UserForm2.TextBox2.Value
c = UserForm2.TextBox3.Value
d = UserForm2.TextBox4.Value
e = UserForm2.TextBox5.Value
f = UserForm2.TextBox6.Value

'conversion en secondes
h = Val(a & b) / 3600 'converti les heures en secondes
m = Val(c & d) * 60 'converti les minutes en secondes
s = Val(e & f)      'les secondes
n = h + m + s 'n est donc egal au nombre de secondes désiré

'largeur originale de la barre de progression
w = UserForm1.Label3.Width
Me.Hide 'on masque le userform on ne le ferme pas !!!
UserForm1.Show 'on affiche le userform
UserForm1.Label4.Caption = a & b & ":" & c & d & ":" & e & f 'on affiche le temps total de départ

'c'est parti mon kiki
For i = 1 To n
Application.Wait (Now + 0.00001)
DoEvents
UserForm1.Label4.Caption = Format(DateAdd("s", -1, UserForm1.Label4.Caption), "hh:mm:ss") 'on enlève une seconde à chaque tours

UserForm1.Label3.Width = w - ((w / n) * i) 'on reduit la barre de la largeur/n et multiplié par i
If UserForm1.Label4.Caption < #12:00:11 AM# Then
Beep
End If
UserForm1.Repaint
Next
Unload Me
End Sub
 

Pièces jointes

  • Marqueur-2eEcran.xlsm
    22.1 KB · Affichages: 7

Dranreb

XLDnaute Barbatruc
Bonjour.
Je crois que le but est très semblable à ce que permet mon UFmDécompte qui se lance par la procédure de démonstration LancerDécompte affectée au bouton "Lancer un décompte" de la feuille "Histoire de Temps".
Et effectivement je pense qu'il ne faut surtout pas de Application.Wait ni quelqu'autre accaparement de la ressource CPU. Un timer windows est parfait pour ça. Mais comme il lui faut impérativement un module standard, ma classe Rythmeur permet d'en utiliser un très simplement dans un module objet. Pour cela elle dialogue avec des procédures du module standard effecteur XRythmeur.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
RE
Non c'est le fait que tu dois travailler avec un petit pc avec un graphique moyen
peut être même que ta carte graphique utilise la mémoire dedié (donc ponctionnée sur tes barètes mémoire)
et alors en effet sur certains pcs il se peut qu'il y est des scintillement avec le repaint du userform1
 

jurassic pork

XLDnaute Occasionnel
on fait la même chose mais en addressof dans un settimer
Hello Patrick,
dans ton classeur avec un formulaire chronomètre qui se trouve ici il y a deux soucis :
1 - Le label1 de ton formulaire chrono a pour valeur 00:00 alors que cela devrait être 00:00:00
2 - Dans le code d'initialisation du Timer
VB:
Sub startChrono()
 UserForm1.Show
  TimerID = SetTimer(0, 0, Interval, AddressOf Chrono)
End Sub

Interval n'est pas assignée donc je suppose qu'il est à 0 ce qui fait que l'intervalle d'appel de la procédure du Timer est au minimum ( 10 ms).
Vu que la procédure Chrono est :
Code:
Sub Chrono()
    On Error Resume Next
    UserForm1.Label1.Caption = TimeValue(UserForm1.Label1.Caption) + TimeSerial(0, 0, 1)
End Sub
Il serait logique de mettre 1000 pour l'intervalle du Timer.
Avec ton label1 à 00:00 on avait l'impression que cela s'incrémentait bien toutes les secondes pourtant avec un appel à chrono toutes les 10 ms.
Ami calmant, J.P
 

Discussions similaires

Statistiques des forums

Discussions
314 017
Messages
2 104 582
Membres
109 083
dernier inscrit
Stef06