Lorsqu'un plan .PDF est ouvert à l'atelier pour consultation et que je dois faire une modif. sur ce même plan directement sur Solidworks, et que j'utilise cette macro PDF, Solidworks plante et se ferme, car il ne peut pas écraser le fichier PDF puisqu'il est déjà ouvert.
Cependant quand j'essaye d'enregistrer en .PDF le plan en passant par "Fichier"-"Enregistrer sous-.PDF", le message "Ce fichier est en lecture seule" apparait et permet à Solidworks de ne pas planter.
Serait-il possible de récupérer une ligne de code dans ma macro qui me permettrais d'avoir ce message lorsque le fichier est déjà ouvert, et de ne pas faire planter Solidworks?
Voici la macro que .PL m'avais proposé (merci encore!) :
Sub main()
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
'obtient le chemin complet du document actif, y compris le nom du fichier : PathName = UCase(Part.GetPathName)
Dim myModelView As Object Set myModelView = Part.ActiveView myModelView.FrameState = swWindowState_e.swWindowMaximized boolstatus = Part.EditRebuild3() Part.ViewZoomtofit2 Part.ViewZoomtofit2 Part.ViewZoomtofit2 longstatus = Part.SaveAs3(Replace(UCase(PathName), "SLDDRW", "PDF"), 0, 0) End Sub
Il faut vérifier si le fichier est ouvert pour créer un msgbox d'avertissement.
Voir cette page :
https://support.microsoft.com/en-us/kb/153058
Et voilà le code :
Sub main() Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc 'obtient le chemin complet du document actif, y compris le nom du fichier : PathName = UCase(Part.GetPathName) Dim myModelView As Object Set myModelView = Part.ActiveView myModelView.FrameState = swWindowState_e.swWindowMaximized boolstatus = Part.EditRebuild3() Part.ViewZoomtofit2 Part.ViewZoomtofit2 Part.ViewZoomtofit2 If GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF") And vbReadOnly Then MsgBox "Fichier en lecture seule" Else longstatus = Part.SaveAs3(Replace(UCase(PathName), "SLDDRW", "PDF"), 0, 0) End If End Sub
Merci beaucoup pour ta réponse .PL, cependant la macro ne marche pas, apparement il y'a un problème au niveau de cette ligne: If GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF") And vbReadOnly Then
En jetant un oeil au lien que tu m'a également fourni j'ai vu qu'il devrait y'avoir un point avant le ReadOnly, mais j'ai essayé de le rajouter et celà n'a rien changé.
Merci d'avance, et désolé pour mon ignorance totale en codification VBA...
J'ai modifié le code pour le cas ou le fichier PDF n'existe pas, le voilà :
Sub main() Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc 'obtient le chemin complet du document actif, y compris le nom du fichier : PathName = UCase(Part.GetPathName) Dim myModelView As Object Set myModelView = Part.ActiveView myModelView.FrameState = swWindowState_e.swWindowMaximized boolstatus = Part.EditRebuild3() Part.ViewZoomtofit2 Part.ViewZoomtofit2 Part.ViewZoomtofit2
If Dir(Replace(UCase(PathName), "SLDDRW", "PDF")) <> "" Then If GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF")) And vbReadOnly Then MsgBox "Fichier en lecture seule" Else longstatus = Part.SaveAs3(Replace(UCase(PathName), "SLDDRW", "PDF"), 0, 0) End If
Merci .PL tu te démènes pour moi, malheureusement la macro ne marche toujours pas, elle ne génère rien du tout.
J'essaye de faire le maximum pour ne pas te faire perdre de temps, donc j'ai refait le tour des parenthèses etc mais je ne vois rien désolé, le code me parait bon...
Désolé, petite erreur de ma part, ça m'apprendra à ne pas assez tester !
Maintenant ça devrait marcher !
Sub main() Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc 'obtient le chemin complet du document actif, y compris le nom du fichier : PathName = UCase(Part.GetPathName) Dim myModelView As Object Set myModelView = Part.ActiveView myModelView.FrameState = swWindowState_e.swWindowMaximized boolstatus = Part.EditRebuild3() Part.ViewZoomtofit2 Part.ViewZoomtofit2 Part.ViewZoomtofit2
If Dir(Replace(UCase(PathName), "SLDDRW", "PDF")) <> "" Then If GetAttr(Replace(UCase(PathName), "SLDDRW", "PDF")) And vbReadOnly Then MsgBox "Fichier en lecture seule" Else longstatus = Part.SaveAs3(Replace(UCase(PathName), "SLDDRW", "PDF"), 0, 0) End If
Merci pour cette nouvelle macro, effectivement elle fonctionne mais sous certaines conditions, et pour résoudre à celà je ne sais pas si c'est moi qui doit régler quelque chose ou si la macro peut être améliorée.
Quand j'ouvre une mise en plan et que je crée un nouveau PDF, pas de souçis.
Par contre quand j'essaye de générer le PDF depuis la mise en plan alors que celui-ci est ouvert, ça me fait planter Solidworks comme avant.
Ce problème est résolu quand j'ouvre le PDF après avoir coché la case "Attributs : Lecture seule" dans les propriétés. A ce moment là la macro fonctionne et le message "Fichier en lecture seule" apparait bien quand j'essaye de générer le PDF. Seulement après avoir fermé le PDF, en essayant de re générer, le message "Fichier en lecture seule" apparait toujours, comme si le fichier restait ouvert, alors que non. J'arrive à palier le problème en décochant "Attributs : Lecture seule" dans les propriétés, et là le PDF veut bien se re générer.
Est-ce que c'est à moi de régler des droits de lecture/écriture ou est ce que la macro doit être modifiée?
Bonjour Manu67, je n'ai pas pu tester ta macro car quand je clique sur le lien de ta réponse, celà m'ouvre un code indéscriptible, j'ai d'ailleurs ce même problème pour tous les liens de pièce jointe en message sur le forum.
Sauf erreur de ma part, l'attribut lecture seule n'est pas extractible sur les fichiers pdf de manière directe.
Il faudrait regarder du coté des fonctions de suppression de fichier de la méthode file (voir: http://warin.developpez.com/access/fichiers/#LI-D-2) et appliquer le traitement voulu en fonction du résultat (si erreur --> Fichier en lecture seule).
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
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
J'ai exactement le même problème, je vais tester vos solution voir si ça fonctionne et j'aimerais bien pousser le vice encore plus loin. Quand un plan pdf est ouvert dans l'explorateur windows dans le volet de visualisation, la sauvegarde se passe bien en apparence mais le fichier pdf est illisible. Une explication ?
manu67, j'ai pas essayé ton code parce que je ne le comprend pas (et comme j'aime bien comprendre ce que je fait...)
J'ai donc fait des recherches et je suis arrivé sur ça :
https://support.microsoft.com/en-us/kb/291295
à compléter avec ça (car problème d'erreur 75) : http://stackoverflow.com/questions/12599322/check-if-a-file-is-already-open-vba
ça marche bien, ca détecte si le pdf est ouvert sur un autre poste. par contre la je viens de quitter les pdfs ouverts sur un autre poste et ça me dit toujours qu'ils sont ouverts... a voir si ça revient tout seul, si c'est du au serveur....