Macro multiplication

Bonjour,
j’aurais besoin de vos compétences en VBA.

J’ai déjà une macro qui créé notamment une propriété personnalisée qui se nomme POIDS et qui utilise la valeur solidworks « SW-Mass ».

Je voudrais que dans cette macro, une propriété personnalisée SURFACE PIECE soit créée et que sa valeur soit le résultat d’une multiplication de « SW-Mass » par un RATIO numérique spécifique.

Mais je bloque un peu avec mon niveau VBA minable … Quelqu’un peut-il m’aider svp ?

Bonjour,

Suffit de récupérer la valeur, la convertir en nombre puis faire une multiplication. Convertir le résultat en texte et le mettre dans la propriété perso

1 « J'aime »

Bonjour,
Si la version est récente que la 21, possible d’utiliser directement le type « equation » dans le « propriété manager » , sinon declare la dans "equation manager " puis créé un lien vers une propriété, ça va se mettre à jour automatiquement

1 « J'aime »

Merci beaucoup @Cyril.f et @Lynkoa15, mais avec mon niveau minable, je ne sais pas du tout comment m’y prendre.
Auriez vous un petit exemple de code afin que j’adapte cela à ma macro ? :sweat_smile:

Bonjour,

En gros ça donnerait ça:

Dim swApp               As SldWorks.SldWorks
Dim swModel             As SldWorks.ModelDoc2
Dim swModelDocExt       As ModelDocExtension
Dim swCustProp          As CustomPropertyManager
Dim sMasse              As String
Dim sValout             As String
Dim sVal                As String

Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swModelDocExt = swModel.Extension
Set swCustProp = swModelDocExt.CustomPropertyManager("Défaut") 'Si la propriété est dans l'onglet personnaliser, laisser vide en remplaçant "Défaut" par ""
bRet = swCustProp.Get6("Masse", False, sValout, sMasse, False, False) 'Récupération de la propriété de masse, changer le nom de la propriété en fonction de votre modèle
sVal = CStr(CDec(sMasse) * 3) 'Conversion du texte en valeur décimale, multiplication x 3 et conversion en donné de type texte
bRet = swCustProp.Set2("Ra", sVal) 'Renseignement de la propriété Ra avec la valeur convertie en texte
End Sub


3 « J'aime »

Merci @Cyril.f , je vais commencer à partir de cela :+1:

@Cyril.f , j’ai copié/collé les lignes et j’ai modifié ce qui devait l’être mais la macro bloque à la ligne sVal :


J’ai cherché dans la syntaxe mais je ne vois rien d’anormal. J’avais un ratio avec décimale, donc j’ai testé avec un ratio de 2 mais la macro plante quand même.
Auriez-vous une idée du soucis ?
Merci

Bonjour,
Quel est le message d’erreur et sur quelle version de SW êtes vous?

2 « J'aime »

Bonjour @Cyril.f
Voici le message d’erreur :
image
Et je suis sur Solidworks 2022 Sp05

Je n’ai pas ce soucis, possibilité de me transmettre un fichier test avec les propriétés pour vérifier?

1 « J'aime »

Ok, voici la pièce que j’ai testé ainsi que la macro :
TEST POTEAU HEXA.SLDPRT (567,1 Ko)
00-MASSE-SURFACE.swp (36 Ko)

Aucun problème de mon côté quel que soit la valeur du coefficient (faut bien mettre un point en tant que virgule).
peut-être vérifier dans les références du projet de macro:
image
Sinon reste peut-être une subtilité du côté des paramètres régionaux du poste et du séparateur décimal.

2 « J'aime »

@Cyril.f
Voici mes références Macro :

Et voici mes param^tres régionaux :

Essayez en remplaçant la virgule par un point.

2 « J'aime »

Bonjour @Cyril.f
La macro fonctionne uniquement si je créé la propriété SURFACE PIECE dans F8.
Si le champ n’est pas créé, rien ne se produit.
J’ai cherché comment créé le champ automatiquement, mais je bloque.

Voilà ce que j’ai essayé de bricoler sans réussite :

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModelDocExt As ModelDocExtension
Dim swCustProp As CustomPropertyManager
Dim sMasse As String
Dim sValout As String
Dim sVal As String
Dim bRet As String

Sub main()

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swModelDocExt = swModel.Extension

Set swCustProp = swModelDocExt.CustomPropertyManager(« PC ») 'Si la propriété est dans l’onglet personnaliser, laisser vide en remplaçant « PC » par «  »

bRet = swCustProp.Get6(« POIDS », False, sValout, sMasse, False, False) 'Récupération de la propriété de masse, changer le nom de la propriété en fonction de votre modèle

sVal = CStr(CDec(sMasse) * 2) 'Conversion du texte en valeur décimale, multiplication x RATIO et conversion en donné de type texte

'bRet = swCustProp.Set2(« SURFACE PIECE », sVal) 'Renseignement de la propriété SURFACE PIECE avec la valeur convertie en texte

bRet = swModel.AddCustomInfo3(« PC », « SURFACE PIECE », sVal)

End Sub

J’ai essayé avec cette commande, mais je pense que quelquechose cloche :
bRet = swModel.AddCustomInfo3(« PC », « SURFACE PIECE », sVal)

Est ce que vous avez une idée pour corriger cela s’il vous plait?

Plutôt que :
'bRet = swCustProp.Set2(« SURFACE PIECE », sVal)

Mettre quelque chose comme:
bRet = swCustPropMgr.Add3(« SURFACE PIECE », swCustomInfoType_e.swCustomInfoDate, sVal, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)

Set c’est quand la propriété est déjà existante, il me semble.

Voir ce lien:
https://help.solidworks.com/2020/English/api/sldworksapi/Add_and_Get_Custom_Properties_Example_VB.htm?verRedirect=1

Ou plus complet:

2 « J'aime »

C’est ça.
Si la propriété n’existe pas il faut la créer, si elle existe il arrive également que SW n’arrive pas à écrire (ça m’est arrivé sur d’anciens fichiers) et il faut dans ce cas supprimer et recréer la propriété.

2 « J'aime »

Je me réponds à moi même, c’est réglé avec Add3 qui permet de faire un écrasement si la propriété existe déjà.
Donc en gros:

swCustProp.Add3("SURFACE PIECE", 30, sVal, 1)
2 « J'aime »

Bonjour, merci pour vos réponses.
La macro 00-MASSE-SURFACE fonctionne bien. Toutefois, savez vous comment n’avoir que 3 décimales pour la valeur de surface ?
00-MASSE-SURFACE.swp (45,5 Ko)

Et j’aimerais intégrer cette macro dans la macro 00-MACRO HEXA ci dessous :
00-MACRO HEXA.swp (63,5 Ko)

J’ai testé, mais j’ai cette erreur lorsque je lance la macro :
image

Le débogage me donne ceci :

Savez vous comment corriger cela ?

Merci

Bonjour,

Alors pour l’erreur, c’est probablement la variable swCustProp.Get6 qui est vide, donc soit la propriété n’existe pas soit il y a un problème de déclaration de variables.
Pour limiter à 3 décimales il faut utiliser la fonction « Format »:

    sVal = CStr(Format(CDec(sMasse) * 0.0556, "0.000"))

2 « J'aime »