API / VBA pour récupération des propriétés personnalisées d'un composant d'un assemblage

Bonjour à tous,

Je travail actuellement sur un projet d'automatisation de certains dossiers et j'aimerai intégrer quelques fonctionnalitées à ma macro existante, qui insert et exporte une nomenclature dans un assemblage au format TXT.

Je remercie ceux qui prendront le temps de me lire, et de m'accorder quelques instants pour me débloquer. :)

La partie export et enregistrement de la nomenclature se passe bien, mais j'ai un problème lorsque j'essaie de récupérer les valeurs des propriétés d'un des composants (le seul à avoir ces propriétés là) : CLIENT, LOCAL, CPLT LOCAL, AFFAIRE, DESSINATEUR, QTE ASS) avant de les copier sous le même nom = valeur dans l'assemblage.

J'avais bricolé quelque chose en "manipulant" le tableau Excel exporté à base de :

AFFAIRE = Range("BG2:BG1000").Find("*", , , , xlByColumns).Value            'Cherche la première valeur non vide
On Error Resume Next                                            

 

Mais cela ne fonctionne que dans le cas ou la propriétés existe belle et bien. Bref, je souhaiterai trouver une solution plus précise et sûr.

J'ai pas mal cherché et essayé divers bout de code et/ou solution trouvé sur le site ou ailleurs, mais je ne maîtrise vraiment pas assez les API et le code VBA pour l'adapter à mon besoin.

J'ai cependant identifié quelques fonction intéressantes, dont voici ci dessous un exemple pour simplement lire la propriétés CODE dans une MsgBox. (ce serait déjà une bonne étape :) mais ne fonctionne malheureusement pas)  

 Dim swSelMgr                As SldWorks.SelectionMgr
    Dim swSelComp               As Variant
    Dim swSelModel              As SldWorks.ModelDoc2
    Dim swCustPropMgr           As CustomPropertyManager
    Dim swEnt                   As SldWorks.Entity
    Dim val                     As String
    Dim valout                  As String
 
   
    Set swSelComp = swBOMAnnotation.GetComponents2(2, Configuration)
    
    Set swCustPropMgr = swSelComp.Extension.CustomPropertyManager("")
    
    swCustPropMgr.Get4 "CODE", False, val, valout 'Change property name here
    MsgBox "Value: " & val & "Evaluated value: " & valout

 

L'idée final serait donc de récupérer la variable du composant, la copier dans l'assemblage, puis dans chacune des pièce ayant la propriétés CODIFICATION ="X"

Auriez vous des conseils et des corrections évidentes à me partager afin de me débloquer ? Je vous en remercie grandement par avance. N'hésitez pas à me demander plus de précisions.

Je vous joint mes deux bouts de code, dont un vraiment brouillon me servant pour mes recherches / test... Le second est le plus simple qui fonctionne lorsque les propriétés sont rentrées.

PS : Je précise quand même que je n'ai pas les outils myCADtools de dispo.

Merci à tous.

 

Mickael                              


test_export_txt_nomenclature.swp

Et voici le second bout de code "plus simple qui fonctionne lorsque les propriétés sont rentrées." :)


enregistrement_nomenclature.swp

Bonjour,

commence déjà par modifier ta macro "enregistrement_nomenclature" en mettant la ligne "On Error Resume Next" en début de code (juste en dessous de ta ligne "Sub main()") et pas la peine d'en mettre plusieurs, cette ligne est une commande de gestion d'erreur, aucun lien avec une quelconque boucle, regarde par ICI.

Cordialement,

1 « J'aime »

Pour le point 2 : pour pouvoir modifier les propriétés des pièces il te faut effectivement utiliser la fonction GetComponents2 puis pour chaque composant utiliser la fonction GetModelDoc2 pour pouvoir travailler sur ces propriétés.

Cordialement,

1 « J'aime »

Bonjour,

J'étais effectivement tombé sur pas mal de vos réponses pendant mes recherches, je comptais pas mal sur votre intervention. :)

Et je vous en remercie grandement, j'ai juste déplacé ma fonction "On Error Resume Next" au début, puis également ajouter :

If Cells(I + 1, J + 1) = " " Then
        Cells(I + 1, J + 1).ClearContents
        End If

  puisqu' après l'export des propriétés les cellules ne sont pas vides mais contiennent toutes un espace (" "). J'imagine que ça perturbai la suite de ma macro... surtout le:

AFFAIRE = Range("BG2:BG1000").Find("*", , , , xlByColumns).Value            'Cherche la première valeur non vide

 

En revanche j'aimerai tout de même réussir à trouver le moyen d'extraire les propriétés personnalisée des composants directement via   GetComponents2 puis  GetModelDoc2 mais pour cela il va falloir que je continue mes recherches et que je demande sans doute un peu d'aide ;)

Merci mille fois pour m'avoir débloqué de ce premier cas en tout cas. :)

 

Très bonne fin de journée à vous,

 

Cordialement,

 

Mickael