XL 2016 Forcer l'arrêt d'un Timer dès la sortie d'un Formulaire

Lorenzini

XLDnaute Occasionnel
Bonjour,

Etant amateur avec VBA et Excel, voici mon problème :
A l'ouverture d'un UserForm (accessible en cliquant sur l'image de l'imprimante dans la cellule "P3"), je voulais faire clignoter une image, du genre panneau "ATTENTION !".
J'ai donc fait une boucle...Loop...enfin, j'ai traficoté ce que j'ai pu et c'est là que j'ai besoin d'aide : quand je quitte le formulaire, il est impossible de taper quoi que ce soit sur la feuille du tableur (avant que le Timer programmé dans la macro ne s'arrête)... en fait, j'aspirais à un travail plus "propre", c'est-à-dire faire clignoter l'image "à l'infini" (si je puis dire) à l'ouverture du formulaire (peu importe le temps qu'il reste ouvert) jusqu'à ce que l'on quitte ce formulaire... (et que tout s'arrête) et retrouver instantanément accès libre pour taper ce que je voulais dans ma feuille, sans aucun délai d'attente de fin de Timer de rien du tout.
J'avoue que mes connaissances limitées ne m'ont permi "que" de placer un compteur (qui ne s'arrête pas DES la fermeture du formulaire, mais bien après le temps qui lui a été imparti).
Je ne sais pas si je suis clair ? car du coup, j'ai un autre problème (lié ?) : mon pavé numérique (et j'ai eu beau utiliser Sendkeys...quel bor*** cette commande !!), rien n'y a fait !
Mon pavé numérique tantôt va, tantôt est désactivé... il clignote comme une guirlande de Noël !
Et en plus, à force de gratter, il y'en a même un qui m'a répondu : "tu utilises une version 64 bits ; du coup, tu dois utiliser des ..."Declare PTRSafe" dans tes fonctions...
Ok d'accord, pour çà, je verrai plus tard (vu la complexité de la chose pour mon niveau de débutant).

Mais en résumé, comment faire :
1) pour que l'image clignote "indéfiniment" à l'ouverture du formulaire ?
2) pour que, dès la fermeture du formulaire, et sans délai d'attente, je retrouve l'accès complet à la saisie de données dans ma feuille ?

D'avance, je vous remercie vivement pour toutes les aides que vous pourriez m'apporter :)
 

Pièces jointes

  • Imprimerie Economat 2.xlsm
    363.7 KB · Affichages: 11

patricktoulon

XLDnaute Barbatruc
Bonjour
il te faut un signal pour l’arrêter
un signal qui dit oui au depart et un signal qui dit non si tu ferme le userform
il te faut donc une variable global module userform
il ne s'arrête pas de clignoter tant que le userform est ouvert
VB:
Option Explicit
Public clignote As Boolean
Private Sub CommandButton1_Click()

    If TextBox1.Value = "laurent2105" Then
        With UserForm1
            .TextBox1.Value = 200
            .TextBox2.Value = 6
            .TextBox3.Value = 9
            .TextBox4.Value = 10
            .TextBox5.Value = 14
            .TextBox6.Value = 2
            .TextBox7.Value = 10
            .TextBox8.Value = 10
            .CommandButton1.SetFocus
            .Show
        End With
    Else
        Unload Me    '        UserForm2.Hide
    End If
    Unload Me
End Sub

Private Sub TextBox1_Change()
    Me.Height = 180
    CommandButton1.Visible = True
End Sub

Private Sub UserForm_Initialize()
    Frame1.Caption = "Entrez le mot de passe pour déverrouiller...   "
    me.clignote = True
    Me.Height = 115
End Sub

Private Sub UserForm_Activate()
    Dim W#, Tim
    If clignote Then
        Do While clignote = True
            Image1.Visible = Not Image1.Visible
            W = 0.4: Tim = Timer
            Do While Timer < Tim + W
                DoEvents
            Loop
            If clignote = False Then Exit Do
        Loop
    End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Me.clignote = False
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Le plus simple serait de faire comme ça :
Code:
Private Sub UserForm_Activate()
   Do While Me.Visible
      Me.Image1.Visible = Int(Timer * 4) And 1
      DoEvents
      Loop
   Unload Me
   End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
   Cancel = CloseMode = 0
   Me.Hide
   End Sub
Mais J'ai aussi un module de classe Rythmeur ayant pour vocation de déclencher périodiquement un évènement. Ce serait plus propre puisqu'il ne déroulerait plus en permanence du code pour rien.
 
Dernière édition:

Lorenzini

XLDnaute Occasionnel
Bonjour
il te faut un signal pour l’arrêter
un signal qui dit oui au depart et un signal qui dit non si tu ferme le userform
il te faut donc une variable global module userform
il ne s'arrête pas de clignoter tant que le userform est ouvert
VB:
Option Explicit
Public clignote As Boolean
Private Sub CommandButton1_Click()

    If TextBox1.Value = "laurent2105" Then
        With UserForm1
            .TextBox1.Value = 200
            .TextBox2.Value = 6
            .TextBox3.Value = 9
            .TextBox4.Value = 10
            .TextBox5.Value = 14
            .TextBox6.Value = 2
            .TextBox7.Value = 10
            .TextBox8.Value = 10
            .CommandButton1.SetFocus
            .Show
        End With
    Else
        Unload Me    '        UserForm2.Hide
    End If
    Unload Me
End Sub

Private Sub TextBox1_Change()
    Me.Height = 180
    CommandButton1.Visible = True
End Sub

Private Sub UserForm_Initialize()
    Frame1.Caption = "Entrez le mot de passe pour déverrouiller...   "
    me.clignote = True
    Me.Height = 115
End Sub

Private Sub UserForm_Activate()
    Dim W#, Tim
    If clignote Then
        Do While clignote = True
            Image1.Visible = Not Image1.Visible
            W = 0.4: Tim = Timer
            Do While Timer < Tim + W
                DoEvents
            Loop
            If clignote = False Then Exit Do
        Loop
    End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Me.clignote = False
End Sub
ah merci patrick ! sans surprises, ton code fonctionne à merveille ! un grand merci ; çà m'aide beaucoup ! :D
 

Lorenzini

XLDnaute Occasionnel
Bonjour.
Le plus simple serait de faire comme ça :
Code:
Private Sub UserForm_Activate()
   Do While Me.Visible
      Me.Image1.Visible = Int(Timer * 4) And 1
      DoEvents
      Loop
   Unload Me
   End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
   Cancel = CloseMode = 0
   Me.Hide
   End Sub
Mais J'ai aussi un module de classe Rythmeur ayant pour vocation de déclencher périodiquement un évènement. Ce serait plus propre puisqu'il ne déroulerait plus en permanence du code pour rien.
Salut Dranreb, je trouve déjà que ton code présenté ici est minimaliste (de mon visuel du niveau débutant que je suis) ; je veux dire que c'est concis et efficace ! Merci ! Merci ! 😀
 

Discussions similaires

Statistiques des forums

Discussions
312 209
Messages
2 086 266
Membres
103 167
dernier inscrit
miriame