Bonjour;
Avez-vous essayé en remplaçant les msgBox par « sendmsgtoUser2 » ?
cordialement.
… entre temps j’ai trouvé ceci:
et ceci:
si cela peu aider…
Bonjour;
Avez-vous essayé en remplaçant les msgBox par « sendmsgtoUser2 » ?
cordialement.
… entre temps j’ai trouvé ceci:
et ceci:
si cela peu aider…
Bonjour,
je ne veux pas de msgbox ou sendmsgtoUser2 qui est la même chose
je viens d’essayer la macro suivante, qui ne fonctionne pas en asynchrone bizarrement
Function RobotSpeaking(sText As String) As Boolean
On Error Resume Next
Err.Clear
With CreateObject("SAPI.SpVoice")
.SVSFlagsAsync
.Volume = 100
.Speak sText
End With
RobotSpeaking = (Err.Number = 0)
End Function
Et cela fonctionne sans la partie asynchrone ou pas?
.SVSFlagsAsync
avec ou sans .SVSFlagsAsync c’est la même chose dans Solidworks le texte est lu de manière synchrone
De ce que je comprends il est bien lu, mais pas de manière asynchrone et peu importe si .SVSFlagsAsync est présent ou non.
C’est bien ça?
oui c’est ca et quand je met cette macro, le message est lu dans VBE uniquement (touche F8) mais pas avec le bouton de macro
Function RobotSpeaking(sText As String) As Boolean
On Error Resume Next
Err.Clear
With CreateObject("SAPI.SpVoice")
'.SVSFlagsAsync
.Volume = 100
.Speak sText, 1 'ou SVSFlagsAsync
End With
RobotSpeaking = (Err.Number = 0)
End Function
j’essai aussi
.Speak sText, SVSFlagsAsync = True, ou false et c’est lu de maniéré synchrone dans les 2 cas
J’ai l’impression que c’est le fonctionnement normal, si je remplace:
.Speak sText, 1
par:
.Speak sText, 0
Le texte est bien lu.
Avec le 1 pas de lecture car on dirait que dès qu’il passe à la ligne de code suivant le texte est interrompue (avant d’avoir commencé)
Cette macro sous SW ou excel à le même fonctionnement sous les 2 logiciels donc pour moi cela ne vient pas de SW
Sub speech()
Set swApp = Application.SldWorks 'Ligne à mettre ne commentaire sous excel
RobotSpeaking "Ceci est un essai, de texte lu par windows 10, si vous entendez le message tout en affichant le msgbox, c'est que cela fonctione"
MsgBox "Fonctionne si le message s'affiche avant la fin du texte lu"
End Sub
Function RobotSpeaking(sText As String) As Boolean
On Error Resume Next
Err.Clear
With CreateObject("SAPI.SpVoice")
.SVSFlagsAsync
.Volume = 100
.Speak sText, 1 'ou SVSFlagsAsync
End With
RobotSpeaking = (Err.Number = 0)
End Function
pourtant dans l’editeur VBE avec la touche F8 le texte est lu de maniere asynchrone avec ,1 ou SVSFlagsAsync
Oui mais si tu apui rapidement sur F8 dès que tu arrive sur msgbox il coupe le texte.
Sous excel ces 2 codes fonctionne. L’un de manière asynchrone et l’autre pas.
Sub TalkToMe3()
Application.Speech.Speak "Excel me parle tout en affichant le message", SpeakAsync:=True
MsgBox "test"
End Sub
Sub TalkToMe4()
Application.Speech.Speak "Excel me parle puis affichele message" ', SpeakAsync:=True
MsgBox "test"
End Sub
Donc j’imagine que cela vient de la fonction utilisé.
Il va falloir touver une méthode équivalente sous SW.
Si quelqu’un a une idée de code
En ne créant pas de fonction (code de la fonction directement dans le sub) cela lit bien le texte, tout en affichant le msgbox :
Dim swApp As Object
Sub speech()
Dim sText As String
sText = "Ceci est un essai, de texte lu par windows 10, si vous entendez le message tout en affichant le msgbox, c'est que cela fonctione"
Set swApp = Application.SldWorks
With CreateObject("SAPI.SpVoice")
'.SVSFlagsAsync
.Volume = 100
.speak sText, 1 ', 1 ', 0 'ou SVSFlagsAsync
End With
MsgBox "Fonctionne si le message s'affiche avant la fin du texte lu"
End Sub
Je viens de me rendre compte d’un truc
Le code de lecture asynchrone fonctionne bien mais est coupé automatiquement car la macro se ferme avec end sub
Donc pour résumer ma macro devrait dans l’idéal lire le texte et me laisser travailler sur solidworks
Dans les faits la macro n’a pas le temps de lire le texte qu’elle se ferme puisque je n’ai pas d’autres actions après
Donc il faudrait que la lecture se poursuive tout en me laissant manipuler solidworks et je ne sais pas si c’est possible d’exporter la commande vocale hors de vba (batch…)
Le pb c’est que ça revient au même que si c’est synchrone ce que je ne souhaite pas
j’ai pas l’impression que ce soit possible.
Soit asynchrone et en fin de sub que le texte soit fini ou pas cela coupe. (même en incluant les texte dans une fonction ou un autre sub appelé par call ou autre procédure)
Soit pas asynchrone et on attends la fin du texte pour passer à l’instruction suivante.
Je ne sais pas dans quel cadre et pourquoi exactement tu veux mettre du texte vocal, mais personnellement j’en suis pas fan du tout, et je préfère amplement le msgbox ou zone de texte qui permet de continuer les instructions tout en affichant le texte.
Sur des macros que l’on lance très souvent cela me prendrais très vite la tête.
Et pour un BE partagé par 20 collègues comme nous je t’en parle même pas, le son est coupé d’ailleurs sur l’ensemble des postes.
En programmation asynchrone, sur du .NET par exemple, on est obligés de donner une instruction Await. Sinon on n’attend pas qu’une instruction asynchrone se termine et c’est ce qui donne tout son sens à ce type de programmation.
Donc tu dois appeler ta méthode SpVoice, puis exécuter un ensemble de tâches si tu le souhaites et ensuite appeler WaitUntilDone
Merci pour vos réponses
pour le moment je ne vois pas de solution, je laisse en stand by
Pour résumer tu as deux solutions :
Soit tu mets WaitUntilDone avant EndSub
Soit tu lances ta fonction sur un autre thread
@Konti dans un autre thread, cela ne fonctionne pas non plus car il interrompt le texte dès la fin de la fonction ou du sub appelé.
Et si tu lances non asynchrone il attends la fins de la fonction ou du sub pour continuer.
j’ai finis par trouver
Function Msg_sonore(sText As String) As Boolean
'Permet de lire le message de manière asynchrone en passant par .vbs
Dim swApp As Object
Dim fso, Dossier, Fichier, f
Dim oWsh As Variant
Set swApp = Application.SldWorks
Set oWsh = CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
Dossier = Left(swApp.GetCurrentMacroPathName, InStrRev(swApp.GetCurrentMacroPathName, "\"))
Fichier = "PART_MEP_suppr contraintes.vbs"
If Dir(Dossier & Fichier) <> "" Then fso.DeleteFile Dossier & Fichier
Set f = fso.CreateTextFile(Dossier & Fichier, True)
f.WriteLine "'Fichier temporaire, pour lecture message sonore asynchrone"
f.WriteLine "Dim speech"
f.WriteLine "Set speech = CreateObject(""SAPI.SpVoice"")"
f.WriteLine "speech.Speak """ & sText & """"
f.Close
oWsh.ShellExecute Dossier & Fichier
Set oWsh = Nothing
End Function