Solidworks VBA-Sprache

Hallo;

Haben Sie versucht, msgBoxen durch " sendmsgtoUser2 " zu ersetzen?

https://help.solidworks.com/2022/English/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.ISldWorks~SendMsgToUser2.html?verRedirect=1

Herzliche Grüße.

… In der Zwischenzeit habe ich das gefunden:

und das:

Wenn es helfen kann...

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

Und funktioniert es ohne den asynchronen Teil oder nicht?

.SVSFlagsAsync

mit oder ohne . SVSFlagsAsync ist in Solidworks dasselbe, der Text wird synchron gelesen

Soweit ich weiß, ist es gut gelesen, aber nicht asynchron und es spielt keine Rolle, ob . SVSFlagsAsync ist vorhanden oder nicht.
Stimmt das?

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

im VBE-Editor mit der Taste F8 wird der Text jedoch asynchron mit ,1 oder SVSFlagsAsync gelesen

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.

Wenn jemand eine Code-Idee hat

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

Ich habe gerade etwas gemerkt

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 denke, wir sollten ihn bitten, mit WaitUntilDone zu warten

Das Problem ist, dass es auf das Gleiche hinausläuft, als ob es synchron wäre, was ich nicht möchte

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.

1 „Gefällt mir“

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

Vielen Dank für Ihre Antworten
Im Moment sehe ich keine Lösung, ich lasse es in Bereitschaft

Zusammenfassend haben Sie zwei Lösungen:
Entweder setzen Sie WaitUntilDone vor EndSub
Entweder starten Sie Ihre Funktion in einem anderen Thread

@Konti in einem anderen Thread funktioniert es auch nicht, da es den Text unterbricht, sobald die aufgerufene Funktion oder das aufgerufene Sub endet.
Und wenn Sie nicht asynchron ausführen, wird auf das Ende der Funktion oder des Subs gewartet, um fortzufahren.

Endlich fand ich

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
1 „Gefällt mir“