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 @isandre

Je te propose ce code

VB:
Option Explicit

Sub TestMsg()

Dim Wsh As Object, Reponse As Integer
Set Wsh = CreateObject("WScript.Shell")

Reponse = Wsh.popup("Voulez vous faire ceci blablabla ?", 1, "Demande de confirmation", vbYesNo + vbDefaultButton2)
Select Case Reponse
    Case -1                 'Pas de réponse ==> Mon code fais ceci
        'Le code si pas de reponse
        MsgBox "Tu n'as pas répondu, c'est pas bien", vbInformation, "Réponse utilisateur"
    Case 6                  'Réponse oui ==> Mon code fais ceci
        'Le code si reponse Oui
        MsgBox "Tu as répondu OUI", vbInformation, "Réponse utilisateur"
    Case 7                  'Réponse Non ==> Mon code fais ceci
        'Le code si reponse Non
        MsgBox "Tu as répondu NON", vbInformation, "Réponse utilisateur"
End Select
 
'La suite du code si besoin
End Sub

*A noter c'est le 1 qui donne le temps pour fermer le pseudo message
Donc ici 1 = 1 seconde
Reponse = Wsh.popup("Voulez vous faire ceci blablabla ?", 1, "Demande de confirmation", vbYesNo + vbDefaultButton2)

*A noter bis
Par choix c'est le bouton Non qui à le focus

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

Merci de ton retour
 
Dernière édition:
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 @isandre

Je te propose ce code

VB:
Option Explicit

Sub TestMsg()

Dim Wsh As Object, Reponse As Integer
Set Wsh = CreateObject("WScript.Shell")

Reponse = Wsh.popup("Voulez vous faire ceci blablabla ?", 1, "Demande de confirmation", vbYesNo + vbDefaultButton2)
Select Case Reponse
    Case -1                 'Pas de réponse ==> Mon code fais ceci
        'Le code si pas de reponse
        MsgBox "Tu n'as pas répondu, c'est pas bien", vbInformation, "Réponse utilisateur"
    Case 6                  'Réponse oui ==> Mon code fais ceci
        'Le code si reponse Oui
        MsgBox "Tu as répondu OUI", vbInformation, "Réponse utilisateur"
    Case 7                  'Réponse Non ==> Mon code fais ceci
        'Le code si reponse Non
        MsgBox "Tu as répondu NON", vbInformation, "Réponse utilisateur"
End Select
 
'La suite du code si besoin
End Sub

*A noter c'est le 1 qui donne le temps pour fermer le pseudo message
Donc ici 1 = 1 seconde


*A noter bis
Par choix c'est le bouton Non qui à le focus

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

Merci de ton retour
bonjour Phil69970
Merci de ta réponse .
J'ai tenté d'adapter ta macro :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Vérification de la date de mise à jour (cellule B1, feuille Feuil1. Approbation pour actualiser.
Dim Wsh As Object, Reponse As Integer, màj As Date
màj = Sheets("Feuil1").Range("B1").Value

If màj >= Date Then GoTo fin 'si la date de la cellule B1 est celle du jour, passer à la fin de la condition.

Set Wsh = CreateObject("WScript.Shell")
Reponse = Wsh.popup("La dernière mise à jour de la Feuille 1 date du " & màj & "." & Chr(10) & " Voulez-vous l'actualiser ?", 1, "Demande de confirmation", vbYesonly)
Select Case Reponse
Case 6 'Réponse oui ==> Actualisation de la date de mise à jour
Sheets("Feuil1").Range("B1").Value = Date
Sheets("Feuil1").Range("A1").Cells.EntireRow.AutoFit
End Select
fin:
'Vérification de la date de mise à jour (cellule F1, feuille Feuil2. Approbation pour actualiser.
'déclaration variable "màj" : date de la cellule F1.
'Dim Wsh1 As Object, Reponse1 As Integer
màj = Sheets("Feuil2").Range("F1").Value
If màj >= Date Then GoTo liste 'si la date de la cellule F1 est celle du jour, passer à la fin de la condition.
Set Wsh = CreateObject("WScript.Shell")
Reponse = Wsh.popup("La dernière mise à jour de la Feuille 2 date du " & màj & "." & Chr(10) & " Voulez-vous l'actualiser ?", 1, "Demande de confirmation", vbYesonly)
Select Case Reponse
Case 6 'Réponse oui ==> Actualisation de la date de mise à jour
Sheets("Feuil2").Range("F1").Value = Date
Sheets("Feuil2").Range("A1").Cells.EntireRow.AutoFit
With Selection
.VerticalAlignment = xlCenter
End With
End Select
liste:
End Sub

Mais j'ai deux problèmes :
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 Dudu2,
Merci de ta réponse.
Cette solution me paraît beaucoup trop complexe pour mon petit niveau; j'ai essayé de l'adapter à mon projet, et ça bloque...
Quant à la modifier ultérieurement , je risque de tout planter.
Merci encore
 
@isandre

Vite fait en regardant ton code :
Ton code me semble un chouia torturé et avec une seule condition ... à chaque fois autant passer par un if
En clair tu ne gère pas le la réponse Non ou la non réponse !!!
Et les Goto pas top !

Remarques

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.

2) Pour rendre digeste et lisible ton code il faut le mettre entre balise
1751179358124.png


3) Si tu veux que l'on adapte le code sur ton fichier il est préférable d'avoir un fichier représentatif de ton vrai fichier

C'est quoi représentatif ?

- représentatif, même organisation des lignes et des colonnes, mêmes libellés, même nom des TS, mêmes noms de feuilles...
- anonymisé, pas de données personnelles réelles tels nom, n° sécu, adresse ... remplacé par Nom1, Nom2 etc ....
- simplifié, une quinzaine de lignes reproduisant l'ensemble des différents cas envisageables (Avec le résultat souhaité éventuellement)

Si cela fonctionne sur le fichier fourni et pas sur le vrai fichier c'est qu'il n'est en rien représentatif ou que tu n'as pas su transposer ce qui devrait être un simple copier coller du code.
En clair tu fais une copie de ton fichier que tu anonymises si besoin pour respecter le RGPD

4) Avec un fichier cela nous donne une vision d'ensemble de ce que tu veux faire et de voir la/les solutions qui nous paraissent les plus optimales.

N’oublie pas de nous donner toutes les explications :
Exemple : je veux faire ceci ou cela dans la feuille X ou Y si ceci dans la feuille Z etc

Bonne lecture
 
Dernière édition:
Bonjour,
Il y a une précision à donner :
Quand le temps donné à la réponse est écoulé, que voulez-vous faire ?
Fermer le classeur sans le sauvegarder ?
Et si j'ai bien compris votre code, le msg n'est produit qu'à la première maj de la journée ?
 
Bonjour,

J'ai tenté d'adapter ta macro :
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' Vérification de la date de mise à jour (cellule B1, feuille Feuil1). Approbation pour actualiser.

...

End Sub

Mais j'ai deux problèmes :
D'abord, il manque un morceau dans ta macro puisqu'il n'y a pas de code pour traiter la non réponse dans le temps imparti.

Ensuite, il manque un morceau dans ton message puisque tu dis que tu as deux problèmes mais tu ne les décris pas.
 
Comme le préconisent @Phil69970 et @patricktoulon ,
Un code à mettre dans le module Thisworkbook, il ne se déclenche qu'à la fermeture du classeur :
VB:
' infos sur wscript.popup
' https://www.vbsedit.com/html/f482c739-3cf9-4139-a6af-3bde299b8009.asp
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' [Màj] est le nom de la cellule B1 de la Feuil1
    Dim Rep
    Dim Delay As Integer: Delay = 4
    If [Màj].Value <> Date Then
        Rep = CreateObject("WScript.Shell").Popup( _
             "La dernière mise à jour date du " & [Màj] & vbLf _
           & "Voulez-vous l'actualiser ?", Delay, "Attention, " & Delay & " secondes pour répondre", 0 + 48)
        '    Stop
        If Rep = 1 Then 'OK
            [Màj] = Date: Me.Save
        Else
            Me.Saved = True
        End If
    End If
End Sub
 
Comme le préconisent @Phil69970 et @patricktoulon ,
Un code à mettre dans le module Thisworkbook, il ne se déclenche qu'à la fermeture du classeur :
VB:
' infos sur wscript.popup
' https://www.vbsedit.com/html/f482c739-3cf9-4139-a6af-3bde299b8009.asp
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' [Màj] est le nom de la cellule B1 de la Feuil1
    Dim Rep
    Dim Delay As Integer: Delay = 4
    If [Màj].Value <> Date Then
        Rep = CreateObject("WScript.Shell").Popup( _
             "La dernière mise à jour date du " & [Màj] & vbLf _
           & "Voulez-vous l'actualiser ?", Delay, "Attention, " & Delay & " secondes pour répondre", 0 + 48)
        '    Stop
        If Rep = 1 Then 'OK
            [Màj] = Date: Me.Save
        Else
            Me.Saved = True
        End If
    End If
End Sub
Bonjour à tous,
Tout d'abord, toutes mes excuses pour cette réponse tardive : je n'ai pas vu de messages m'avertissant d'autres intervenants que ceux du 28 juin.
Il s'agit d'un fichier de suivi des films, séries documentaires sur mon NAS. Donc rien de confidentiel. ainsi que des supports physiques, DVD ou Blu Ray.
Je vais répondre à tous, et essayer de trouver la solution dans toutes ces suggestions. Laissez -moi quelques instants .
Cordialement
André
 
Bonjour,
Il y a une précision à donner :
Quand le temps donné à la réponse est écoulé, que voulez-vous faire ?
Fermer le classeur sans le sauvegarder ?
Et si j'ai bien compris votre code, le msg n'est produit qu'à la première maj de la journée ?
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.
Les deux feuilles ont des objectifs différents, et je veux que ces deux dates soient indépendantes l'une de l'autre.
 
Bonjour,


D'abord, il manque un morceau dans ta macro puisqu'il n'y a pas de code pour traiter la non réponse dans le temps imparti.

Ensuite, il manque un morceau dans ton message puisque tu dis que tu as deux problèmes mais tu ne les décris pas.
Bonjour,TooFatBoy
Effectivement, un morceau du message est resté dans le clavier !
Le "Non" est traité par défaut, puisque je n'ai que le Case6 (donc "Oui") qui est traité.

Les deux problèmes sont :
1 - je n'ai pas trouvé comment modifier le délai d'attente (1)
2 - Ce délai n'est pas respecté, puisque il est totalement aléatoire, parfois rapide, parfois très long.
 
@isandre

Vite fait en regardant ton code :
Ton code me semble un chouia torturé et avec une seule condition ... à chaque fois autant passer par un if
En clair tu ne gère pas le la réponse Non ou la non réponse !!!
Et les Goto pas top !

Remarques

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.

2) Pour rendre digeste et lisible ton code il faut le mettre entre balise
Regarde la pièce jointe 1219864

3) Si tu veux que l'on adapte le code sur ton fichier il est préférable d'avoir un fichier représentatif de ton vrai fichier

C'est quoi représentatif ?

- représentatif, même organisation des lignes et des colonnes, mêmes libellés, même nom des TS, mêmes noms de feuilles...
- anonymisé, pas de données personnelles réelles tels nom, n° sécu, adresse ... remplacé par Nom1, Nom2 etc ....
- simplifié, une quinzaine de lignes reproduisant l'ensemble des différents cas envisageables (Avec le résultat souhaité éventuellement)

Si cela fonctionne sur le fichier fourni et pas sur le vrai fichier c'est qu'il n'est en rien représentatif ou que tu n'as pas su transposer ce qui devrait être un simple copier coller du code.
En clair tu fais une copie de ton fichier que tu anonymises si besoin pour respecter le RGPD

4) Avec un fichier cela nous donne une vision d'ensemble de ce que tu veux faire et de voir la/les solutions qui nous paraissent les plus optimales.

N’oublie pas de nous donner toutes les explications :
Exemple : je veux faire ceci ou cela dans la feuille X ou Y si ceci dans la feuille Z etc

Bonne lecture
bonjour Phil69970
C'est vrai, j'aurai pu passer pas des If, mais je tente des solutions alternatives., et je me perds souvent avec les If imbriqués.

Pourquoi "les GoTo pas top" ?

Je l'ai modifié depuis, en y intégrant les Case -1, 6 et 7... Et je viens de m'apercevoir d'une erreur; On ne se relit jamais assez !

Voici le fichier en entier, il n'est pas si lourd que je le pensais. Tu vas certainement le trouver un peu "brouillon", sous indulgent !
J'essaie de le modifier dans le temps, et ça donne certainement pas mal de redondances.
Merci encore.
 

Pièces jointes

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.

Merci de ta réponse .
J'ai tenté d'adapter ta macro :

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

1751869370056.png


Et quand je lis ceci

Le "Non" est traité par défaut, puisque je n'ai que le Case6 (donc "Oui") qui est traité.
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 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.

Un exemple adapté à votre demande :
1751872932400.png
1751873015364.png
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
 

Pièces jointes

Dernière édition:
- 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

Réponses
9
Affichages
171
Réponses
2
Affichages
90
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
129
Réponses
4
Affichages
124
Réponses
4
Affichages
205
Réponses
4
Affichages
396
Réponses
2
Affichages
466
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
385
Réponses
6
Affichages
249
Retour