XL 2013 La colle du jour(n'y a t il pas d'autre moyen que la gestion d'erreur)

patricktoulon

XLDnaute Barbatruc
bonjour a tous
comme le titre l'indique je souhaiterais savoir si il y a un moyen de se passer de la gestion d'erreur
j'explique
l'horloge fonctionne mais des que je sélectionne une cellule ou une plage le timer plante excel quand heure est appelée
les gestion d'erreur c'est bien mais j'aimerais comprendre comment on peut gérer autrement

VB:
#If VBA7 Then
    Private Declare PtrSafe Function SetTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare PtrSafe Function KillTimer Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long) As Long
#Else
    Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If
Dim TimerID&
Sub start()
TimerID = SetTimer(0, 0, 100, AddressOf heure)
End Sub
 
Sub arret()
On Error Resume Next
If TimerID <> 0 Then KillTimer 0, TimerID: TimerID = 0:
End Sub
 
Sub heure()
On Error Resume Next
[A1] = Format(Now, "hh:nn:ss")
End Sub
je vois arriver a grand pas Dranreb là ;)
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Diverses correspondances :
1598805576453.png

 

Modeste geedee

XLDnaute Barbatruc
ben en fait je fait au debut t=timer
plus tar je fait...=timer-t
j'obtiens donc un double du genre 8.12354566
je souhaiterais avoir "hh:mm:ss,xxx"
j'en vois plein d'exemple mais chez moi nada ça fonctionne pas
1 -timer renvoie une valeur en secondes depuis l'allumage du PC
2 -VBA ne sait pas afficher : "hh:mm:ss,000"
VB:
Sub tps()
Dim t As Double
[a1:a2].NumberFormat = "hh:mm:ss.000"
t = Timer
[a1] = t
MsgBox Format((Timer - t) / 86400, "hh:mm:ss,000")
[a2] = (Timer - t) / 86400
MsgBox [a2].Text
End Sub
 

patricktoulon

XLDnaute Barbatruc
Bonjour @Dranreb @Modeste geedee
@Dranreb merci pour les formats

ceci m'affiche des chose du genre XX:XX:XX,873
MsgBox Format((Timer - t) / 86400, "hh:mm:ss,000")

ce que je voudrais pour les 3 dernier chiffre c'est les centième de 1 à 100
alors j'ai fait comme ca
[B2] = Format((TimeElapsed) / 86400, "hh:mm:ss ") & "0" & Left(Split(TimeElapsed & "000", ",")(1), 2)
le seul problème quand je n'ai pas de décimale ben ça plante au split bien évidement
sinon quand ca fonctionne ca donne ca
"0XX"
demo5.gif

en gros il me faut "0" et les deux premières décimales de timeelapsed-int (timeelapsed)
 

Modeste geedee

XLDnaute Barbatruc
Bonjour @Dranreb @Modeste geedee
@Dranreb merci pour les formats

ceci m'affiche des chose du genre XX:XX:XX,873
MsgBox Format((Timer - t) / 86400, "hh:mm:ss,000")
format avec millièmes !!!
ce que je voudrais pour les 3 dernier chiffre c'est les centième de 1 à 100

!!! VBA FORMAT ne sait pas afficher : "hh:mm:ss,000"


alors fait comme ca
format avec centièmes !!!
[B2].NumberFormat = "hh:mm:ss.00"
[B2]=(Timer - t) / 86400
MsgBox Right([B2].Text,5)


Nb:
il existe l'API GetTickCount qui permet une utilisation similaire à Timer
mais qui ramène le nombre de millisecondes écoulées depuis minuit
 
Dernière édition:

dysorthographie

XLDnaute Accro
Bonjour Patrick bonjour le forum,
pour ceux que ça intéresse j'ai fait un conrtôle passe plat sur la base du timer Microsoft!


VB:
Private Sub MyTimer1_TIC()
Me.Caption = Time
End Sub

Private Sub UserForm_Click()
 If MyTimer1.Interval = 0 Then
   MyTimer1.Interval = 3 'Start Timer
 Else
    MyTimer1.Interval = 0 'Stop Timer
 End If
End Sub
Sans titre.png
 

dysorthographie

XLDnaute Accro
comme je te l'ai dit j'ai créé un contrôle passe plat?

comme je disposes de VB6 je peux utiliser tous les contrôles Microsoft alors que mes contemporains n'y ont pas accès dans Excel! alors j’utilise le vrai Timer de Microsoft pour fair battre le cœur de mon propre timer!

voici le code de mon UserControl!
VB:
Public Event TIC()
Public Property Let Interval(value As Long)
Timer1.Interval = value
End Property
Public Property Get Interval() As Long
Interval = Timer1.Interval
End Property
Private Sub Timer1_Timer()
RaiseEvent TIC
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Interval = PropBag.ReadProperty("Interval", Interval)
End Sub
Private Sub UserControl_Resize()
Width = 500: Height = 500
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty("Interval", Interval)
End Sub
Notes qu'une seconde correspond à un interval de 1500
 
Dernière édition:

Discussions similaires

  • Résolu(e)
Microsoft 365 32 ou 64 bits
Réponses
46
Affichages
2 K

Statistiques des forums

Discussions
315 088
Messages
2 116 087
Membres
112 656
dernier inscrit
VNVT