Macro SolidWorks via Excel

Bonjour, 

Je cherchais une macro pour faire l'equivalent de l'action [Alt + TAB] (changer de document actif) et j'ai trouve ce code:

 

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

 

et ca marche parfaitement lorsque le lance cette macro directement via SolidWorks.

Mon probleme est que je suis en train de creer un outils qui se lance via Excel et donc doit ecrire toute mes macros sous VBA Excel et non VBA Solidworks.

lorsque je copie/colle ce code dans ma macro Excel, voici le message d'erreur que j'ai:

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

si je clique sur debug, il me surligne cette ligne 

Set swApp = Application.SldWorks

 

j'ai essaye plusieurs choses mais je n'ai plus trop d'idee...

 

Sur des precedantes macros j'ai ce code:

Set swApp = CreateObject("SldWorks.application")

 

J'ai donc essaye de faire la meme pour celle ci mais ca ne marche pas je recupere ce message d'erreur:

Run-time error'13':
Tpe mismatch

pointant sur cette ligne:

swApp.ActivateDoc2 opendocs(1), False, 0

 

sur VBA Excel j'ai les references SldWorks 2017 Type Library, SOLIDWORKS 2017 Commends type library et SOLIDWORKS 2017 Constant type library d'activees.

 

Est-ce que quelqu'un a des idees?

Merci d'avance

Yves

Salut,

Juste "pourquoi" changer de document actif à partir d'excel ?

Sinon sur SW c'est [Ctrl] + [Tab]

Salut remrem,

Oui je sais bien que c'est [Ctrl]+[Tab] la commande clavier sur solidworks mais si je dois faire ca depuis Excel c'est parceque je suis en train de creer un  outils de configuration de machine qui se lance depuis Excel, donc toutes les macros solidworks sont ecrite sous Excel

Si tu veux faire ta macro de configuration sur Excel. Tu dois en aucun cas faire cela !

Tu dois créer un objet pour chaque document ouvert. Et ensuite tu dois sélectionner un document et réaliser tes opérations, puis sélectionner un autre document et réaliser tes opérations, etc...

Sinon si l'utilisateur change de doc durant le traitement tout ton code s'écroule.

Comment ouvres-tu tes documents dans ta macro ?

1 « J'aime »

Ma macro dans Excel consiste a ouvrir un fichier solidworks (un assemblage compose de plusieur pieces) puis remplace toutes les pieces qui le composent pas des pieces dont les noms et chemins ont ete selectionne dans le fichier excel. Pour l'instant mon programme marche tres bien.

Pour l'une des pieces, je doit l'ouvrir avant d'ouvrir l'assemblage dans le but de modifier 2/3 cotes (j'ai deja un cote qui marche pour ca) puis l'enregistrer sous un nouveau nom. c'est un peu simplifier mais a un moment j'ouvre le plan et je dois rebasculer vers le document piece.

lors du remplacement des pieces, la macro ira chercher cette nouvelle piece (pas de pb pour ca)

pour ouvrir la piece:

Set swApp = CreateObject("SldWorks.application")

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

 ma pieces s'ouvre bien ainsi que son plan (avec la meme methode).

ensuite j'utilise le code que j'ai poste dans ma question d'origine en semplacant swApp par swApp2 vu que swApp est deja utilise dans ce que je viens de copier/coller.

il n'y a aucune chance pour que l'utilisateur change le doc durant le traitement de mon code vu que toutes les etape de font de maniere automatique, a la suite apres avoir clique sur un seul bouton.

 

Je te conseil grandement de lire l'aide API de SW.

Pour ouvrir un document, je te conseil de ne pas utiliser les commandes "ShellExecute" mais de le faire avec les API de SW comme ici : http://help.solidworks.com/2018/english/api/sldworksapi/Open_Assembly_Document_Example_VB.htm

Tu pourras ainsi ouvrir plusieurs documents sur le même processus, les modifier de façon indépendante, les fermer...

Il n'est pas conseiller d'ouvrir plusieurs processus de SW car cela cause de lourd dysfonctionnement, sans parler de la gestion des fichiers...

1 « J'aime »

Alors, 

je viens de faire un essay en faisant exactement ce qui est ecris sur la page que tu a envoye.

j'ai le meme message d'erreur:

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

pointant sur le ligne:

Set swApp = Application.SldWorks

 

Je ne suis malheureusement pas tres cale en macro SolidWoprks et suis donc un peu perdu avec tous les objets, processus, application...

Bonjour,

Essaye en démarrant ta macro comme suit :

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

 

Ce qui permet soit de créer une instance Solidworks soit de se raccrocher à celle existante si un Solidworks est déjà ouvert puis de vérifier si un document existe.

Il te faut au minimum la référence SldWorks 2017 type Library.

Cordialement,

1 « J'aime »

Bonjour,

Desole pour mon temps de reponse mais j'ai du basculer sur d'autre projets.

Je pense y voir un peu plus claire maintenant, j'arrive a gerer mon application SolidWorks ouverte... mon probleme maintenant est que, dans ma sequence d'actions que je veux faire faire a la macro, je dois ouvrir une piece, sa mise en plan, revenir a la piece, l'enregistrer sous un nouveau nom, fermer la piece, enregistrer la mise en plan sous le meme nom que la nouvelle piece puis fermer la mise en plan.

J'arrie a faire tout ca mais mon probleme est que je dois refaire la meme chose avec une seconde piece apres tout ca, et la... ca ne marche pas.

Pour fermer mon document piece justilise :

swApp.CloseDoc NOMFICHIEROUVERT.SLDPRT

 

et pour fermer mon document de mise en plan j'utilise :

swApp.CloseDoc swModel.GetTitle

 

Car 

swApp.CloseDoc NOMFICHIEROUVERT.SLDDRW

ne marche pas.

Cette methode ferme bien mon fichier de mise en plan mais ferme aussi la fenetre solidworks et je pense que mon probleme vient de la car l'application, elle, n'est pas fermee pour autant.

et lorsque apres je demande d'ouvrir la deuxiem piece avec :

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

(Meme methode utilisee avant pour avrir ma premiere piece ainsi que sa mise en plan), j'ai le message d'ereur suivant:

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

Automation error
The remote procedure call failed

pointant sur :

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

 

Est-ce que quelqu'un aurait des idees?

Merci d'avance

Yves

Bonjour,

Si tu ouvres Solidworks par un CreateObject dans la macro, quand tu fermes le dernier document cela déconnecte l'object "SLDWORKS.application". Pour éviter ça tu peux ouvrir ton fichier suivant avant de fermer le dernier document du premier traitement :

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

 

Une autre solution est de réinitialiser le swApp à Nothing puis de recréer un object avant de traiter le fichier 2:

    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

 

Une autre solution serait d'ouvrir Solidworks par un Shell ("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe") en début de macro puis de se raccrocher à ce Solidworks, ce que fait la ligne Set swApp = Application.SldWorks dans le if du début. Attention, l'ouverture de Solidworks par ce principe est beaucoup plus longue et peut t'obliger à mettre une tempo avant de continuer le traitement, et en plus c'est quand même, à mon avis, nettement moins propre.

Cordialement,

2 « J'aime »

Bonjour et bonne annee a tous

Encore une fois, desole pour le temps de reponse.

Vu que j’ai deux paires (fichier PART + fichier DRW) a ouvrir et enregistrer sous un nouveau nom, j’ai donc essayer d’ouvrir le deuxieme fichier PART ainsi que son DRW avant de fermer le premier fichier DRW, je m’explique:

  • - J’ouvre PART1
  • - J’ouvre DRW1
  • - Je reviens sur PART1
  • - Je ferme PART1
  • - J’ouvre PART2
  • - J’ouvre DRW2
  • - Je reviens sur PART2
  • - Je ferme PART2

Et maintenant je suis revenue sur DRW2 mais vu que j’ai egalement toujours DRW1 d’ouvert, je devrais normalement pouvoir fermer DRW2 … mais non… pas de messages d’erreur mais ni DRW2 ni DRW1 ne se ferment.

En revanche, si je procede de la sorte:

  • - J’ouvre PART1
  • - J’ouvre DRW1
  • - Je reviens sur PART1
  • - Je ferme PART1
  • - J’ouvre PART2
  • - J’ouvre DRW2
  • - Je ferme DRW2
  • - Je ferme PART2

Dans ce cas, DRW2 se ferme ainsi que PART2

Des idees?

Merci

Yves

Bonjour,

Attention, dans l'exemple donné plus haut, j'ai joué avec plusieurs objects ModelDoc2 :

Dim swModelUn As SldWorks.ModelDoc2

Dim swModelDeux As SldWorks.ModelDoc2

Objects qu'ils faut manipuler dans l'ordre pour les définir, les activer et les fermer. On n'a vite fait de ce mélanger les pinceaux et alors soit on ferme le mauvais document, soit on tente de fermer un object non définit, etc ...

Cordialement,