Export Nomenclature vers Excel avec une Macro VBA

Bonjour à tous.

J'ai récupéré un programme en VBA pour exporter ma nomenclature dans un feuille en .xls

Tout ce passe bien sauf pour une option que je n'arrive pas à modifier.

Je souhaiterais que le programme choisis la configuration en cours.

Actuellement il cherche la configuration nommé "Défaut"

Configuration = "Défaut"

Si quelqu'un connais la réponse :)

 

****************************

Insert BOM Table and Extract Data Example (VBA)
This example shows how to insert a BOM table and the extract the data from it.

'-------------------------------------------------------
' Preconditions:
' 1. Verify that the specified drawing document to open
'    exists.
' 2. Open the Immediate window.
'
' Postconditions:
' 1. Opens the specified drawing document.
' 2. Selects a drawing view.
' 3. Inserts a BOM table at the point where the drawing
'    was selected.
' 4. Examine the drawing and Immediate window.
'
' NOTE: Because the drawing is used elsewhere, do not
' save changes.
'-------------------------------------------------------

Option Explicit

Sub main()

Dim xlApp As Excel.Application
Set xlApp = New Excel.Application
Dim wbk As Excel.Workbook
Dim sht As Excel.Worksheet

With xlApp
    .Visible = True
    Set wbk = .Workbooks.Add
    Set sht = wbk.ActiveSheet
End With

Dim swApp                   As SldWorks.SldWorks
Dim swModel                 As SldWorks.ModelDoc2
Dim swModelDocExt           As SldWorks.ModelDocExtension
Dim swBOMAnnotation         As SldWorks.BomTableAnnotation
Dim swBOMFeature            As SldWorks.BomFeature
Dim boolstatus              As Boolean
Dim BomType                 As Long
Dim Configuration           As String
Dim TemplateName            As String

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

TemplateName = "M:\DATABASE\MODELES\05-Model de nomenclature\GP_ASM_Nomenclature BOS.sldbomtbt"
BomType = swBomType_Indented
Configuration = "Défaut"
Set swBOMAnnotation = swModelDocExt.InsertBomTable3(TemplateName, 0, 0, BomType, Configuration, False, swNumberingType_Detailed, True)
Set swBOMFeature = swBOMAnnotation.BomFeature

swModel.ForceRebuild3 True

Dim NumCol As Long
Dim NumRow As Long
Dim I As Long
Dim J As Long

NumCol = swBOMAnnotation.ColumnCount
NumRow = swBOMAnnotation.RowCount

For I = 0 To NumRow
    For J = 0 To NumCol
        sht.Cells(I + 1, J + 1).Value = swBOMAnnotation.Text(I, J)
    Next J
Next I

boolstatus = swModelDocExt.SelectByID2(swBOMFeature.GetFeature.Description, "BOMFEATURE", 0, 0, 0, True, 0, Nothing, 0)
swModel.EditDelete

swModel.ForceRebuild3 True

Dim config As SldWorks.Configuration
Dim cusPropMgr As SldWorks.CustomPropertyManager
Dim lRetVal As Long
Dim ValOut As String
Dim ResolvedValOut As String
Dim wasResolved As Boolean
Dim nNbrProps As Long
Dim vPropNames As Variant
Dim vPropTypes As Variant
Dim vPropValues As Variant
Dim resolved As Variant
Dim custPropType As Long
Dim K As Long
Dim NomProperty As String

Set config = swModel.GetActiveConfiguration
Set cusPropMgr = config.CustomPropertyManager

nNbrProps = cusPropMgr.Count
vPropNames = cusPropMgr.GetNames
For K = 0 To nNbrProps - 1
    cusPropMgr.Get2 vPropNames(K), ValOut, ResolvedValOut
    custPropType = cusPropMgr.GetType2(vPropNames(K))
    If vPropNames(K) = "DESSINATEUR" Then
        NomProperty = ResolvedValOut
    End If
Next K

Dim chemin As String
chemin = "C:\temp\BOS.xlsx"

With xlApp
    wbk.SaveAs chemin
    wbk.Close
    .Quit
End With

End Sub


insert-bom-asm_-_03.swp

Bonjour dlebrun_1,

Visiblement, votre code a deux gros blocs.

Le premier (ligne 22 à 53) crée la nomenclature d'une configuration donnée ; sous Excel à proprement parler. Le deuxième (ligne 55 à 100) récupère le nom du dessinateur dans la configuration active (mais n'en fait rien, ce qui est particulier).

Le premier bloc, contrairement au deuxième, n'utilise pas la configuration active mais celle qui s'appelle "Défaut". Cela se situe ligne 49 : Configuration = "Défaut". Il vaut mieux définir alors la variable "Configuration" qui contient le nom de la configuration en faisant appel à l'objet configuration. Je vous propose alors de remplacer cette ligne en prenant exemple sur la méthode suivante (lien vers la page de l'aide Solidworks 2019) :

Sub essai_8946585465656()
    
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim Configuration As String
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    Configuration = swApp.GetActiveConfigurationName(swModel.GetPathName)
    MsgBox Configuration
    
End Sub

 

1 « J'aime »

Bonjour,

"Le deuxième (ligne 55 à 100) récupère le nom du dessinateur dans la configuration active (mais n'en fait rien, ce qui est particulier)" : et oui c'est magnifique !!!! Je reconnais dans ce code une partie de macro que j'ai faite suite à une demande particulière mais qui a été manifestement sortie de son contexte et retravaillée par quelqu'un ne comprenant pas vraiment ce qu'il faisait. Pour répondre au besoin actuel il est possible de supprimer un bon nombre de lignes et il suffit effectivement de se raccrocher à la configuration active à l'aide de la fonction "GetActiveConfigurationName" comme suggéré par mgauroy.

Cordialement,

1 « J'aime »

mgauroy 

Merci pour votre aide. J'ai suivi vos conseils, a présent tout fonctionne.

d.roger

J'ai récupéré ce programme sur le Forum et je l'ai modifié rapidement sans le purger complètement. Je ne suis malheureusement pas très fort en VBA comme vous l'avez constaté ;) 

Voici le resultat apres modification :

Option Explicit

Sub main()

Dim xlApp As Excel.Application
Set xlApp = New Excel.Application
Dim wbk As Excel.Workbook
Dim sht As Excel.Worksheet

With xlApp
    .Visible = True
    Set wbk = .Workbooks.Add
    Set sht = wbk.ActiveSheet
End With

Dim swApp                   As SldWorks.SldWorks
Dim swModel                 As SldWorks.ModelDoc2
Dim swModelDocExt           As SldWorks.ModelDocExtension
Dim swBOMAnnotation         As SldWorks.BomTableAnnotation
Dim swBOMFeature            As SldWorks.BomFeature
Dim boolstatus              As Boolean
Dim BomType                 As Long
Dim Configuration           As String
Dim TemplateName            As String

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

TemplateName = "M:\DATABASE\MODELES\05-Model de nomenclature\GP_ASM_Nomenclature BOS.sldbomtbt"
BomType = swBomType_Indented
Configuration = swApp.GetActiveConfigurationName(swModel.GetPathName)
MsgBox Configuration
Set swBOMAnnotation = swModelDocExt.InsertBomTable3(TemplateName, 0, 0, BomType, Configuration, False, swNumberingType_Detailed, True)
Set swBOMFeature = swBOMAnnotation.BomFeature

swModel.ForceRebuild3 True

Dim NumCol As Long
Dim NumRow As Long
Dim I As Long
Dim J As Long

NumCol = swBOMAnnotation.ColumnCount
NumRow = swBOMAnnotation.RowCount

For I = 0 To NumRow
    For J = 0 To NumCol
        sht.Cells(I + 1, J + 1).Value = swBOMAnnotation.Text(I, J)
    Next J
Next I

boolstatus = swModelDocExt.SelectByID2(swBOMFeature.GetFeature.Description, "BOMFEATURE", 0, 0, 0, True, 0, Nothing, 0)
swModel.EditDelete

Dim chemin As String
chemin = "C:\temp\BOS.xlsx"

With xlApp
    wbk.SaveAs chemin
    wbk.Close
    .Quit
End With

End Sub

1 « J'aime »

Bonjour,

Je serais également intéressé par découvrir les possibilités de cette macro mais je suis bloqué dès la 1ère ligne : "type défini non défini".

Cette macro est bien à lancé depuis SolidWorks, non depuis Excel 365.

Merci pour votre retour, bonne journée


pb_macro.png

Ouvre ta macro avec l'éditeur et vérifie que tu as bien ajouté la référence Microsoft Excel dans le menu Outil Références:

 

Et aussi, en général il vaut mieux ouvrir un nouveau sujet avec le lien plutôt que de déterrer un ancien sujet

2 « J'aime »

Merci beaucoup, ça marche ! Je vais pouvoir voir ce qu'il est possible de faire avec dans SW ou Excel.

Il me semblait que ma question était dans la continuité du sujet, voila pourquoi je n'ai pas ouvert un nouveau sujet à part entière.

Encore merci

1 « J'aime »

bonjour , jai essayé la macro mais j obtient des erreurs.

comment introduire cette macro en solidworks , y a t il des modifications a faire,

merci pour votre aide

Bonjour,

Quel type d'erreurs ? une capture d'écran des messages serait pas mal ...

Une modification certaine à faire est de modifier le chemin du modèle de nomenclature (TemplateName)

Cordialement,

2 « J'aime »

Bonjour a tous, j’arrive 2/3 ans apres je sais bien :grin:
Je suis presque dans ce meme ca de figure donc ces Q&A m’ont bien servi !

Petite particularite de mon probleme, c’est que je dois aussi exporter de nombreuses proprietes personnalises tel que le nom de l’ingenieur, le numero de piece ou encore le numero de plan…
Si j’ai bien compris cela depend du template appelé, alors comment modifier un tel template ? ou il y a-t-il une autre facon de faire ?

Merci d’avance

Le programme VBA appelle un fichier modèle de nomenclature de SolidWorks. Personnalisez ce modèle avec les infos que vous souhaitez y ajouter.

2 « J'aime »

Ca marche merci, mais le probleme est que je ne sais pas comment modifier un tel fichier (.sldbomtbt). vous sauriez comment faire ?

Bonjour,
Suffit de modifier une table en ajoutant les colonnes que vous voulez puis de cliquer sur la croix qui s’affiche pour déplacer la table puis de sélectionner enregistrer sous.
Par défaut ça enregistrera comme modèle de BOM.

2 « J'aime »

Merci beaucoup, tout fonctionne comme je le voulais !

Bonjour,

Concernant votre besoin principal qui est d’exporter vos nomenclatures vers Excel, nous avons développé un outil intégré à SOLIDWORKS qui permet de créer une nomenclature à partir d’un assemblage ou d’un dossier et d’utiliser les propriétés en tant que filtre d’extraction, choisir le niveau d’extraction des sous ensembles, de concaténer plusieurs propriétés dans une colonne.

Il est également possible de personnaliser l’export dans les formats texte, Excel, table SOLIDWORKS, PDF ou XML.

Cet outil est SmartBom : SmartBom

Cordialement

Bonjour,

J’ai essayé cette macro pour voir.

La macro fonctionne si je la lance à partir d’un assemblage , mais pas à partir d’une mise en plan.
C’est peut être bien son fonctionnement normal.

Ça serait possible d’avoir une variante de celle ci pour récupérer la nomenclature qui est sur une mise en plan (je rajoute des données dans une colonne de ma nomenclature et c’est plus pratique sur la MEP que dans l’assemblage) ??

Serait il aussi possible de créer le fichier Excel à partir d’un modèle existant et de l’enregistrer sous un aitre nom ? (pour avoir d’autres feuilles préexistante dans l’Excel et éventuellement y mettre d’autres macro aussi)

D’avance merci

Bonjour,
Je pense que tout est faisable, faut juste compiler du code SW et Excel.
Il me semble avoir déjà répondu à ce type de question sur un autre sujet, faudrait que je fasse une recherche.