Hier ist mein Makro, die Schwierigkeit hier besteht darin, die Nachricht anstelle einer msgbox laut vorzulesen, aber asynchron (nicht-modal für msgbox)
Diese 2 Codes funktionieren im VBE-Editor mit der Taste F8 Ausführen, aber nicht direkt mit einer Aktionsschaltfläche in Solidworks, falls jemand eine Idee hat
sp. Sprechen Sie " Skizze auswählen ", 1 oder sp. Sprechen, SVSFlagsAsync
"Wählen Sie eine Skizze aus, ohne darauf einzugehen "wo "Eingeben einer Skizze
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
Hallo Ich möchte weder msgbox noch sendmsgtoUser2, was dasselbe ist
Ich habe gerade das folgende Makro ausprobiert, das nicht asynchron seltsam funktioniert
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
Ja, das war's und wenn ich dieses Makro einfüge, wird die Nachricht nur in VBE (F8-Taste) gelesen, aber nicht mit der Makrotaste
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
Ich versuche es auch . Speak sText, SVSFlagsAsync = True oder false und es wird in beiden Fällen synchron gelesen
Ich habe den Eindruck, dass dies der normale Vorgang ist, wenn ich ersetze:
.Speak sText, 1
bis:
.Speak sText, 0
Der Text ist gut gelesen. Mit der 1 kein Lesen, da es scheint, dass der Text unterbrochen wird, sobald er zur nächsten Codezeile wechselt (bevor er begonnen hat)
Dieses Makro unter SW oder Excel hat die gleiche Operation unter der 2-Software, also kommt es für mich nicht aus 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
Ja, aber wenn Sie schnell auf F8 klicken, sobald Sie auf msgbox ankommen, wird der Text abgeschnitten. In Excel funktionieren diese 2 Codes. Das eine asynchron und das andere nicht.
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
Ich vermute, es kommt von der verwendeten Funktion. Wir werden eine äquivalente Methode unter SW finden müssen.
Dadurch, dass keine Funktion erstellt wird (Code der Funktion direkt im Sub), liest es den Text gut, während es die msgbox anzeigt:
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
Der asynchrone Lesecode funktioniert einwandfrei, wird aber automatisch abgeschnitten, da das Makro mit end sub geschlossen wird
Zusammenfassend sollte mein Makro also idealerweise den Text lesen und mich an SolidWorks arbeiten lassen
Tatsächlich hat das Makro keine Zeit, den Text zu lesen, bevor er geschlossen wird, da ich danach keine anderen Aktionen habe
Die Wiedergabe müsste also fortgesetzt werden, während ich SOLIDWORKS manipulieren kann, und ich weiß nicht, ob es möglich ist, den Sprachbefehl aus VBA zu exportieren (Batch...)
Ich habe nicht den Eindruck, dass das möglich ist.
Entweder asynchron und am Ende des Untertitels, unabhängig davon, ob der Text fertig ist oder nicht, wird abgeschnitten. (sogar das Einfügen des Textes in eine Funktion oder ein anderes Sub, das durch einen Aufruf oder eine andere Prozedur aufgerufen wird)
Entweder nicht asynchron und wir warten auf das Ende des Textes, um mit der nächsten Anweisung fortzufahren.
Ich weiß nicht, in welchem Rahmen und warum genau Sie Sprachtext einfügen möchten, aber ich persönlich bin überhaupt kein Fan davon und bevorzuge die msgbox oder Textbox, mit der Sie die Anweisungen fortsetzen können, während der Text angezeigt wird. Bei Makros, die wir sehr oft starten, würde es mir sehr schnell den Kopf zerbrechen. Und für ein Designbüro, das sich 20 Kollegen wie wir teilen, davon spreche ich noch gar nicht, ist der Ton an allen Arbeitsplätzen abgeschaltet.
Bei der asynchronen Programmierung, z. B. unter .NET, sind wir verpflichtet, eine Await-Anweisung zu geben. Andernfalls warten Sie nicht, bis eine asynchrone Anweisung beendet ist, und das ist es, was diese Art der Programmierung so sinnvoll macht.
Sie müssen also die SpVoice-Methode aufrufen, dann eine Reihe von Aufgaben ausführen, wenn Sie möchten, und dann WaitUntilDone aufrufen