"Wybierz szkic bez wchodzenia w niego "gdzie: "Wprowadzanie szkicu
Sub Piece_suppr_bancales()
Dim swApp As SldWorks.SldWorks
Dim swDoc As SldWorks.ModelDoc2
Dim swRelMgr As SldWorks.SketchRelationManager
Dim swSketch As SldWorks.Sketch
Dim vRels As Variant
Dim swRel As SldWorks.SketchRelation
Dim i As Long
Dim sp As Object
Set swApp = Application.SldWorks
Set swDoc = swApp.ActiveDoc
Set swSkMgr = swDoc.SketchManager
Set swSketch = swDoc.GetActiveSketch2
Set sp = CreateObject("SAPI.SpVoice")
If swDoc.SelectionManager.GetSelectedObjectType3(1, -1) = swSelSKETCHES Then
Set swSketch = swDoc.SelectionManager.GetSelectedObject6(1, -1).GetSpecificFeature
Else
sp.Speak "Sélectionner une esquisse"
'sp.Speak "Sélectionner une esquisse", 1 / sp.Speak "Sélectionner une esquisse", SVSFlagsAsync
'asynchrone pour effectuer d'autres tâches en même temps, ne fct que dans VBE pas avec bouton macro
Exit Sub
End If
Set swRelMgr = swSketch.RelationManager
If swRelMgr.GetRelationsCount(swDangling) > 0 Then
vRels = swRelMgr.GetRelations(swDangling)
For i = 0 To UBound(vRels)
Set swRel = vRels(i)
swRelMgr.DeleteRelation swRel
Next i
'MsgBox "Esquisse : " & swSketch.Name & Chr(10) & "Relations bancales supprimées : " & UBound(vRels) + 1
Else
sp.Speak "Esquisse : " & swSketch.Name & Chr(10) & "Pas de relation bancales trouvée"
End If
End Sub
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
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
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.
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
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...)
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