Solidworks 2019 - Macro pour exporter en automatique une macro sur Excel

bonjour,

j'ai utilisé une macro postée par un autre utilisateur.

j'ai rapidement un bug et j'avoue ne pas être spécialiste macro. Le programme plante avec une erreur de type Run-Tume error 91 (object Variable with block variable not set) au niveau de l'instruction Set swBOMFeature = swBOMAnnotation.BomFeature mise en gras

Pourriez vous m'indiquer où je fais fausse route et comment résoudre ma problématique

merci d'avance

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
Dim TableTemplate           As String

Set swApp = Application.SldWorks

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


TemplateName = "C:\Users\sal1chl\Desktop\test_nomenclature.sldbomtbt"

BomType = swBomType_TopLevelOnly

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 cusPropMgr = swModelDocExt.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 = Environ("USERPROFILE") & "\Desktop\" & swModel.GetTitle & "-" & NomProperty & ".xls"

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

End Sub

Bonjour,

Je penses qu'il faut soit que tu initialise ta variable Configuration avant d'insérer ta BOM avec par exemple Configuration = "" soit remplacer Configuration par "" dans la ligne Set swBOMAnnotation = swModelDocExt.InsertBomTable3(TemplateName, 0, 0, BomType, Configuration, False, swNumberingType_Detailed, True).

Cordialement,

1 « J'aime »

merci Roger pour ta réponse .

je me rends compte que je ne t'avais pas copié la ligne qui disais :

Configuration = "Défaut"

pour plus de flexibilité, je viens de changer cette ligne par 

Configuration = swApp.GetActiveConfigurationName(sFileName)

en ayant bien au préalable

Const sFileName                 As String = "test.SLDPRT"

mon problème survient toujours avec :

Set swBOMFeature = swBOMAnnotation.BomFeature

où swBOMFeature = Nothing

pour info à la ligne précédente, j'ai également swBOMAnnotation=Nothing

est ce normal ?

merci de ton aide

 

Bonjour,

Premier point : Il faut déjà vérifier que le TemplateName = "C:\Users\sal1chl\Desktop\test_nomenclature.sldbomtbt" est écrit correctement car si c'est pas le cas ça bloquera sur la ligne Set swBOMFeature = swBOMAnnotation.BomFeature.

Deuxième point : Si tu utilises la macro sur une pièce ("test.SLDPRT") alors le BomType ne peut pas être  "swBomType_TopLevelOnly" et alors ça bloque sur la ligne Set swBOMFeature = swBOMAnnotation.BomFeature, change le en "swBomType_Indented" pour vérifier si ça vient de là. Bizarre de vouloir mettre une nomenclature sur une pièce !

Cordialement,

1 « J'aime »

bonjour Roger,

un grand merci, cela fonctionne !

sais tu comment récupérer en automatique le nom de l'assemblage dans lequel j'exécute cette macro ?

pour le moment, je lui donne le nom dans la macro

Const sFileName                 As String = "test_assemblage.SLDASM"

merci à toi

 

Cordialement,

 

LSE

Quelque chose comme ça devrait te donner le nom du fichier (a ajouter sous ta ligne: Set swModel = swApp.ActiveDoc)

 

Dim sFileName as string

sFileName =swModel.GetPathName

Debug.print sFileName

PS: ne pas oublier de supprimer cette ligne: Const sFileName                 As String = "test_assemblage.SLDASM"  (ou bien la mettre en comentaire)

1 « J'aime »

bonjour Denis,

ma réponse n'était pas partie... pardon (je n'ai pas du selectionner "publier"). Merci ca a fonctionné super.

et puis, je ne sais pas ce que j'ai fait car plus rien ne marche...

NumRow = swBOMAnnotation.RowCount  donne 1 alors que j'ai plusieurs composants... ma nomenclature ne s'affiche plus du tout...

auriez vous une idée?

Je vous joins la macro en pièce jointe...

merci de votre aide


insert-bom-asm.swp

encore une petite précision....

lorsque j'inserts manuellement ma nomenclature en appelant 

TemplateName = "C:\Users\sal1chl\Desktop\test_assemblage2.sldbomtbt"
 

pas de soucis, la table s'affiche (1er niveau)

si je l'appelle via la macro, je n'ai que la 1ere ligne du tableau avec le nom des colonnes....

j'imagine que mon erreur est là dedans...

TemplateName = "C:\Users\sal1chl\Desktop\test_assemblage.sldbomtbt"
' Type de BOM

BomType = swBomType_TopLevelOnly
'Création de la table de nomenclature

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              'ca donne bien 5
NumRow = swBOMAnnotation.RowCount                  ' ca donne 0 d'ou le soucis....

Hello

j'ai trouvé mon erreur...

j'avais permuté par mégarde les lignes SFileName et Configuration.

 

sFileName = swModel.GetPathName '= nom complet de l'assemblage avec le chemin d'accès
Debug.Print sFileName

Configuration = swApp.GetActiveConfigurationName(sFileName)

 

problème résolu

merci à tous les 2 pour votre aide

 

LSE