XL 2016 ProgressBar avec voix automatique dans boucle temporelle

Lorenzini

XLDnaute Occasionnel
Bonjour,

Pour parachever mon tableau, j'ai créé un formulaire faisant office d'à-propos ; juste à titre informatif.
Comme je suis relativement limité dans mes connaissances vba, mais insatiablement curieux de voir s'il y'a une solution à ce que j'ai l'art d'imaginer comme problème avec mon esprit tordu 🤔🧐🤔, je viens faire appel à mes amis développeurs d'Excel Downloads pour le problème, justement, que voici (si si, c'en est un pour moi) :
Je souhaitais savoir s'il est possible qu'à l'ouverture de mon formulaire (par un clic sur l'image type 'ActiveX' ; voir fichier en pièce jointe), la voix automatique me lise à voix haute 2 phrases EN MÊME TEMPS que la ProgressBar se lance et que ces 2 événements se terminent AUSSI EN MÊME TEMPS ou au même moment par la fermeture (automatique) pure et simple du formulaire et j'ajoute : SAUF si l'utilisateur clique sur la croix de fermeture du formulaire avant l'achèvement de ces 2 événements, et que ben du coup, il ne les interrompe direct.
Je ne sais pas si je suis assez clair mais je vous avoue que je suis à court d'idée... 😞

Toutes vos aides seront les bienvenues :)
 

Pièces jointes

  • Test ProgressBar & Speech Speak.xlsm
    215.6 KB · Affichages: 7

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Lorenzini,
Pour faire "parler" XL vous pouvez faire :
VB:
Sub ISpeak()
     Application.Speech.Speak Range("A1")
End Sub
Cependant cette fonction est un appel à une appli externe dont on ne maitrise pas le "temps de parole".
Donc vous aurez du mal, voire même impossible, de faire coïncider votre ProgressBar avec le temps écoulé pour la diction.
De plus je ne suis pas sur que 'on puisse interrompre ce service avant la fin. Speech.Speak est un ordre de lancement, il n'y a pas d'ordre de fin ( à ma connaissance )
 

Lorenzini

XLDnaute Occasionnel
Bonjour Lorenzini,
Pour faire "parler" XL vous pouvez faire :
VB:
Sub ISpeak()
     Application.Speech.Speak Range("A1")
End Sub
Cependant cette fonction est un appel à une appli externe dont on ne maitrise pas le "temps de parole".
Donc vous aurez du mal, voire même impossible, de faire coïncider votre ProgressBar avec le temps écoulé pour la diction.
De plus je ne suis pas sur que 'on puisse interrompre ce service avant la fin. Speech.Speak est un ordre de lancement, il n'y a pas d'ordre de fin ( à ma connaissance )
Bonjour Sylvanu,

Et bien je vous remercie pour ces précisions que j'ignorais à propos de la fonction "Speech.speak"...
A la lumière de ce que vous venez de me révéler sur cette fonction, je pense que je vais me diriger vers une solution uniquement visuelle (sans cette fonction) ; purement et simplement.

Merci à vous ! :)
 

Lorenzini

XLDnaute Occasionnel
Bonjour Lorenzini,
Pour faire "parler" XL vous pouvez faire :
VB:
Sub ISpeak()
     Application.Speech.Speak Range("A1")
End Sub
Cependant cette fonction est un appel à une appli externe dont on ne maitrise pas le "temps de parole".
Donc vous aurez du mal, voire même impossible, de faire coïncider votre ProgressBar avec le temps écoulé pour la diction.
De plus je ne suis pas sur que 'on puisse interrompre ce service avant la fin. Speech.Speak est un ordre de lancement, il n'y a pas d'ordre de fin ( à ma connaissance )
Selon vous, pensez-vous qu'il est possible de lancer les 2 événements en même temps ?
Je veux dire, à l'apparition du formulaire, que la voix se fasse entendre en même temps que le lancement de la ProgressBar (est-ce qu'une macro peut me faire çà ?)
Où alors, les 2 événements sont-ils vraiment impossible à exécuter simultanément ? ...je veux dire qu'un des 2 doit nécessairement être exécuté avant l'autre ?
 

Lorenzini

XLDnaute Occasionnel
Bonjour le fil

@Lorenzini
[Une question ou deux me turlupine]
Quel est le but de la chose ?
Ou plus exactement la plus-value ?
[/Une question ou deux me turlupine]
Bonjour Staple,

Il s'agit juste d'une question de curiosité car, à proprement parler, il n'y a pas de "réelle" plus-value...
Je me demandais simplement s'il était possible d'exécuter, à l'apparition de mon formulaire, ces 2 événements distincts (mais au même moment) que sont 1 : la lecture à haute voix et 2 : le lancement d'une barre de progression ; ma curiosité m'a poussé à me demander si un bout de code pourrait me faire çà... ? 🤔 :)
 

bsalv

XLDnaute Occasionnel
on a les paramètres SpeakAsync et Purge pour manipuler
Dans la macro suivante, après 5 sec le premier texte est interrompu et on commence le 2ième

expression.Speak (Text, SpeakAsync, SpeakXML, Purge)

Code:
Sub teste()

 Application.Speech.Speak "Selon vous, pensez-vous qu'il est possible de lancer les 2 événements en même temps ?", True, , True
 
 Application.Wait Now + TimeSerial(0, 0, 5) 'après 5 sec interrompre ce premier texte et commencer avec le 2ième
 
 Application.Speech.Speak "Je veux dire, à l'apparition du formulaire, que la voix se fasse entendre en même temps que le lancement de la ProgressBar (est-ce qu'une macro peut me faire çà ?)", True, , True

End Sub
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Selon vous, pensez-vous qu'il est possible de lancer les 2 événements en même temps ?
Vous pouvez rajouter dans votre code ceci :
VB:
Dim PauseTime, Start, Finish, TotalTime ' Ligne suivant à rajouter
Application.Speech.Speak UserForm1.Label1.Caption
Et vous verrez que Speech.Speak garde la main jusqu'à la fin de son "discours".
Mais au vu de la piète qualité de la voix, sans passer n'est pas plus mal. :)
 

Lorenzini

XLDnaute Occasionnel
on a les paramètres SpeakAsync et Purge pour manipuler
Dans la macro suivante, après 5 sec le premier texte est interrompu et on commence le 2ième

expression.Speak (Text, SpeakAsync, SpeakXML, Purge)

Code:
Sub teste()

 Application.Speech.Speak "Selon vous, pensez-vous qu'il est possible de lancer les 2 événements en même temps ?", True, , True
 
 Application.Wait Now + TimeSerial(0, 0, 5) 'après 5 sec interrompre ce premier texte et commencer avec le 2ième
 
 Application.Speech.Speak "Je veux dire, à l'apparition du formulaire, que la voix se fasse entendre en même temps que le lancement de la ProgressBar (est-ce qu'une macro peut me faire çà ?)", True, , True

End Sub
on a les paramètres SpeakAsync et Purge pour manipuler
Dans la macro suivante, après 5 sec le premier texte est interrompu et on commence le 2ième

expression.Speak (Text, SpeakAsync, SpeakXML, Purge)

Code:
Sub teste()

 Application.Speech.Speak "Selon vous, pensez-vous qu'il est possible de lancer les 2 événements en même temps ?", True, , True
 
 Application.Wait Now + TimeSerial(0, 0, 5) 'après 5 sec interrompre ce premier texte et commencer avec le 2ième
 
 Application.Speech.Speak "Je veux dire, à l'apparition du formulaire, que la voix se fasse entendre en même temps que le lancement de la ProgressBar (est-ce qu'une macro peut me faire çà ?)", True, , True

End Sub
Bonjour bsalv,
Merci pour ces précisions que je ne connaissais pas. :)
 

Lorenzini

XLDnaute Occasionnel
Re,

Vous pouvez rajouter dans votre code ceci :
VB:
Dim PauseTime, Start, Finish, TotalTime ' Ligne suivant à rajouter
Application.Speech.Speak UserForm1.Label1.Caption
Et vous verrez que Speech.Speak garde la main jusqu'à la fin de son "discours".
Mais au vu de la piète qualité de la voix, sans passer n'est pas plus mal. :)
oui, effectivement, la qualité de la voix est assez médiocre !
Intéressante cette idée du PauseTime...que je vais garder pour + tard 😁👍
Merci tout de même :)
 

Lorenzini

XLDnaute Occasionnel
Re,

Vous pouvez rajouter dans votre code ceci :
VB:
Dim PauseTime, Start, Finish, TotalTime ' Ligne suivant à rajouter
Application.Speech.Speak UserForm1.Label1.Caption
Et vous verrez que Speech.Speak garde la main jusqu'à la fin de son "discours".
Mais au vu de la piète qualité de la voix, sans passer n'est pas plus mal. :)
j'ai essayé avec un Timer pour que mon formulaire se ferme au bout de 10 secondes, mais çà ne fonctionne pas 😞

VB:
Private Sub Image1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

On Error Resume Next

'Application.ScreenUpdating = False

Dim PauseTime, Start, Finish

    PauseTime = 10
    Start = Timer

UserForm1.Label1.Caption = Chr(13) & "   Ce fichier a été développé par ..." & _
Chr(13) & Chr(13) & "   Il aura fallu pour y arriver :" & _
Chr(13) & Chr(13) & "   environ 1 mois de travail (de mi-avril à fin mai 2023)," & _
Chr(13) & "   + d'une dizaine de macros et formulaires," & _
Chr(13) & "   + de 50 formules différentes," & _
Chr(13) & "   + de 4.000 lignes de codes de programmations en VB." & _
Chr(13) & Chr(13) & "   Pour toutes questions/suggestions," & _
Chr(13) & "   merci d'envoyer un mail à :" & _
Chr(13) & Chr(13) & "   on_verra_plus_tard@pas_demain.be"

UserForm1.Show

    Do While Timer < (Start + PauseTime)
        
        DoEvents
                                  
        If Format(TimeSerial(0, 0, (Start + 10) - Timer), "s") > 1 Then
            
            UserForm1.Caption = "A propos (fermeture dans " & Format(TimeSerial(0, 0, (Start + 10) - Timer), "s") & " secondes)"
        Else
            UserForm1.Caption = "A propos (fermeture dans " & Format(TimeSerial(0, 0, (Start + 10) - Timer), "s") & " seconde)"
            UserForm1.Hide
        End If
    
    Loop
  
    Start = Timer + 1
    Finish = Timer
    
    UserForm1.Hide

Application.ScreenUpdating = True

End Sub

Rien à faire, l'UserForm ne se ferme pas au bout de 10 secondes mais ... 15 ou 20 !?
Je ne comprends plus ; pour quelles raisons ?
J'ai essayé de changer toutes les variables ou presque ? je ne sais plus tellement j'ai changer de choses...
 

Pièces jointes

  • Décompte fermeture UserForm.xlsm
    215 KB · Affichages: 2

Statistiques des forums

Discussions
314 716
Messages
2 112 153
Membres
111 445
dernier inscrit
elmansour81