Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Timer VBA - fermeture automatique d'un UserForm

Thibault2612

XLDnaute Junior
Bonjour à tous,

J'utilise une macro faisait apparaître un UserForm après l'appuie sur un bouton.

J'aimerais savoir si il est possible que mon UserForm se ferme tout seul au bout de 5/10 minutes si il n'y a pas d'activé dans mon UserForm. C'est à dire que je n'ai toucher à aucun bouton dans mon UserForm ?

Je vous remercie d'avance.

cordialement, Thibault
 
Dernière édition:

Nairolf

XLDnaute Accro
Salut,

Je pense que tu peux utiliser la fonction vba Application.OnTime dans le code de l'évènement intialize de ton userform avec une liaison à une procédure qui pourrait être du genre:
Code:
sub timer1
   userform1.unload
end sub

Et dans chaque bouton ou txtbox..., mettre la même fonction Application.OnTime avec Schedule:=False
 

Thibault2612

XLDnaute Junior
Merci beaucoup Philippe vous êtes un génie !

Pouvez vous m'expliquer cette ligne de code :
Code:
Application.OnTime Now + TimeValue("00:00:01"), procedure:="decompte"


Et encore une chose, à la place de remettre mon compteur à 30 sur chaque bouton, existe-il une fonction qui regroupe toute activité sur la feuille ? Par exemple bouger sa souris... etc
En tout cas merci !
 
Dernière édition:

Nairolf

XLDnaute Accro
Salut Philippe,

@Thibault :
Code:
Application.OnTime Now + TimeValue("00:00:01"), procedure:="decompte"
La partie Now + TimeValue("00:00:01") est l'heure à laquelle la procédure nommée "decompte" se lancera.
Dans le cas développé par Philippe, il a choisi de lancer la procédure 1 seconde après l'heure du déclenchement du premier bouton (now = maintenant).
Donc la procédure "decompte" se lance toutes les secondes pour afficher le décompte.
Sur le code des clic_bouton, on pourrait mettre le code :
Code:
Application.OnTime Now + TimeValue("00:00:01"), procedure:="decompte", Schedule:=False
ce qui aurait pour effet d'arrêter la fonction ontime.
Dans tous les cas il est bon de mettre la fonction d'arrêt du ontime à la fermeture du userform, car le ontime se poursuivra tant qu'il ne sera pas dépassé, même si le userform est fermé.
 

Thibault2612

XLDnaute Junior
Bonjour Nairolf, en effet mon compteur ne s'arrete pas quand je quitte mon userform.
J'ai donc essayer votre code :
Code:
    If Sheets("MDP").[A2] <> 0 Then
    Sheets("MDP").Unprotect Password:="icare"
    Sheets("MDP").[A2] = 0
    End If
Mais cela ne marche pas.... avez-vous une autre solution ?

Merci !
 

Nairolf

XLDnaute Accro
Salut,

J'ai testé le fichier de Philippe en y ajoutant le code ci-dessous dans le userform, et ça marche.
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.OnTime Now + TimeValue("00:00:01"), procedure:="decompte", Schedule:=False
End Sub
 

Thibault2612

XLDnaute Junior
Re bonjour, ça marche pour quelques bouton mais pas tous je comprend vraiment pas pourquoi...

Voici le message d'erreur :
"Erreur d'execution '1004':
La méthode OnTime de l'objet '_Application' à échoué"

merci de m'aider
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Pour Application.OnTime avec Schedule:=False il faut spécifier non seulement la même procédure mais aussi la même heure que celle qui avait été spécifiée à celui avec Schedule assumé à true.
Info: pour ce genre de cas de figure j'utilise un module standard Planificateur et un module de classe Planification.
 

Nairolf

XLDnaute Accro
Bernard, t'abuses

Thibaut, essaye de modifier ton code comme ceci:

VB:
Sub Bouton1_Clic()
Sheets(1).[A1] = 30
UserForm1.Show


End Sub
Sub decompte()
Dim a
If UserForm1.Visible = False Then
    a = Now + TimeValue("00:00:01")
    Application.OnTime a, procedure:="decompte"
    Application.OnTime a, procedure:="decompte", Schedule:=False
Else
     UserForm1.Label1.Caption = "Fermeture dans : " & Sheets(1).[A1] & " secondes" & vbLf & "Sauf si vous cliquez sur un bouton"
        If Sheets(1).[A1] = 0 Then
            UserForm1.Hide
            Exit Sub
        End If
    Sheets(1).[A1] = Sheets(1).[A1] - 1
    Application.OnTime Now + TimeValue("00:00:01"), procedure:="decompte"
End If
End Sub
VB:
Private Sub UserForm_Activate()
decompte
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Application.OnTime Now + TimeValue("00:00:01"), procedure:="decompte", Schedule:=False
End Sub

J'avoue que c'est un peu bidouillé, mais ça marche.
 

Nairolf

XLDnaute Accro
Le premier code en un peu mieux:
VB:
Sub Bouton1_Clic()
Sheets(1).[A1] = 30
UserForm1.Show


End Sub
Sub decompte()
Dim a
a = Now + TimeValue("00:00:01")
Sheets(1).[A1] = Sheets(1).[A1] - 1
Application.OnTime a, procedure:="decompte"

If UserForm1.Visible = False Then
    Application.OnTime a, procedure:="decompte", Schedule:=False
Else
     UserForm1.Label1.Caption = "Fermeture dans : " & Sheets(1).[A1] & " secondes" & vbLf & "Sauf si vous cliquez sur un bouton"
        If Sheets(1).[A1] = 0 Then
            UserForm1.Hide
            Exit Sub
        End If
End If
End Sub
 

Discussions similaires

T
  • Résolu(e)
Microsoft 365 pb effacement macro
Réponses
8
Affichages
391
Themax
T
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…