Macro multiplication

Ok, here's the part I tested as well as the macro:
HEXA POLE TEST. SLDPRT (567.1 KB)
00-MASS-SURFACE.swp (36 KB)

No problem on my side whatever the value of the coefficient (you have to put a period as a comma).
Maybe check in the macro project references:
image
Otherwise, there may be a subtlety on the side of the locale of the station and the decimal separator.

2 Likes

@Cyril.f
Here are my Macro references:

And here are my regional parameters^tres:

Try replacing the comma with a period.

2 Likes

Hello @Cyril.f
The macro only works if I create the SURFACE PIECE property in F8.
If the field is not created, nothing happens.
I've been looking for how to create the field automatically, but I'm stuck.

Here's what I tried to tinker with without success:

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModelDocExt As ModelDocExtension
Dim swCustProp As CustomPropertyManager
Sun sMass 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") 'If the property is in the customize tab, leave blank by replacing 'PC' with ''

bRet = swCustProp.Get6', False, sValout, sMasse, False, False) 'Retrieving the mass property, changing the name of the property to suit your model

sVal = CStr(CDec(sMass) * 2) 'Convert text to decimal value, multiply x RATIO and convert to text data

'bRet = swCustProp.Set2("SURFACE PIECE", sVal) 'Populate the SURFACE PIECE property with the value converted to text

bRet = swModel.AddCustomInfo3("PC", "SURFACE PIECE", val)

End Sub

I tried with this command, but I think something is wrong:
bRet = swModel.AddCustomInfo3("PC", "SURFACE PIECE", val)

Do you have an idea to correct this please?

Rather than:
'bRet = swCustProp.Set2("SURFACE PIECE", sVal)

Put something like:
bRet = swCustPropMgr.Add3(" SURFACE PIECE ", swCustomInfoType_e.swCustomInfoDate, sVal, swCustomPropertyAddOption_e.swCustomPropertyDeleteAndAdd)

Set is when the property is already existing, it seems to me.

See this link:
https://help.solidworks.com/2020/English/api/sldworksapi/Add_and_Get_Custom_Properties_Example_VB.htm?verRedirect=1

Or more complete:

2 Likes

That's right.
If the property doesn't exist you have to create it, if it does exist it also happens that SW can't write (it happened to me on old files) and in this case you have to delete and recreate the property.

2 Likes

I answer myself, it's fixed with Add3 which allows you to overwrite if the property already exists.
So basically:

swCustProp.Add3("SURFACE PIECE", 30, sVal, 1)
2 Likes

Hello, thank you for your answers.
The macro 00-MASS-SURFACE works well. However, do you know how to have only 3 decimal places for the area value?
00-MASS-SURFACE.swp (45.5 KB)

And I'd like to integrate this macro into the 00-MACRO HEXA macro below:
00-MACRO HEXA.swp (63.5 KB)

I tested, but I get this error when I launch the macro:
image

The debug gives me this:

Do you know how to correct this?

Thank you

Hello

So for the error, it's probably the swCustProp.Get6 variable that's empty, so either the property doesn't exist or there's a variable declaration issue.
To limit to 3 decimal places, you must use the "Format" function:

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

2 Likes

The declaration for swCustProp is missing, by adding the 3 lines above it works (be careful your code still needs a good cleanup (2x Set swModel...)
Here is the code to clean up:

            Dim swModelDocExt           As ModelDocExtension
            Set swModelDocExt = swModel.Extension
            Set swCustProp = swModelDocExt.CustomPropertyManager(tConfig(i))
            bRet = swCustProp.Get6("POIDS", False, sValout, sMasse, False, False)
2 Likes

I answer myself, missing the set of the swCustProp variable hence the error:

    Set swCustProp = swModelDocExt.CustomPropertyManager("POIDS") 'Propriété à changer si ce n'est pas celle-ci

2 Likes

Yes, I confirm that there is some cleaning to be done.
It's DIY, I'm trying to understand all this, not easy :face_with_spiral_eyes:
I cleaned up and I have a new alert about Dim i:

(tConfig(i)) is it good for All Configs?

Hello

Dim i must be declared elsewhere in the code.
It would take the complete code to understand.

2 Likes

Here's the code:
00-MACRO HEXA.swp (61 KB)

So, the problem is the over-positioning of the DIM i as integer declaration.
Basically, since there is the line Set swCustProp = swModelDocExt.CustomPropertyManager(tConfig(i)) at the beginning of the macro, vba initiates the variable i on its own.
It therefore considers that there is a duplicate variable declaration.
For my part, I prefer to have the variable declarations in global for all Subs rather than declaring them in each procedure (depends greatly on the use of variables and the different procedures/functions in the macro)

1 Like

You also have the swApp declaration 2 times, once above the Sub and once at the very beginning of the Sub.
Before making a declaration, you must find out if it is not already existing.
And in the idea, making the declarations at the very beginning of the sub or outside (before the sub) is cleaner in my opinion.
Something like this sounds better to me:

Dim swApp                       As SldWorks.SldWorks
Dim swModel                     As SldWorks.ModelDoc2
Dim swPart                      As SldWorks.PartDoc
Dim tConfig()                    As String
Dim swModel                     As SldWorks.ModelDoc2
Dim swConfigMgr                 As SldWorks.ConfigurationManager
Dim swConfig                    As SldWorks.Configuration
Dim swCustProp                  As CustomPropertyManager
Dim vConfigName                 As Variant
Dim sSpecConfigNameArr(0)       As String
Dim vSpecConfigNameArr          As Variant
Dim dimValue                    As Variant
Dim stnameConfig                As String
Dim boolstatus                  As Boolean
Dim sMasse                      As String
Dim sValout                     As String
Dim sVal                        As String
Dim bRet                        As String
Dim swModelDocExt               As ModelDocExtension
Dim i                           As Integer
Dim swErrors                    As Long
Dim swWarnings                  As Long

Sub main()  
Set swApp = Application.SldWorks
'on récupére le document actif
Set swModel = swApp.ActiveDoc
Set swConfigMgr = swModel.ConfigurationManager
'on récupére la configuration active
Set swConfig = swConfigMgr.ActiveConfiguration
Set swModelDocExt = swModel.Extension
Set swCustProp = swModelDocExt.CustomPropertyManager(tConfig(i))
 
stnameConfig = swConfig.Name
vConfigNameArr = swModel.GetConfigurationNames
   
'on boucle sur toutes les configurations
 For Each vConfigName In vConfigNameArr
     'on test si la configuration est différente de la configuration active et de la configuration Default
     If vConfigName <> swConfig.Name And vConfigName <> "xx" Then
               boolstatus = swModel.DeleteConfiguration2(vConfigName)
     End If
     If vConfigName <> swConfig.Name And vConfigName <> "Default" Then
               boolstatus = swModel.DeleteConfiguration2(vConfigName)
     End If
                 
 Next vConfigName
 
'on reconstruit la pièces
swModel.ForceRebuild3 False


'récupère le document actif dans SW
If Not swModel Is Nothing Then
    
    '''-----------------------------------------------
    ''' lignes délplacées dans la boucle, de manière à ce que l'operation s'effectue sur tous les fichiers et pas juste le premier.
    boolstatus = swModel.DeleteConfiguration2("Défaut")
    boolstatus = swModel.DeleteConfiguration2("xx")
    Set swPart = swModel
    boolstatus = swPart.AddConfiguration2("00", "", "", True, False, False, True, 256)
    boolstatus = swPart.AddConfiguration2("PC", "", "", True, False, False, True, 256)
    boolstatus = swPart.AddConfiguration2("R6029", "", "", True, False, False, True, 256)
    '''-----------------------------------------------
   
    'Mise en place de la matière
    swModel.SetMaterialPropertyName2 "", "X:\DONNEES BE\DAO\BUREAU ETUDES\BIBLI SOLIDWORKS\MATERIAUX\MATERIAUX QUALI-CITE/QUALI-CITE.sldmat", "ALUMINIUM 6060"
    'Boucle sur toutes les configurations
    tConfig = swModel.GetConfigurationNames
    For i = 0 To UBound(tConfig)
        'ajoute un propriété personnalisée edition avec la valeur POTEAUXHEXA"
        bRet = swModel.DeleteCustomInfo2(tConfig(i), "DESIGNATION 2")
        bRet = swModel.DeleteCustomInfo2(tConfig(i), "PROFILS")
        bRet = swModel.AddCustomInfo3(tConfig(i), "PROFILS", swCustomInfoText, "POTEAUXHEXA")
        
        'ajoute un propriété personnalisée edition avec la valeur Masse
        'Chr(34) permet d'ajouter le caractère "
        bRet = swModel.DeleteCustomInfo2(tConfig(i), "masse")
        bRet = swModel.AddCustomInfo3(tConfig(i), "masse", swCustomInfoText, Chr(34) & "SW-Mass" & Chr(34))
        
        'ajoute un propriété personnalisée edition avec la valeur Poids
        'Chr(34) permet d'ajouter le caractère "
        bRet = swModel.DeleteCustomInfo2(tConfig(i), "POIDS")
        bRet = swModel.AddCustomInfo3(tConfig(i), "POIDS", swCustomInfoText, Chr(34) & "SW-Mass" & Chr(34))
        
         'ajoute un propriété personnalisée edition avec la valeur MATERIAUX
        'Chr(34) permet d'ajouter le caractère "
        bRet = swModel.DeleteCustomInfo2(tConfig(i), "MATERIAUX")
        bRet = swModel.AddCustomInfo3(tConfig(i), "MATERIAUX", swCustomInfoText, Chr(34) & "SW-Material" & Chr(34))
        
        'Récupération de la propriété de masse, changer le nom de la propriété en fonction de votre modèle
        bRet = swCustProp.Get6("POIDS", False, sValout, sMasse, False, False)

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

        'Création de la propriété SURFACE PIECE avec la valeur sVal
        bRet = swCustProp.Add3("SURFACE PIECE", 30, sVal, 1)

    Next i


    
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsLinearFractionDenominator, 0, 0)
    boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swUnitsLinearFeetAndInchesFormat, 0, False)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsDualLinear, 0, swLengthUnit_e.swMM)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsDualLinearFractionDenominator, 0, 0)
    boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swUnitsDualLinearFeetAndInchesFormat, 0, False)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropMass, 0, swUnitsMassPropMass_e.swUnitsMassPropMass_Kilograms)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropVolume, 0, swUnitsMassPropVolume_e.swUnitsMassPropVolume_Meters3)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsLinear, 0, swLengthUnit_e.swMM)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropLength, 0, swLengthUnit_e.swMM)
    
    'Enregistre le docuement actif en mode silencieux
    bRet = swModel.Save3(swSaveAsOptions_Silent, swErrors, swWarnings)
    
    'Ferme le document actif
    swApp.CloseDoc swModel.GetPathName

End If

End Sub

With the code editor it's easier to visualize the code than to attach a swp file for info.

2 Likes

Hello @Cyril.f @Lynkoa15 and thank you for your answers,
Here I am again on my problem that I am taking up again today.
I did some cleaning on my code. It was a mess!
But I end up with an error code 91:
image

The debug gives me this line:

Here's my code, if you have any idea where the error is:

    Dim swApp                       As SldWorks.SldWorks
    Dim swModel                     As SldWorks.ModelDoc2
    Dim swConfigMgr                 As SldWorks.ConfigurationManager
    Dim swConfig                    As SldWorks.Configuration
    Dim vConfigName                 As Variant
    Dim sSpecConfigNameArr(0)       As String
    Dim vSpecConfigNameArr          As Variant
    Dim dimValue                    As Variant
    Dim stnameConfig                As String
    Dim boolstatus                  As Boolean
    Dim i                           As Integer
    Dim swErrors                    As Long
    Dim swWarnings                  As Long
    Dim swPart                      As SldWorks.PartDoc
    Dim tConfig()                   As String
    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
    
    'on récupére le document actif
    Set swModel = swApp.ActiveDoc
    Set swConfigMgr = swModel.ConfigurationManager
    
    'on récupére la configuration active
    Set swConfig = swConfigMgr.ActiveConfiguration
    stnameConfig = swConfig.Name
    vConfigNameArr = swModel.GetConfigurationNames
    
    Set swModelDocExt = swModel.Extension
    
    'Set swCustProp = swModelDocExt.CustomPropertyManager(tConfig(i))
    Set swCustProp = swModelDocExt.CustomPropertyManager("00")

    
    '''-----------------------------------------------
   
   'on boucle sur toutes les configurations
    For Each vConfigName In vConfigNameArr
    'on test si la configuration est différente de la configuration active et de la configuration Default
        
    If vConfigName <> swConfig.Name And vConfigName <> "xx" Then
    boolstatus = swModel.DeleteConfiguration2(vConfigName)
        
    End If
        
    If vConfigName <> swConfig.Name And vConfigName <> "Défaut" Then
    boolstatus = swModel.DeleteConfiguration2(vConfigName)
        
    End If
                    
    Next vConfigName
 
    'on reconstruit la pièces
    swModel.ForceRebuild3 False

Do
    'récupère le document actif dans SW
    Set swModel = swApp.ActiveDoc
    If Not swModel Is Nothing Then
    
        
    ''' lignes déplacées dans la boucle, de manière à ce que l'operation s'effectue sur tous les fichiers et pas juste le premier.

    Set swPart = swModel
    boolstatus = swPart.AddConfiguration2("00", "", "", True, False, False, True, 256)
    boolstatus = swModel.DeleteConfiguration2("Défaut")
    boolstatus = swModel.DeleteConfiguration2("xx")
    
    '''-----------------------------------------------
    
    'Mise en place de la matière
    swModel.SetMaterialPropertyName2 "", "X:\DONNEES BE\DAO\BUREAU ETUDES\BIBLI SOLIDWORKS\MATERIAUX\MATERIAUX QUALI-CITE/QUALI-CITE.sldmat", "ALUMINIUM 6060"
    
    'Boucle sur toutes les configurations
    tConfig = swModel.GetConfigurationNames
    For i = 0 To UBound(tConfig)
        
    'ajoute une propriété personnalisée edition avec la valeur POTEAUXHEXA"
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "DESIGNATION 2")
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "PROFILS")
    bRet = swModel.AddCustomInfo3(tConfig(i), "PROFILS", swCustomInfoText, "POTEAUXHEXA")
    
    'ajoute un propriété personnalisée MASSE avec la valeur Masse
    'Chr(34) permet d'ajouter le caractère "
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "masse")
    bRet = swModel.AddCustomInfo3(tConfig(i), "masse", swCustomInfoText, Chr(34) & "SW-Mass" & Chr(34))
    
    'ajoute un propriété personnalisée POIDS avec la valeur Masse
    'Chr(34) permet d'ajouter le caractère "
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "POIDS")
    bRet = swModel.AddCustomInfo3(tConfig(i), "POIDS", swCustomInfoText, Chr(34) & "SW-Mass" & Chr(34))
    
    'ajoute un propriété personnalisée edition avec la valeur MATERIAUX
    'Chr(34) permet d'ajouter le caractère "
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "MATERIAUX")
    bRet = swModel.AddCustomInfo3(tConfig(i), "MATERIAUX", swCustomInfoText, Chr(34) & "SW-Material" & Chr(34))
    
    
    
'Récupération de la propriété de masse, changer le nom de la propriété en fonction de votre modèle
bRet = swCustProp.Get6("POIDS", False, sValout, sMasse, False, False)
    
'Conversion du texte en valeur décimale, multiplication x RATIO et conversion en donné de type texte
sVal = CStr(Format(CDec(sMasse) * 0.0556, "0.000"))
     
'Renseignement de la propriété SURFACE PIECE avec la valeur "sVal"
bRet = swCustProp.Add3("SURFACE PIECE", 30, sVal, 1)
    
    
    
    
    
    
    Next i

    'Préférences SolidWorks
        
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsLinearFractionDenominator, 0, 0)
    boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swUnitsLinearFeetAndInchesFormat, 0, False)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsDualLinear, 0, swLengthUnit_e.swMM)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsDualLinearFractionDenominator, 0, 0)
    boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swUnitsDualLinearFeetAndInchesFormat, 0, False)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropMass, 0, swUnitsMassPropMass_e.swUnitsMassPropMass_Kilograms)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropVolume, 0, swUnitsMassPropVolume_e.swUnitsMassPropVolume_Meters3)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsLinear, 0, swLengthUnit_e.swMM)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropLength, 0, swLengthUnit_e.swMM)
        
    'Enregistre le docuement actif en mode silencieux
    bRet = swModel.Save3(swSaveAsOptions_Silent, swErrors, swWarnings)
    
    'Ferme le document actif
    swApp.CloseDoc swModel.GetPathName
    
    End If

'boucle jusqu'a ce qu'il n'y ai plus de fichier ouvert dans SW
Loop While Not swModel Is Nothing

End Sub

Thank you very much

I answer myself. I searched and searched... :dizzy_face:
When I first launched my macro, it stuck at this line:

I did END the command and in the F8 properties, I could see that PROFILES/mass/WEIGHT and MATERIALS were well informed. It was therefore missing SURFACE PIECE

I restarted and the macro worked until the end by filling SURFACE PIECE well.

As if the first time the macro was launched, it was unable to retrieve the value of WEIGHT which is calculated just before.

So I added a part reconstruction between MATERIALS and mass property recovery and it works. :+1:

I tested my macro with a single configuration creation and the SURFACE PIECE was correct.
Then I tested my macro by integrating the creation of 3 configurations: 00 / PC / R1018.
SURFACE PIECE is created well in the 3 configurations, but I only get a good calculation result on one configuration.

Do you have an idea of the problem?

Here's the code:

    Dim swApp                       As SldWorks.SldWorks
    Dim swModel                     As SldWorks.ModelDoc2
    Dim swConfigMgr                 As SldWorks.ConfigurationManager
    Dim swConfig                    As SldWorks.Configuration
    Dim vConfigName                 As Variant
    Dim sSpecConfigNameArr(0)       As String
    Dim vSpecConfigNameArr          As Variant
    Dim dimValue                    As Variant
    Dim stnameConfig                As String
    Dim boolstatus                  As Boolean
    Dim i                           As Integer
    Dim swErrors                    As Long
    Dim swWarnings                  As Long
    Dim swPart                      As SldWorks.PartDoc
    Dim tConfig()                   As String
    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
    
    'on récupére le document actif
    Set swModel = swApp.ActiveDoc
    Set swConfigMgr = swModel.ConfigurationManager
    
    'on récupére la configuration active
    Set swConfig = swConfigMgr.ActiveConfiguration
    stnameConfig = swConfig.Name
    vConfigNameArr = swModel.GetConfigurationNames
    
    Set swModelDocExt = swModel.Extension
    
    
    '''-----------------------------------------------
   
   'on boucle sur toutes les configurations
    For Each vConfigName In vConfigNameArr
    'on test si la configuration est différente de la configuration active et de la configuration Default
        
    If vConfigName <> swConfig.Name And vConfigName <> "xx" Then
    boolstatus = swModel.DeleteConfiguration2(vConfigName)
        
    End If
        
    If vConfigName <> swConfig.Name And vConfigName <> "Défaut" Then
    boolstatus = swModel.DeleteConfiguration2(vConfigName)
        
    End If
                    
    Next vConfigName
 
    'on reconstruit la pièces
    swModel.ForceRebuild3 False

Do
    'récupère le document actif dans SW
    Set swModel = swApp.ActiveDoc
    If Not swModel Is Nothing Then
    
        
    ''' lignes déplacées dans la boucle, de manière à ce que l'operation s'effectue sur tous les fichiers et pas juste le premier.

    Set swPart = swModel
    boolstatus = swPart.AddConfiguration2("00", "", "", True, False, False, True, 256)
    boolstatus = swPart.AddConfiguration2("PC", "", "", True, False, False, True, 256)
    boolstatus = swPart.AddConfiguration2("R1018", "", "", True, False, False, True, 256)
    boolstatus = swModel.DeleteConfiguration2("Défaut")
    boolstatus = swModel.DeleteConfiguration2("xx")
    
    '''-----------------------------------------------
    
    'Mise en place de la matière
    swModel.SetMaterialPropertyName2 "", "X:\DONNEES BE\DAO\BUREAU ETUDES\BIBLI SOLIDWORKS\MATERIAUX\MATERIAUX QUALI-CITE/QUALI-CITE.sldmat", "ALUMINIUM 6060"
    
    'Boucle sur toutes les configurations
    tConfig = swModel.GetConfigurationNames
    For i = 0 To UBound(tConfig)
        
    'ajoute une propriété personnalisée edition avec la valeur POTEAUXHEXA"
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "DESIGNATION 2")
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "PROFILS")
    bRet = swModel.AddCustomInfo3(tConfig(i), "PROFILS", swCustomInfoText, "POTEAUXHEXA")
    
    'ajoute un propriété personnalisée MASSE avec la valeur Masse
    'Chr(34) permet d'ajouter le caractère "
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "masse")
    bRet = swModel.AddCustomInfo3(tConfig(i), "masse", swCustomInfoText, Chr(34) & "SW-Mass" & Chr(34))
    
    'ajoute un propriété personnalisée POIDS avec la valeur Masse
    'Chr(34) permet d'ajouter le caractère "
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "POIDS")
    bRet = swModel.AddCustomInfo3(tConfig(i), "POIDS", swCustomInfoText, Chr(34) & "SW-Mass" & Chr(34))
    
    'ajoute un propriété personnalisée edition avec la valeur MATERIAUX
    'Chr(34) permet d'ajouter le caractère "
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "MATERIAUX")
    bRet = swModel.AddCustomInfo3(tConfig(i), "MATERIAUX", swCustomInfoText, Chr(34) & "SW-Material" & Chr(34))
    
    
    
    'on reconstruit la pièces
    swModel.ForceRebuild3 False
    
    Set swCustProp = swModelDocExt.CustomPropertyManager(tConfig(i))

    
    'Récupération de la propriété de masse, changer le nom de la propriété en fonction de votre modèle
    bRet = swCustProp.Get6("POIDS", False, sValout, sMasse, False, False)
    
    'Conversion du texte en valeur décimale, multiplication x RATIO et conversion en donné de type texte
    sVal = CStr(Format(CDec(sMasse) * 0.0556, "0.000"))
     
    'Renseignement de la propriété SURFACE PIECE avec la valeur "sVal"
    bRet = swCustProp.Add3("SURFACE PIECE", 30, sVal, 1)
    
    
    
    
    
    
Next i

    'Préférences SolidWorks
        
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsLinearFractionDenominator, 0, 0)
    boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swUnitsLinearFeetAndInchesFormat, 0, False)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsDualLinear, 0, swLengthUnit_e.swMM)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsDualLinearFractionDenominator, 0, 0)
    boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swUnitsDualLinearFeetAndInchesFormat, 0, False)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropMass, 0, swUnitsMassPropMass_e.swUnitsMassPropMass_Kilograms)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropVolume, 0, swUnitsMassPropVolume_e.swUnitsMassPropVolume_Meters3)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsLinear, 0, swLengthUnit_e.swMM)
    boolstatus = swModel.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropLength, 0, swLengthUnit_e.swMM)
        
    'Enregistre le docuement actif en mode silencieux
    bRet = swModel.Save3(swSaveAsOptions_Silent, swErrors, swWarnings)
    
    'Ferme le document actif
    swApp.CloseDoc swModel.GetPathName
    
End If

'boucle jusqu'a ce qu'il n'y ai plus de fichier ouvert dans SW
Loop While Not swModel Is Nothing

End Sub

I answer myself again!
I modified the macro by creating only config 00 at the beginning, then filling in all the properties.
Finally, I create all the other configurations, which take up the properties of the initial configuration.

YIPPEE!!!

Thank you for the help. I managed to get by with your advice. :+1::+1::+1:

1 Like