Witam;
Czy próbowałeś zamienić msgBoxes na " sendmsgtoUser2 "?
Pozdrowienia.
… W międzyczasie znalazłem to:
A to:
Jeśli to może pomóc...
Witam;
Czy próbowałeś zamienić msgBoxes na " sendmsgtoUser2 "?
Pozdrowienia.
… W międzyczasie znalazłem to:
A to:
Jeśli to może pomóc...
Witam
Nie chcę msgbox ani sendmsgtoUser2, które są tym samym.
Właśnie wypróbowałem następujące makro, które nie działa asynchronicznie dziwnie
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
I czy działa bez części asynchronicznej, czy nie?
.SVSFlagsAsync
z lub bez . SVSFlagsAsync jest taki sam w Solidworks, tekst jest odczytywany synchronicznie
Z tego co rozumiem jest dobrze czytany, ale nie asynchronicznie i nie ma znaczenia, czy . SVSFlagsAsync jest obecny lub nie.
Czy słusznie?
tak to wszystko i jak wstawię to makro to komunikat jest odczytywany tylko w VBE (F8) ale nie przyciskiem makra
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
Ja też próbuję
. Speak sText, SVSFlagsAsync = True lub false i jest odczytywany synchronicznie w obu przypadkach
Mam wrażenie, że jest to normalne działanie, jeśli wymienię:
.Speak sText, 1
przez:
.Speak sText, 0
Tekst jest dobrze czytany.
Z 1 bez czytania, ponieważ wydaje się, że gdy tylko przejdzie do następnego wiersza kodu, tekst jest przerywany (zanim się zaczął)
To makro pod SW lub excel ma taką samą operację pod oprogramowaniem 2 więc dla mnie nie pochodzi z 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
jednak w edytorze VBE z F8 tekst jest odczytywany asynchronicznie za pomocą ,1 lub SVSFlagsAsync
Tak, ale jeśli szybko klikniesz F8, gdy tylko dotrzesz do msgbox, tekst zostanie wycięty.
W Excelu działają te 2 kody. Jeden asynchronicznie, a drugi nie.
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
Domyślam się więc, że wynika to z zastosowanej funkcji.
Będziemy musieli znaleźć równoważną metodę w SW.
Jeśli ktoś ma pomysł na kod
Nie tworząc funkcji (kodu funkcji bezpośrednio w subie) dobrze odczytuje tekst, jednocześnie wyświetlając 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
Właśnie zdałem sobie z czegoś sprawę
Asynchroniczny kod odczytu działa poprawnie, ale jest automatycznie odcinany, ponieważ makro zamyka się z sub end
Tak więc, aby podsumować moje makro, najlepiej przeczytaj tekst i pozwól mi pracować nad solidworks
W rzeczywistości makro nie ma czasu na przeczytanie tekstu przed zamknięciem, ponieważ nie mam później żadnych innych działań
Tak więc odtwarzanie musiałoby być kontynuowane, pozwalając mi manipulować solidworks i nie wiem, czy możliwe jest wyeksportowanie polecenia głosowego z vba (wsadowo...)
Problem polega na tym, że sprowadza się to do tego samego, co gdyby było synchroniczne, czego nie chcę
Nie mam wrażenia, że to możliwe.
Albo asynchronicznie, a na końcu suba, niezależnie od tego, czy tekst jest skończony, czy nie, jest tnieny. (nawet w tym tekst w funkcji lub innej funkcji wywoływanej przez wywołanie lub inną procedurę)
Albo nie asynchronicznie i czekamy na koniec tekstu, aby przejść do kolejnej instrukcji.
Nie wiem, w jakiej ramce i dlaczego dokładnie chcesz umieścić tekst głosowy, ale osobiście w ogóle nie jestem jego fanem i zdecydowanie wolę msgbox lub pole tekstowe, które pozwala kontynuować instrukcje podczas wyświetlania tekstu.
Na makrach, które uruchamiamy bardzo często, bardzo szybko zajęłoby mi to głowę.
A w przypadku biura projektowego, w którym pracuje 20 kolegów i koleżanek takich jak my, nawet o tym nie mówię, dźwięk jest ucięty na wszystkich stacjach roboczych.
W programowaniu asynchronicznym, na przykład na .NET, jesteśmy zobowiązani do podania instrukcji Await. W przeciwnym razie nie czekasz na zakończenie asynchronicznej instrukcji i to właśnie sprawia, że ten rodzaj programowania jest tak znaczący.
Musisz więc wywołać metodę SpVoice, a następnie uruchomić zestaw zadań, jeśli chcesz, a następnie wywołać WaitUntilDone
Dziękuję za odpowiedzi
Na razie nie widzę rozwiązania, zostawiam go w trybie czuwania
Podsumowując, masz dwa rozwiązania:
Albo umieścisz WaitUntilDone przed EndSub
Albo uruchomisz swoją funkcję w innym wątku
@Konti w innym wątku, to również nie działa, ponieważ przerywa tekst, gdy tylko zakończy się wywoływana funkcja lub sub.
A jeśli uruchomisz działanie nieasynchroniczne, czeka na kontynuację końca funkcji lub sub.
W końcu znalazłem
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