Bonjour,
J'ai créé une macro me permettant de copier un assemblage existant dans un dossier spécifique, d'ouvrir la copie et de remplacer un assemblage à l'intérieur. Le tout à partir d'une liste excel.
La première boucle fonctionne correctement, mais à la deuxième, l'assemblage copié ne s'ouvre pas et fait planter mon solidworks.
Après la ligne:
'ouverture de la copie
Set Part = swApp.OpenDoc6(NewNameA, 2, 0, "", longstatus, longwarnings)
Auriez vous une idée du problème?
Merci à vous.
Le code avec les chemins masqués:
' ******************************************************************************
' swx21552\Macro1.swb - macro recorded on 03/15/21
' ******************************************************************************
Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Dim retVal As Long
'Dim DernLigne As Long
Dim AssRemp As String
Dim AssRempSE As String
Dim ChemRemp As String
Dim NomRempComp As String
Dim fileNameA As String
Dim NewNameA As String
Dim i As Long
Dim DernLigneP As Long
Dim xlApp As Excel.Application
Dim wbk As Excel.Workbook
Dim Sht As Excel.Worksheet
Sub main()
Set swApp = Application.SldWorks
Set xlApp = New Excel.Application
With xlApp
.Visible = False
DoEvents
'Fige l'écran
xlApp.ScreenUpdating = False
'Ouvre le fichier excel
Workbooks.Open fileName:="XXX.xlsm"
Set wbk = ActiveWorkbook
Set Sht = wbk.ActiveSheet
'Compte le nombre de lignes du classeur Excel
DernLigneP = Sht.Range("C" & Rows.Count).End(xlUp).Row
'Définition de l'assemblage à copier
fileNameA = "XXX.SLDASM"
'Début de la boucle
For i = 1 To DernLigneP Step 1
DoEvents
'Définition du sous-assemblage de remplacement
ChemRemp = Sht.Cells(i, 3).Value 'Excel - lecture chemin
AssRemp = Sht.Cells(i, 1).Value 'Excel - lecture nom assemblage
'Chemin + nom du sous-assemblage
NomRempComp = ChemRemp & "\" & AssRemp
'Récupération du nom du sous-assemblage sans extension
If InStr(AssRemp, ".") > 0 Then
AssRempSE = Left(AssRemp, InStr(AssRemp, ".") - 1)
Else: AssRempSE = AssRemp
End If
'Définition du nouveau nom de l'assemblage copié
NewNameA = "XXX" & AssRempSE & " BIM " & ".SLDASM"
'Copie de l'assemblage et renommage
retVal = swApp.CopyDocument(fileNameA, NewNameA, "", "", swMoveCopyOptionsOverwriteExistingDocs)
'Appel de la procédure de remplacement du sous-assemblage
Call remplacement
Next i
End With
xlApp.Quit
End Sub
Sub remplacement()
'ouverture de la copie
Set Part = swApp.OpenDoc6(NewNameA, 2, 0, "", longstatus, longwarnings)
DoEvents
Set Part = swApp.ActiveDoc
Part.ClearSelection2 True
'Selection du sous-assemblage à remplacer
boolstatus = Part.Extension.SelectByID2("XXX@" & AssRempSE & " BIM ", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
'Remplacement
boolstatus = Part.ReplaceComponents2(NomRempComp, "Avant", False, 0, True)
boolstatus = Part.EditRebuild3()
'Sauvegarde
longstatus = Part.Save
'Msg sauvegarde assemblage ok
Debug.Print (AssRempSE & " BIM " & ".SLDASM sauvegardé.")
' Save As IFC
'longstatus = Part.SaveAs3("XXX" & AssRempSE & " BIM " & ".IFC", 0, 0)
'Debug.Print (AssRempSE & " BIM " & ".IFC sauvegardé.")
'Fermeture du fichier
'swApp.CloseDoc Part
swApp.CloseDoc NewNameA
'If MsgBox("Assemblage suivant?", vbOKCancel) = vbCancel Then Exit Sub
End Sub