Moi aussi je sèche!
Peut tu éditer la macro, ajouter les fenêtres Execution et Variables locales(voir image), puis cliquer juste après Sub main() et appuyer sur F8 juste qu’à ce que cela bug?
En gros lacer la macro en pas par pas. Et vérifier dans la fenêtre variable local la valeur de sModelName quand cela plante:
Je viens de refaire des test en recopiant le code de base et ça ne marche pas a tout les coups…
J’ai fait 5 test et j’ai eu 2 fois ou ça marche bien, d’autre ou j’ai pas les PDF/DWG, ou sinon il ne se lance carrément pas!
Je ne comprends pas pourquoi ça ne fonctionne pas à tout les coups !
Sinon en théorie il ne me manque plus cas changer les chemin de fichier
Bonjour; @Antoine_Ruelle ,
En regardant de plus près votre MEP, il semble que vous n’utilisez pas la propriété « Révision » (ni « Revision »). Ce qui expliquerai l’erreur ci-dessous:
L’indice « A » dans votre MEP semble n’être que du texte…
De plus, dans votre fichier SLDPRT, vos propriété sont sous la forme :
« Texte : » (je ne pense pas que l’utilisation des « : » soit adéquate dans ce contexte.
Bonsoir,
Oui il passe à la fonction pour pouvoir récupérer l’information du nom de fichier en supprimant l’extension.
En l’état le code proposé par @sbadenis fonctionne sur SW2022.
Bonjour @tous
Antoine regarde entre temps cette macros,
supprime les lignes 4 et 5 après « sub main ».
Et Assigne le nom exacte de la propriété revision a la place de « indice »
Effectivement @Maclane pour la partie révision j’y ai pensé également d’où la modification que j’avais proposé avec retrait de cette propriété et ajout des dossiers.
Pour les propriété il est effectivement bizarre d’avoir inclue « : » dans le nom de la propriété et cela pourrait effectivement pose problème dans certaine cas (macro ou autre).
Exemple propriété sans les :
Pour @Antoine_Ruelle je te confirme que la macro fonctionne bien sur SW2023 (donc pas de raison sur 2022) comme le dit @Cyril.f également.
Tu peux également essayer la solution de @Lynkoa15 en espérant que le problème n’apparaisse pas cette fois.
Bonjour, merci pour ce retour @Maclane .
Effectivement je n’utilise pas le propriété révision je m’en suis rendu compte après coups, car pour l’enregistrement en PDF/DWG je car le même nom de fichier que le plan SW. J’ai donc retirer cette partie. Et j’ai toujours le même soucis je n’ai pas les PDF/DWG
Pour l’indice il est rentré à la main en texte dans une propriété de la pièce qui est repris sur le plan.
Et non nous n’utilisons pas de PDM
sbadenis - Pour de qui est des " : " je ne sais pas si c’est vraiment ça qui pose problème car ça a bien marcher 2 fois de suite. Ce matin j’ai fait un test sans les " : " et j’ai encore eu le message comme quoi sur la ligne 118 j’ai un bloc qui n’est pas défini. Est ce que vous pouvez m’expliquer cette ligne svp ?
" Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors) "
Je viens de refaire un test avant de vous répondre et ça a marché
@Lynkoa15 Si j’ai bien compris pour le chemin des dossier il faut que je les détermine comme des variable
Const dxfSubFolder As String = « \dwg »
Const pdfSubFolder As String = « \pdf »
Const stepSubFolder As String = « \step »
Pour les appeler dans les chemin d’enregistrement ?
En tous cas merci à vous pour votre aide, je commence à comprendre un peu mieux le VBA
Cette ligne permet d’activer un des documents ouverts en mode silencieux (transparent pour l’utilisateur).
Oui, ça permet de simplifier le code et d’appeler des variables plutôt que de saisir n fois le même texte.
Et si jamais un jour vous décidez de changer le chemin c’est plus simple de ne gérer qu’une variable que de vérifier tout le code.
D’accord donc pourquoi dans certains cas la macro bloque dessus ? C’est peu être que le fichier est déjà ouvert ? ou qu’il ne le trouve pas ?
Et du coup c’est à quelle niveau du code que je doit spécifier la variable du chemin pour lui dire de prendre le chemin du fichier en question et d’ajoute « /pdf » pour avoir le bon dossier d’enregistrement ?
Ou quelle partie du code de l’autre macro je dois récupéré ?
Je viens de refaire un test et la ça ne marche pas, je ne comprends plus rien ahah !!
Voici le code
Option Explicit
Public Enum swDocumentTypes_e
swDocNONE = 0 ' Used to be TYPE_NONE
swDocPART = 1 ' Used to be TYPE_PART
swDocASSEMBLY = 2 ' Used to be TYPE_ASSEMBLY
swDocDRAWING = 3 ' Used to be TYPE_DRAWING
End Enum
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim swConfig As SldWorks.Configuration
Dim vSheetNameArr As Variant
Dim vSheetName As Variant
Dim I As Long
Dim nDocType As Long
Dim op As Long
Dim suppr As Long
Dim lErrors As Long
Dim lWarnings As Long
Dim boolstatus As Boolean
Dim bRet As Boolean
Dim FileConnu As Boolean
Dim nbConnu As Integer
Dim sModelName As String
Dim sPathName As String
Dim TabConnu(10000) As String
Dim sConfigName As String
Const dxfSubFolder As String = "\dwg"
Const pdfSubFolder As String = "\pdf"
Const stepSubFolder As String = "\step"
Sub Main()
Set swApp = Application.SldWorks
boolstatus = swApp.SetUserPreferenceIntegerValue(swStepAP, 214) 'Force la version AP214
boolstatus = swApp.SetUserPreferenceIntegerValue(swStepExportPreference, swAcisOutputGeometryPreference_e.swAcisOutputAsSolidAndSurface) 'Force l'export en format Solid/Surface Geometry
Set swModel = swApp.ActiveDoc
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en PDF
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".dwg", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en DWG
Call ExportStep ' Appelle le programe d'export STEP
End Sub
Function GetFilename(strPath As String) As String
Dim strTemp As String
strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)
End Function
Sub ExportStep() ' Vérification si c'est une piece ou un assemblage
Set swDraw = swModel
vSheetName = swDraw.GetSheetNames
vSheetNameArr = swDraw.GetSheetNames
For Each vSheetName In vSheetNameArr
bRet = swDraw.ActivateSheet(vSheetName): Debug.Assert bRet
Set swView = swDraw.GetFirstView 'Sélectionne le fond de plan
Set swView = swView.GetNextView 'Passe à la vue suivante pour exclure le fond de plan
While Not swView Is Nothing
' Determine si la vue est une pieces ou un assemblage
sModelName = swView.GetReferencedModelName
sModelName = LCase(sModelName)
sConfigName = swView.ReferencedConfiguration
FileConnu = False
If InStr(sModelName, "sldprt") > 0 Then
nDocType = swDocPART
ElseIf InStr(sModelName, "slasm") > 0 Then
nDocType = swDocASSEMBLY
Else
nDocType = swDocNONE
Exit Sub
End If
If nDocType = 1 Then
For I = 1 To nbConnu
If UCase(sModelName) & " - " & UCase(sConfigName) = TabConnu(I) Then
FileConnu = True
End If
Next
If Not FileConnu Then
nbConnu = nbConnu + 1
TabConnu(nbConnu) = UCase(sModelName) & " - " & UCase(sConfigName)
Call Export
End If
End If
Set swView = swView.GetNextView
Wend
Next vSheetName
End Sub
Sub Export()
Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors)
Set swModel = swApp.ActiveDoc
boolstatus = swModel.ShowConfiguration2(sConfigName)
Set swConfig = swModel.GetActiveConfiguration
sPathName = swModel.GetPathName & ".step"
If Dir(sPathName, vbHidden) <> "" Then 'Test l'existence du fichier
suppr = MsgBox("Le fichier " & sPathName & " existe déjà, voulez vous le supprimer?", vbYesNo) 'Message utilisateur confirmation de suppression oui/non
If suppr = vbYes Then 'Réponse Oui
Kill (sPathName) 'Suppression du fichier existant
swModel.SaveAs2 sPathName, 0, True, False 'Enregistrement du fichier
op = MsgBox("Le fichier a été enregistré sous " & sPathName & vbNewLine)
Else 'Réponse NON
MsgBox ("Fichier conservé") 'Message utilisateur
End If
Else
swModel.SaveAs2 sPathName, 0, True, False 'Enregistrement du fichier
op = MsgBox("Le fichier a été enregistré sous " & sPathName) 'Message utilisateur
End If
swApp.CloseDoc (sModelName)
Set swModel = swApp.ActiveDoc
End Sub
Essaye d’identifier les fichiers surs lesquels la macro ne fonctionne pas(surtout si ce sont toujours les mêmes ):
plusieurs piste :
Le 3D et la mise ne plan ne sont pas dans le même repertoire.
Le 3D et la mise ne plan n’ont pas exactement le même nom.
Une des propriété recherché par la macro n’existe pas.
Les fichiers de destinations (pdf/dwg et/ou STEP) sont déjà ouverts ou en lecture seules…
Les Noms des fichiers et/ou de répertoires ont des caractères spéciaux ( accents,points,…)
Attention aussi les macro sont sensibles aux CASSES … c’est à dire (pour résumer) qu’elles font la différences entre les minuscules et les MAJUSCULES) c’est valable pour les noms de fichiers mais aussi pour les extensions.
…
l’idéal est de parcourir tes macro en modes pas-a-pas (F8), avec la fenêtres des variables locales visible,
et éventuellement de survoler les variables dans les lignes de codes avec la souris pour vérifier si elles récupèrent bien les données qui leur sont demandées.
(surtout en node « debug » sur les points d’arrêts…
Question subsidiaire, comment lancez-vous l’exécution de la macro ? un bouton sous solidworks ou par la touche lecture directement dans l’éditeur VBA? Lancez-vous toujours la macro avec la routine « Main » ?
Bon, j’ai regardé mais manque plein de choses pour créer les sous-dossier entre autres. @Antoine_Ruelle , vous aviez testé le code proposé par @sbadenis (4ème réponse) qui à mon sens était parfaitement fonctionnel?
Oui et j’avais sauté un message mais quand je te demande si elle fonctionne tu me répond avec la macro précédente avec les révisions.
Prends la dernière version comme indiquée par @Cyril.f et @Maclane et cela devrait fonctioner.
Par contre pas sûr que le code soit optimisé, il est fait à la va vite à partir de celui de @Cyril.f .
J’ai toujours tester sur le même fichier. la mise en plan d’une casquette.
La mise en plan est dans un dossier différents des pièces, mais les fichier ont le même nom.
J’ai déjà regarder le code en le faisant pas-a-pas, et comme je ne m’y connais pas trop je ne sui spas certains de pouvoir identifier correctement les soucis.
Pour lancer la macro je me suis fait un bouton et j’ai aussi essayer avec la touche lecture.
Oui pour les sous-dossier pour le moment je n’ai rien fait pas part collé les 3 variable à définir.
Car j’essaye de faire fonctionne le code à chaque fois. J’ai repris le code bases sans faire de modification à part enlever la Révision dans le nom du fichier.
ça a fonctionner une fois, j’ai supprimer les fichier généré et recommencer et la j’avais l’erreur ci dessous
Et non je n’ai pas encore tester le code de la 4e réponse @Cyril.f
Bonne nouvelle.
Ne reste donc plus qu’à valider la « Meilleur réponse » pour clôturer cette discussion.
Et à bientôt pour de nouvelles macro…
entre-temps, je te conseil de consulter différents sites (pas toujours en français -Visual Basic- oblige) mais souvent didactiques pour se lancer dans la programmation: