XL 2021 msgbox : timer vbyes

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

isandre

XLDnaute Nouveau
bonjour à tous,
Rien de professionnel ; pour faire travailler mes neurones, je "joue" avec Vba, mais mes connaissances sont assez légères.
Aujourd'hui, j'essaie de fermer automatiquement, donc par Vba, une MsgBox qui demande l'autorisation d'enregistrer (ou pas) un classeur.
Tout ce que j'ai trouvé sur le Net ne fonctionne pas, certainement parce qu'il me manque un élément.
voici un fragment de mon code
màj = Sheets("feuil1").Range("B1").Value
If màj >= Date Then GoTo fin 'si la date de la cellule F1 est celle du jour, passer à la fin de la condition.
If MsgBox("La dernière mise à jour date du " & màj & " Voulez-vous l'actualiser ?", vbYesNo) = vbYes Then
Sheets("feuil1").Range("B1").Value = Date

End If
fin:


Ce que je cherche à obtenir, c'est que cette MsgBox renvoie la valeur VbNo si l'utilisateur ne répond pas dans un délai déterminé.
Mais je tourne en rond...
Une solution ?
 
Solution
Bonjour,
Sinon tu as cette ressource:
Ça ne te rendra pas vbNo si le timer s'est déclenché mais une variable publique te le dira.
VB:
Sub Exemple()
    Call SetMsgBoxTimer(2.5)
    MsgBox "Vous avez 2 secondes et demie pour cliquer sur le bouton !"
    If SetMsgBoxTimerTimeOut Then MsgBox "Trop tard !"
End Sub
bonjour
exemple simple
c'est oui ou non
VB:
Sub TestMsg()
    
    Dim Wshell As Object, Reponse As VbMsgBoxResult
    Set Wshell = CreateObject("WScript.Shell")
    
    Reponse = Wshell.popup("Voulez vous sauvegarder les tables ?", 2, "Confirmez SVP", vbYesNo + vbDefaultButton2)
    If Reponse = -1 Then Reponse = vbNo
    
    
    If Reponse = vbYes Then
        MsgBox "vous avez repondu oui"
    Else
        MsgBox "vous avez repondu non"
    End If
End Sub
 
Bonjour à tous

@isandre
En dehors de mes activités de papy qui me prennent toute la semaine et surement la semaine prochaine je regarde tout ton code (dans toutes les feuilles) que tu as fait et j'essaye de comprendre ce que tu as voulu faire pour les traduire en VBA compréhensible et qui fonctionne, mais tu as l'esprit assez tortueux et il faut tout refaire.
Et faire cela en pointillé me prends du temps donc soit patient et pense à regarder régulièrement si on te demande des précisions afin de répondre au mieux.
 
Dernière édition:
Un exemple adapté à votre demande :
VB:
' ------------------------------------------------------------------------------------------------
' infos sur wscript.popup : https://www.vbsedit.com/html/f482c739-3cf9-4139-a6af-3bde299b8009.asp
' ------------------------------------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' [Maj] est le nom des cellules indiquant la dernière mise à jour d'une feuille quand le nom existe
    Dim Rep, Sh As Worksheet
    On Error Resume Next
    For Each Sh In Me.Worksheets
        If Not IsError(Sh.[Maj]) Then PopupMsg Sh.[Maj]
    Next
    ' Cancel = True
    Me.Saved = True
End Sub
Sub PopupMsg(ByRef Maj)
Dim Rep
Dim Delay As Integer: Delay = 4  ' 4 secondes pour répondre
    If Maj.Value <> Date Then
        Rep = CreateObject("WScript.Shell").Popup( _
             "La dernière mise à jour de la feuille " & Maj.Parent.Name & vbLf _
           & "             date du " & Maj & vbLf _
           & "            Voulez-vous l'actualiser ?", Delay, _
             "Attention, " & Delay & " secondes pour répondre", 4 + 48)
        If Rep = 6 Then Maj.Value = Date: Me.Save
    End If
End Sub
Un exemple adapté à votre demande :
VB:
' ------------------------------------------------------------------------------------------------
' infos sur wscript.popup : https://www.vbsedit.com/html/f482c739-3cf9-4139-a6af-3bde299b8009.asp
' ------------------------------------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' [Maj] est le nom des cellules indiquant la dernière mise à jour d'une feuille quand le nom existe
    Dim Rep, Sh As Worksheet
    On Error Resume Next
    For Each Sh In Me.Worksheets
        If Not IsError(Sh.[Maj]) Then PopupMsg Sh.[Maj]
    Next
    ' Cancel = True
    Me.Saved = True
End Sub
Sub PopupMsg(ByRef Maj)
Dim Rep
Dim Delay As Integer: Delay = 4  ' 4 secondes pour répondre
    If Maj.Value <> Date Then
        Rep = CreateObject("WScript.Shell").Popup( _
             "La dernière mise à jour de la feuille " & Maj.Parent.Name & vbLf _
           & "             date du " & Maj & vbLf _
           & "            Voulez-vous l'actualiser ?", Delay, _
             "Attention, " & Delay & " secondes pour répondre", 4 + 48)
        If Rep = 6 Then Maj.Value = Date: Me.Save
    End If
End Sub

Bonjour @isandre

Manifestement tu n'as pas bien lu mes posts #2 et #5 toutes les questions et réponses que tu te posent sont dedans.
Il suffit de les lire.



Tu n'as pas trop chercher il suffit de remplir les 3 zones suivants les réponses de l'utilisateur tout est écrit c'est comme le port salut il suffit de lire et de compléter

Regarde la pièce jointe 1220132

Et quand je lis ceci


Et que fais tu si l'utilisateur répond non ou ne répond pas ?

Au lieu de cela tu as essayé de faire un code de petit bout de n'importe quoi.

Ne serait il pas plus simple de mettre à jour sans rien demander à l'utilisatuer ?
Sans fichier (relire mon post #5) on risque de jouer au chat et à la souris longtemps.

Bonne lecture
Bonjour Phil69970,
J'avais complété les Case; Le code fonctionne , mais la notion de délai( temps avant action si l'utilisateur ne fait rien) dure beaucoup plus d'une seconde, voire n'agit pas du tout..
Si l'utilisateur ne répond pas, Case prend alors la valeur -1 , et la date n'est pas actualisée et la procédure continue,(GoTo fin, puis End Select).
Justement, le but, c'est que l'utilisateur aie le choix, et si il n'intervient pas, l'actualisation des dates ne se fait pas.
Nos messages ont dû se croiser, j'ai envoyé le fichier complet à 8:30 hier.
Je viens de voir ton dernier message de 11:39; Aucun problème, je répète : tout ceci n'a pour but que de chercher à m'améliorer et à tenter de maîtriser le VBA, absolument aucune urgence !
Je reconnais volontiers que mon ensemble de commande est assez fouillis, c'est une multitude d'essais et d'errements qui ont créé ce "monstre".
 
Dernière édition:
bonjour
exemple simple
c'est oui ou non
VB:
Sub TestMsg()
  
    Dim Wshell As Object, Reponse As VbMsgBoxResult
    Set Wshell = CreateObject("WScript.Shell")
  
    Reponse = Wshell.popup("Voulez vous sauvegarder les tables ?", 2, "Confirmez SVP", vbYesNo + vbDefaultButton2)
    If Reponse = -1 Then Reponse = vbNo
  
  
    If Reponse = vbYes Then
        MsgBox "vous avez repondu oui"
    Else
        MsgBox "vous avez repondu non"
    End If
End Sub
Bonjour patricktoulon,
Effectivement, cette solution est plus simple, mais j'ai toujours le même écueil : la notion de temps ne fonctionne pas : j'ai arrêté le chrono à plus de 2 minutes; j'ai remplacé le "1" de ton code par "1", pour essayer de diminuer le temps, mais j'ai plus de 30 secondes avant la poursuite de la macro.
Je pensais que le nombre déterminait le temps, mais visiblement ça coince. Ou alors, cet c'est fort possible, il y a un truc que je n'ai pas compris.
Mais je garde ta solution dans un coin du disque dur, elle pourra certainement m'être utile.
Un exemple adapté à votre demande :
VB:
' ------------------------------------------------------------------------------------------------
' infos sur wscript.popup : https://www.vbsedit.com/html/f482c739-3cf9-4139-a6af-3bde299b8009.asp
' ------------------------------------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' [Maj] est le nom des cellules indiquant la dernière mise à jour d'une feuille quand le nom existe
    Dim Rep, Sh As Worksheet
    On Error Resume Next
    For Each Sh In Me.Worksheets
        If Not IsError(Sh.[Maj]) Then PopupMsg Sh.[Maj]
    Next
    ' Cancel = True
    Me.Saved = True
End Sub
Sub PopupMsg(ByRef Maj)
Dim Rep
Dim Delay As Integer: Delay = 4  ' 4 secondes pour répondre
    If Maj.Value <> Date Then
        Rep = CreateObject("WScript.Shell").Popup( _
             "La dernière mise à jour de la feuille " & Maj.Parent.Name & vbLf _
           & "             date du " & Maj & vbLf _
           & "            Voulez-vous l'actualiser ?", Delay, _
             "Attention, " & Delay & " secondes pour répondre", 4 + 48)
        If Rep = 6 Then Maj.Value = Date: Me.Save
    End If
End Sub
Bonjour fanch55
ton code fonctionne bien,à une seule chose près, comme les autres solutions des autres intervenants :
Le délai (je suppose que c'est la variable Delay) n'est pas vraiment fiable, il est plus proche des 30 secondes que des 4. Et je ne trouve pas de solution . Le
Une question : à quoi correspond le 4 + 48 ?
 
Bonjour fanch55
ton code fonctionne bien,à une seule chose près, comme les autres solutions des autres intervenants :
Le délai (je suppose que c'est la variable Delay) n'est pas vraiment fiable, il est plus proche des 30 secondes que des 4. Et je ne trouve pas de solution . Le
Une question : à quoi correspond le 4 + 48 ?
Je t'avais mis en commentaire en début de code une Url pour obtenir le paramétrage du popup ( comme l'indique @TooFatBoy ):
4 = Boutons Oui et NON
48 = Icone Point d'exclamation

Le Delay n'est pas du tout pris en compte si tu fais du pas à pas .
Le message est affiché pour chaque feuille où il y a une date à mettre à jour .
Le popup est exécuté par un "agent externe" à Excel et soumis au temps de réponse présent de la machine .
Les 4 secondes représentent un temps souhaité et non pas réel, les test que j'ai effectués indiquaient un temps entre 12 et 15 secondes pour les 2 feuilles . Si tu as 30 secondes, c'est qu'il y a beaucoup de taches de fond sur ta machine .
 
@isandre

Effectivement nos 2 messages se sont croisés 🙂

Pour le calcul du temps j'ai écris ceci dans mon post #5

1) Il me semble avoir lu que le temps se calcule sans mouvement de la souris ou du clavier.
Un temps inférieur à la seconde me semble court et je ne sais pas si cela fonctionne je pense que le minimum est 1 seconde mais sans certitude.

Et j'ai écris cela également
Ce n'est pas une boite de message proprement dit mais une imitation
Sur le site si tu cherches bien il y a une longue discussion sur ce sujet

Explique moi en précisément et avec détail le fonctionnement que tu veux avoir pour cette sub
==> Sub Affichage_des_enregistrements_programmés()

Idem avec la sub ==> Réinitialisation
1) Tu règles la hauteur de la 1ere ligne
2)Tu règles le zoom
3) Tu supprimes les lignes vides feuille "MKV"
4) Tu mets /remets le filtre
5) Tu effaces les MFC
6) Tu remets les MFC
7) Tu tries la feuille"MKV"
8) Remise en place quelques formules sur la feuille 2
9) Tu règles la hauteur de chaque ligne de la colonne F en fonction de sa longueur
10) Tu calcules le nombres totale de lignes (Que tu as déjà calculer) et tu ajustes la hauteur des lignes !! (c’est donc la 2eme fois en 5 lignes de codes)
11) Tu filtres ==> Affichage des enregistrements programmés ==> pas trop compris ton critère de filtre
12) Tu modifies la hauteur de ligne de la 1ere ligne (encore)
13) Tu modifies la hauteur de ligne de la 2eme ligne (encore)
14) Tu actives la dernière ligne de la colonne A

Un rien tortueux non !!!

On devrait pouvoir simplifier si tu décris mieux ce que tu veux faire (Plus tu es précis mieux je comprends)

Idem pour les autres sub plus tu décris ce que tu veux faire avec précision plus je peux comprendre .....
 
@isandre

Effectivement nos 2 messages se sont croisés 🙂

Pour le calcul du temps j'ai écris ceci dans mon post #5



Et j'ai écris cela également


Explique moi en précisément et avec détail le fonctionnement que tu veux avoir pour cette sub
==> Sub Affichage_des_enregistrements_programmés()

Idem avec la sub ==> Réinitialisation
1) Tu règles la hauteur de la 1ere ligne
2)Tu règles le zoom
3) Tu supprimes les lignes vides feuille "MKV"
4) Tu mets /remets le filtre
5) Tu effaces les MFC
6) Tu remets les MFC
7) Tu tries la feuille"MKV"
8) Remise en place quelques formules sur la feuille 2
9) Tu règles la hauteur de chaque ligne de la colonne F en fonction de sa longueur
10) Tu calcules le nombres totale de lignes (Que tu as déjà calculer) et tu ajustes la hauteur des lignes !! (c’est donc la 2eme fois en 5 lignes de codes)
11) Tu filtres ==> Affichage des enregistrements programmés ==> pas trop compris ton critère de filtre
12) Tu modifies la hauteur de ligne de la 1ere ligne (encore)
13) Tu modifies la hauteur de ligne de la 2eme ligne (encore)
14) Tu actives la dernière ligne de la colonne A

Un rien tortueux non !!!

On devrait pouvoir simplifier si tu décris mieux ce que tu veux faire (Plus tu es précis mieux je comprends)

Idem pour les autres sub plus tu décris ce que tu veux faire avec précision plus je peux comprendre .....
@Phil69970

Sub « affichage des enregistrements programmés » : commandée par la zone de texte en J1 :L1 de la feuille « MKV ».

Elle affiche les enregistrements des émissions Tv que j’ai prévu (notés « à programmer » ou « en cours ») dans la colonne L de la feuille « MKV ».
Si pas d’enregistrements prévus, une UserForm m’indique « Pas d’enregistrements prévus ou à programmer ». Sinon, les résultats sont filtrés (critères : 1 : qui commence par « en c** », critère 2 : « à programmer », de la colonne L .
Cette Sub passe de la liste de la totalité des vidéos à la liste des enregistrements à venir, et inversement.

Sub « Réinitialisation » :

Tu as tout à fait raison, j’avais beaucoup de redondances !
J’ai fait un peu de ménage, et elle a pas mal maigri…

En fait, je m’aperçois qu’elle fait double emploi avec la Sub workBook_Open ; J’ai donc limité la Sub d’ouverture à Call vers « Réinitialisation »

Pour une raison que je ne comprends pas, j’ai été obligé de placer « Réinitialisation » dans un module ; j’avais une erreur 400 en la lançant depuis la feuille « MKV ».

J’ai également supprimé les essais de macro qui n’avaient plus d’utilité.
Mais toujours ces popup qui ne veulent pas se fermer dans un temps défini !

Peut=être avec une UserForm ? Je vais essayer de voir de ce côté.
Merci encore de t'intéresser à mon cas, même si ce cas est juste une occupation de retraité !
 

Pièces jointes

@Phil69970
Alors, le retraité s'est bien occupé (pas grand-chose à faire avec plus de 35° dehors).
J'ai réussi à faire ce que je voulais, grâce au fichier de Dudu2, que j'ai téléchargé ici :

J'avoue ne pas avoir tout compris, mais ça fonctionne comme je le voulais !
Un tout grand merci à Dudu2, ce que j'ai fait en direct, pour son aide précieuse, involontaire, mais...
Merci aussi à toi d'avoir bien voulu me montrer mes erreurs, il y en aura certainement d'autres.
A toutes fins utiles, voici la mouture normalement définitive de mon classeur.
J'accepte bien sûr toutes les critiques constructives
encore merci
Cordialement
André
 

Pièces jointes

A toutes fins utiles, voici la mouture normalement définitive de mon classeur.
J'accepte bien sûr toutes les critiques constructives
Salut,
Surprenant, tu as pris une voie inverse de ce que tu as demandé,
ce qui veut dire que tu vas sauvegarder le classeur tous les jours même si rien n'a changé
et les dates de mise à jour ne seront plus que des dates de sauvegarde ...
Bonjour fanch55.
Je veux que les dates de mise à jour des feuilles 1 et 2 s'actualisent si :
1-la date est antérieure à aujourd'hui,
2-et si je ai réagi à la boite de dialogue, avec un délai raisonnable (quelques secondes)
Donc, par défaut, si je ne fais rien, la date ne change pas.
Attention à ton commandbutton2, il n'y a pas de code derrière,
le classeur est systématiquement sauvegardé même si on dit non...
 
Salut,
Surprenant, tu as pris une voie inverse de ce que tu as demandé,
ce qui veut dire que tu vas sauvegarder le classeur tous les jours même si rien n'a changé
et les dates de mise à jour ne seront plus que des dates de sauvegarde ...

Attention à ton commandbutton2, il n'y a pas de code derrière,
le classeur est systématiquement sauvegardé même si on dit non...
bonjour fanch55
Hé oui ! Je me doutais bien que c'était trop simple.
Je me suis certainement mal exprimé : les dates des feuilles "MKV" et "DVD & BR" ne doivent pas être actualisées automatiquement. Mais si je n'agis pas, elles se mettent à jour, dans les 5 secondes.
Pour le CommandButton2, ne sachant pas comment m'en sortir, je l'ai supprimé, ce qui est plus logique, sinon, les dates mises à jour ne le seraient pas, du fait de la fermeture sans enregistrement.
Merci de tes remarques.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
171
Réponses
2
Affichages
153
Réponses
5
Affichages
237
Réponses
2
Affichages
511
Réponses
6
Affichages
299
Retour