Makro SolidWorks über Excel

Hallo 

Ich habe nach einem Makro gesucht, um das Äquivalent der Aktion [Alt + TAB] (aktives Dokument ändern) auszuführen, und ich habe diesen Code gefunden:

 

Sub main()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim vModels As Variant
Dim count As Integer
Dim opendocs As New Collection
Dim docname As Variant
Dim currentdocTitle As String
Dim title As String

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
currentdocTitle = swModel.GetTitle
vModels = swApp.GetDocuments

For count = LBound(vModels) To UBound(vModels) 'get list of open documents

    Set swModel = vModels(count)
    If swModel.Visible <> False Then
        opendocs.Add (swModel.GetTitle)
    End If

Next

count = 0

If opendocs(opendocs.count) = currentdocTitle Then ' if its the last document in the list, switch to the first document

    swApp.ActivateDoc2 opendocs(1), False, 0
 
End

Else ' else find the next document and activate
 
    For count = 1 To opendocs.count
 
        If opendocs(count) = currentdocTitle Then
            swApp.ActivateDoc2 opendocs(count + 1), False, 0
            End
        End If
 
    Next
 
End If

End Sub

 

und es funktioniert perfekt, wenn das Makro direkt über SolidWorks gestartet wird.

Mein Problem ist, dass ich ein Tool erstelle, das über Excel gestartet wird und daher alle meine Makros in VBA Excel und nicht in VBA Solidworks schreiben muss.

Wenn ich diesen Code in mein Excel-Makro kopiere / einfüge, erhalte ich folgende Fehlermeldung:

run-time error '438'
Object doesn't support this property or method

Wenn ich auf Debuggen klicke, wird diese Zeile für mich hervorgehoben

Set swApp = Application.SldWorks

 

Ich habe schon einiges ausprobiert, aber ich habe nicht mehr viel Ahnung...

 

Bei früheren Makros habe ich diesen Code:

Set swApp = CreateObject("SldWorks.application")

 

Also habe ich versucht, das Gleiche für diesen zu tun, aber es funktioniert nicht, ich bekomme diese Fehlermeldung:

Run-time error'13':
Tpe mismatch

Zeigt auf diese Zeile:

swApp.ActivateDoc2 opendocs(1), False, 0

 

In VBA Excel habe ich die Referenzen SldWorks 2017 Type Library, SOLIDWORKS 2017 Commends type library und SOLIDWORKS 2017 Constant type library aktiviert.

 

Hat jemand irgendwelche Ideen?

Vielen Dank im Voraus

Yves

Hallo

Nur "warum" ändern Sie das aktive Dokument von Excel?

Andernfalls ist es in SW [Strg] + [Tab]

Hallo remrem,

Ja, ich weiß, dass es [Strg]+[Tab] der Tastaturbefehl auf Solidworks ist, aber wenn ich dies von Excel aus tun muss, liegt es daran, dass ich ein  Maschinenkonfigurationstool erstelle, das von Excel aus gestartet wird, sodass alle Solidworks-Makros in Excel geschrieben werden

Wenn Sie Ihr Konfigurationsmakro in Excel ausführen möchten. Das dürfen Sie auf keinen Fall tun!

Sie müssen für jedes geöffnete Dokument ein Objekt erstellen. Und dann müssen Sie ein Dokument auswählen und Ihre Vorgänge ausführen, dann ein anderes Dokument auswählen und Ihre Vorgänge ausführen usw.

Andernfalls wird der gesamte Code zusammengebrochen, wenn der Benutzer während der Verarbeitung das Dokument ändert.

Wie öffnen Sie Ihre Dokumente in Ihrem Makro?

1 „Gefällt mir“

Mein Makro in Excel besteht darin, eine Solidworks-Datei (eine Baugruppe, die aus mehreren Teilen besteht) zu öffnen und dann alle Teile zu ersetzen, aus denen sie besteht, nicht Teile, deren Namen und Pfade in der Excel-Datei ausgewählt wurden. Im Moment funktioniert mein Programm sehr gut.

Für eines der Teile muss ich es öffnen, bevor ich die Baugruppe öffne, um 2/3 Seiten zu ändern (ich habe bereits eine Seite, die dafür funktioniert) und es dann unter einem neuen Namen speichern. Es ist eine kleine Vereinfachung, aber irgendwann öffne ich den Plan und muss wieder in den Dokumententeil wechseln.

Beim Austausch der Teile wird das Makro verwendet, um dieses neue Teil zu erhalten (dafür gibt es keine PB)

So öffnen Sie den Raum:

Set swApp = CreateObject("SldWorks.application")

Rep = ShellExecute(0, "open", CHEMIN & "\" & NOM, vbNullString, vbNullString, 5)
Set Part = swApp.ActiveDoc

 Mein Zimmer öffnet sich gut, wie sein Plan (mit der gleichen Methode).

Dann verwende ich den Code, den ich in meiner ursprünglichen Frage gepostet habe, indem ich swApp durch swApp2 ersetze, da swApp bereits in dem verwendet wird, was ich gerade kopiert / eingefügt habe.

Es besteht keine Chance, dass der Benutzer das Dokument während der Verarbeitung meines Codes ändert, da alle Schritte automatisch ausgeführt werden, nachdem auf eine einzige Schaltfläche geklickt wurde.

 

Ich empfehle Ihnen dringend, die API-Hilfe von SW zu lesen.

Um ein Dokument zu öffnen, rate ich Ihnen, nicht die "ShellExecute"-Befehle zu verwenden, sondern dies mit den SW-APIs wie hier zu tun: http://help.solidworks.com/2018/english/api/sldworksapi/Open_Assembly_Document_Example_VB.htm

Sie werden in der Lage sein, mehrere Dokumente im selben Prozess zu öffnen, sie unabhängig voneinander zu ändern, zu schließen...

Es ist nicht ratsam, mehrere SW-Prozesse zu öffnen, da dies schwerwiegende Fehlfunktionen verursacht, ganz zu schweigen von der Dateiverwaltung...

1 „Gefällt mir“

Dann 

Ich habe gerade einen Aufsatz gemacht, der genau das tut, was auf der Seite steht, die Sie gesendet haben.

Ich erhalte die gleiche Fehlermeldung:

run-time error '438'
Object doesn't support this property or method

Zeigt auf die Zeile:

Set swApp = Application.SldWorks

 

Leider bin ich nicht sehr gut in SolidWoprks Makro und bin daher etwas verloren mit all den Objekten, Prozessen, Anwendungen...

Hallo

Versuchen Sie, das Makro wie folgt zu starten:

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

If swApp Is Nothing Then
   Set swApp = CreateObject("SLDWORKS.application")
   swApp.Visible = True
Else
   Set swApp = Application.SldWorks
End If

Set swModel = swApp.ActiveDoc
    
If swModel Is Nothing Then
   MsgBox "Aucun document SW n'est ouvert"
Else
   MsgBox swModel.GetTitle
End If

 

Auf diese Weise können Sie entweder eine Solidworks Instanz erstellen oder an die vorhandene Instanz anhängen, wenn bereits ein Solidworks geöffnet ist, und dann prüfen, ob ein Dokument vorhanden ist.

Sie benötigen mindestens den SldWorks 2017-Referenztyp Library.

Herzliche Grüße

1 „Gefällt mir“

Hallo

Entschuldigung für meine Reaktionszeit, aber ich musste zu anderen Projekten wechseln.

Ich glaube, ich kann jetzt etwas klarer sehen, ich kann meine geöffnete SolidWorks Anwendung verwalten... Mein Problem besteht nun darin, dass ich in der Abfolge von Aktionen, die das Makro ausführen soll, einen Raum und seine Zeichnung öffnen, zum Raum zurückkehren, ihn unter einem neuen Namen speichern, den Raum schließen, die Zeichnung unter demselben Namen wie den neuen Raum speichern und dann die Zeichnung schließen muss.

Ich muss das alles machen, aber mein Problem ist, dass ich nach all dem das Gleiche noch einmal mit einem zweiten Teil machen muss, und dann... Es funktioniert nicht.

So schließen Sie mein Dokument mit einem Blocksatzdokument:

swApp.CloseDoc NOMFICHIEROUVERT.SLDPRT

 

Und um mein Zeichendokument zu schließen, verwende ich:

swApp.CloseDoc swModel.GetTitle

 

Weil 

swApp.CloseDoc NOMFICHIEROUVERT.SLDDRW

funktioniert nicht.

Diese Methode schließt meine Zeichnungsdatei, aber auch das SOLIDWORKS-Fenster, und ich denke, mein Problem kommt daher, weil die Anwendung trotz allem nicht geschlossen ist.

und wenn ich darum bitte, den zweiten Raum zu öffnen mit:

    Set swDocSpecification = swApp.GetOpenDocSpec(PATH & "\" & NOUVELLEPIECEAOUVRIR.SLDPRT)
    Set swModel = swApp.OpenDoc7(swDocSpecification)

(Die gleiche Methode, die ich zuvor verwendet habe, um mein erstes Stück sowie seine Zeichnung zu verschönern), habe ich folgende Nachricht:

Run-time error '-2147023170 (800706be)':

Automation error
The remote procedure call failed

Zeigt auf:

Set swDocSpecification = swApp.GetOpenDocSpec(PATH & "\" & NOUVELLEPIECEAOUVRIR.SLDPRT)

 

Hat jemand irgendwelche Ideen?

Vielen Dank im Voraus

Yves

Hallo

Wenn Sie Solidworks mit einem CreateObject im Makro öffnen, wird beim Schließen des letzten Dokuments das Objekt "SLDWORKS.application" getrennt. Um dies zu vermeiden, können Sie die folgende Datei öffnen, bevor Sie das letzte Dokument des ersten Prozesses schließen:

Sub Macro1()

    Dim swApp As SldWorks.SldWorks
    Dim swModelUn As SldWorks.ModelDoc2
    Dim swModelDeux As SldWorks.ModelDoc2

    If swApp Is Nothing Then
        Set swApp = CreateObject("SLDWORKS.application")
        swApp.Visible = True
    Else
        Set swApp = Application.SldWorks
    End If

    Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\DRO\Desktop\piece1520.sldprt")
    Set swModelUn = swApp.OpenDoc7(swDocSpecification)
    MsgBox swModelUn.GetTitle
    
    Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\DRO\Desktop\piece1520.slddrw")
    Set swModelUn = swApp.OpenDoc7(swDocSpecification)
    MsgBox swModelUn.GetTitle
    
    swApp.CloseDoc swModelUn.GetTitle
    
    Set swModelUn = swApp.ActiveDoc
    MsgBox swModelUn.GetTitle
    
    Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\DRO\Desktop\piece1532.sldprt")
    Set swModelDeux = swApp.OpenDoc7(swDocSpecification)
    
    swApp.CloseDoc swModelUn.GetTitle

    MsgBox swModelDeux.GetTitle
    
    swApp.CloseDoc swModelDeux.GetTitle
    
End Sub

 

Eine andere Lösung besteht darin, die swApp auf Nothing zurückzusetzen und dann ein Objekt neu zu erstellen, bevor Datei 2 verarbeitet wird:

    Set swApp = Nothing
    
    If swApp Is Nothing Then
        Set swApp = CreateObject("SLDWORKS.application")
        swApp.Visible = True
    Else
        Set swApp = Application.SldWorks
    End If
    
    Set swDocSpecification = swApp.GetOpenDocSpec("C:\Users\DRO\Desktop\piece1533.sldprt")
    Set swModelDeux = swApp.OpenDoc7(swDocSpecification)
    
    MsgBox swModelDeux.GetTitle
    
    swApp.CloseDoc swModelDeux.GetTitle

 

Eine andere Lösung wäre, Solidworks mit einer Shell ("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe") am Anfang des Makros zu öffnen und dann mit diesem Solidworks zu verknüpfen, was die Zeile Set swApp = Application.SldWorks am Anfang des if tut. Seien Sie vorsichtig, das Öffnen von Solidworks nach diesem Prinzip ist viel länger und kann Sie dazu zwingen, ein Tempo festzulegen, bevor Sie mit der Verarbeitung fortfahren, und außerdem ist es meiner Meinung nach immer noch viel weniger sauber.

Herzliche Grüße

2 „Gefällt mir“

Hallo und ein frohes neues Jahr an alle

Nochmals Entschuldigung für die Reaktionszeit.

Da ich zwei Paare (PART-Datei + DRW-Datei) zu öffnen und unter einem neuen Namen zu speichern habe, habe ich versucht, die zweite PART-Datei und ihre DRW zu öffnen, bevor ich die erste DRW-Datei geschlossen habe, lassen Sie mich das erklären:

  • - Ich öffne TEIL1
  • - Ich öffne DRW1
  • - Ich komme zurück zu TEIL1
  • - Ich schließe TEIL1
  • - Ich öffne TEIL2
  • - Ich öffne DRW2
  • - Ich komme zurück zu TEIL2
  • - Schließen Sie TEIL2

Und jetzt bin ich wieder bei DRW2 angekommen, aber da ich auch DRW1 noch offen habe, sollte ich DRW2 schließen können... aber nein... keine Fehlermeldungen, aber weder DRW2 noch DRW1 schließen.

Auf der anderen Seite, wenn ich wie folgt vorgehe:

  • - Ich öffne TEIL1
  • - Ich öffne DRW1
  • - Ich komme zurück zu TEIL1
  • - Ich schließe TEIL1
  • - Ich öffne TEIL2
  • - Ich öffne DRW2
  • - Ich schließe DRW2
  • - Schließen Sie TEIL2

In diesem Fall wird DRW2 zusammen mit TEIL2 geschlossen

Irgendwelche Ideen?

Vielen Dank

Yves

Hallo

Seien Sie vorsichtig, in dem oben angegebenen Beispiel habe ich mit mehreren ModelDoc2-Objekten gespielt:

Dim swModelUn As SldWorks.ModelDoc2

Dim swModelTwo As SldWorks.ModelDoc2

Objekte, die manipuliert werden müssen, um sie zu definieren, zu aktivieren und zu schließen. Sie werden nicht schnell verwechselt und schließen dann entweder das falsche Dokument, oder Sie versuchen, ein undefiniertes Objekt zu schließen, usw.

Herzliche Grüße