Question sur ma macro

Si ça ne fonctionne toujrous pas, ajoute des espions comme indiqué ici :

http://www.tomshardware.fr/forum/id-1348092/tutoriel-excel-macro-vba-debogage.html

 

Et quelles sont les valeurs des variables :

NomDossierPDF 

CheminNomFichierPDF

 

 

Où s'arrete ta macro ?

1 « J'aime »

re

 

Pour aider au test d'une macro > dans l'éditeur d'équation cliquer sur "Affichage" sur "Fenêtre de variables locales" > voir pièce jointe


editeur_de_macro_fenetre_variables_locales.png
2 « J'aime »

Nos posts se croisent, désolé.

 

C'est bizarre que "SaveAs" ne fonctionne pas correctement avec le nom complet du fichier (chemin+nom+extension).

Pareil pour le bug avec le dossier qui existe déjà.

 

Essaye avec la commande "SaveAs" pour ModelDocExtension. C'est celle que l'utilise dans mes macros.

Voici comment déclarer :

   Dim SWmodext as As SldWorks.ModelDocExtension

   Dim swExportPDFData     As SldWorks.ExportPdfData

   Dim Errors              As Long
   Dim Warnings            As Long

et comment affecter :

   Set SWmodext = SWmoddoc.Extension

ensuite :

   nErrors = SWmodext.SaveAs(CheminNomFichierPDF, 0, 0, swExportPDFData, Errors, Warnings)

 

 

 

Pour la gestion des dossiers, j'utilise l'objet FileSystemObject :

   Dim oFSO                As Scripting.FileSystemObject
   Dim oFld                  As Folder

 

   Set oFSO = New Scripting.FileSystemObject

 

   If oFSO.FolderExists(CheminNomFichierPDF) = False Then
        Set oFld = oFSO.CreateFolder(CheminNomFichierPDF)
    End If

2 « J'aime »

Merci caronmaxime, trés utile cette fenètre !

 

Donc avec ta fenètre mes variable on bien la valeur que je veux leur donner par contre cela ne fonctionne pas comme je le souhaite.

 

il me crér bien le dossier 2014, par contre si le dossier existe déjç cela s'arrète à la ligne Mkdir, (1er point que je ne comprends pas)

 

et il me crér bien le fichier pdf, mais par contre dans le même dossier que le fichier active alors qu'il devrait le mettre dans le dossier 2014 ( 2nd point que je ne comprends pas)

 

HELP !!

1 « J'aime »

L'erreur ne viendrait pas du fait que tu testes un dossier et crées un autre dossier ?

 

If Dir$(CheminNomFichierPDF) = "" Then
MkDir NomDossierPDF

End if

 

CheminNomFichierPDF ou devrait être utilisé ici 2 fois, non ? Une fois pour le test Dir$ et une fois pour le MkDir ?

3 « J'aime »

re re

 

Mathieu, à mon avis ton   [ MkDir  NomDossierPDF]  doit être remplacé par    [MkDir CheminNomFichierPDF]

 

Dans ton éditeur de macro, tu peux double cliquer sur le mot clé MkDir pour le sélectionner et appuyer sur F1. De l'aide te permettra de comprendre.

re re re

 

faire le point en tenant compte des exellentes recommandations de Fgirard et peut être jetter un oeil à la question "ma macro PDF DXF que dire? " que j'ai publié.

 

Autrement voila comment je proccède ( voir pièce jointe ) pour débugger une macro quand elle crée des dossier ou des fichiers


capture_decran_sw_et_editeur_sw_et_explorer_windows.png

Voilà j'ai fais les modifs mais cela me fait toujours pareil, et quand je la relance voilà ou ça bug !

 

 


sans_titre.png

Ah je pense que c'est car tu n'as pas l'antislash à la fin de ton chemin !!!

 

Pour le vérifier, ajoute ceci :

 

If right(CheminNomFichierPDF,1) = "\" then

CheminNomFichierPDF = CheminNomFichierPDF & "\"

End if

 

Il faut le mettre avant ta ligne :

If Dir$(CheminNomFichierPDF) = "" Then

1 « J'aime »

Non lucas, cela reste idem je ne l'ai pas fait comme tu l'as dit , je l'ai fait comme cela.

 

CheminNomFichierPDF = "C:\ANGER\pdf\" & NomDossierPDF & "\"

 

mais cela ne change rien.

 

Par contre comment ça fonctionne cela?

nErrors = SWmoddoc.SaveAs(NomFichierPDF)    NomFichierPDF=045/1-2014-A

 

 

Que doit on avoir entre les parenthèses?

je trouve pas et je comprends pas trop ce qu'il y a sur internet.

Comme indiqué plus haut, ta variable NomFichierPDF doit contenir l'extension du fichier !

Donc pour toi .pdf

Et peut-être le chemin aussi ?

 

Essaye les deux.

J'ai pas possibilité de tester actuellement.

1 « J'aime »

J'ai essayé les 2 sachant que la variable "NomFichierPDF" à bien l'extension à l'origine, mais cela reste pareil, il me l'enregistre dans le dossier ou est le fichier active.

Donc tu n'as pas essayé d'inclure le chemin de destination (là où tu veux l'enregistrer) dans NomFichierPDF ?

Car un "save as" sans le chemin l'enregistre dans le dossier où il y a la pièce d'origine !

 

 

1 « J'aime »

Ca sera :

nErrors = SWmoddoc.SaveAs(CheminNomFichierPDF & NomFichierPDF)

 

En veillant bien à ce qu'il y ait un antislash entre les 2 (dans la première variable ou la seconde, peut importe).

1 « J'aime »

Et pour mon message de 15:47, c'était concernant la création du dossier, pas l'enregistrement du PDF :

 

Lucas P

15 juillet, 2014 - 15:47

Ah je pense que c'est car tu n'as pas l'antislash à la fin de ton chemin !!!

 

Pour le vérifier, ajoute ceci :

 

If right(CheminNomFichierPDF,1) = "\" then

CheminNomFichierPDF = CheminNomFichierPDF & "\"

End if

 

Il faut le mettre avant ta ligne :

If Dir$(CheminNomFichierPDF) = "" Then

1 « J'aime »

re re re re

 

j'ai peur d'insister mais les consiels de Fgirard sont à suivre tant pour l'utilisation de [Scripting.FileSystemObject] que de [SaveAs].

 

Bon maintenant on peut s'obstiner à utiliser Dir mais il faut bien métriser la bête, bien faire le distingo entre fichiers et dossiers !!

 

ton bout de code :

'Test si le dossier avec l'année existe, si non le créer
    If Dir(CheminNomFichierPDF) = "" Then
        MkDir CheminNomFichierPDF
    End If

 

je traduis : Si il n'y a pas de fichier à l'adresse [CheminNomFichierPDF] alors appeler MkDir pour créér le dernier sous dossier contenu dans l'adresse [CheminNomFichierPDF].

 

Ton test n'étant pas le bon alors MkDir peut planter si le dernier sous dossier de l'adresse existe (erreur d'exécution 75).

MkDir plante aussi si l'avant dernier sous dossier de l'adresse n'existe pas (erreur d'exécution 76).

MkDir plante également si le lecteur, [R:] par example, n'est pas disponible, si ...

Par contre MkDir est insensible au fait qu'il y a ou pas un [\] à la fin de l'adresse.

 

un programme un peu aménagé issu de l'aide VBA ( sélectionner Dir et appuyer sur F1 pour obtenir l'aide):

 

' Affiche dans la fenêtre d'exécution (Ctrl+G) les noms des dossiers présents à l'adresse [C:\A\]
' et si l'un de ces noms de dossier est "2014" alors le programme stoppe
Dim MyFile, MyPath, MyName
MyPath = "C:\A\"    ' Définit le chemin d'accès.
MyName = Dir(MyPath, vbDirectory)    ' Extrait la première entrée.
Do While MyName <> ""    ' Commence la boucle.
    ' Ignore le dossier courant et le dossier
    ' contenant le dossier courant.
    If MyName <> "." And MyName <> ".." Then
        ' Utilise une comparaison au niveau du bit pour vérifier que MyName est un dossier.
        If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
            Debug.Print MyName    ' Affiche l'entrée uniquement si elle représente un dossier.
            If MyName = "2014" Then Stop 'le dossier '2014' existe !!
        End If
    End If
    MyName = Dir    ' Extrait l'entrée suivante.
Loop

 

 

ce bout de code est avantageusement remplaçable par ( voir Remarques Fgirard ) :

 

 Dim oFSO                As Scripting.FileSystemObject
 Dim oFld                  As Folder

 Set oFSO = New Scripting.FileSystemObject

If oFSO.FolderExists( "c:\A\2014") = True Then
    stop

End If

 

OU encore plus simple et sans surprise

 

Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")

If fs.FolderExists("c:\A\2014") Then
    Stop
End If

 

 

Reste à voir pour ton [SaveAs]

 

Je viens d'essayer ça :

 

  Dim swApp       As SldWorks.SldWorks
  Dim swModel   As SldWorks.ModelDoc2

  Dim Rép           As Boolean

  Set swApp = Application.SldWorks
  Set swModel = swApp.ActiveDoc
  Rép = swModel.SaveAs("C:\A\toto.pdf") '     "C:\A" doit exister, si "toto.pdf" existe alors il sera automatiquement écrasé

 

et ça fonctionne très bien. >> Quand tu débogues , commence par du texte entre parenthèses (ici "C:\A\toto.pdf"). Si ça fonctionne alors Rép renvoie la valeur True. Ensuite, tu peux tenter de substituer ton texte par une variable (ici une variable déclarée comme string).

 

 

A+

 

 

 

2 « J'aime »

Bonjour à vous,

 

donc j'ai essayé un peu ce que tu m'as donné caronmaxime

 

Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")

If fs.FolderExists("c:\A\2014") Then
    Stop
End If

 

par contre j'ai laissé ma phase d'enregistrement en mettant l'adresse complète.

 

ET CELA FONCTIONNE !!!!

 

par contre et oui il y a juste un hic, si le dossier existe tu as marqué "STOP" je dois marqué quoi pour que cela ne me recrée pas le dossier et que cela enregistre normalement.

 

je te joins mon code.

 

Dim fs

Set fs = CreateObject("Scripting.FileSystemObject")

If fs.FolderExists(CheminNomFichierPDF) Then

    Stop

End If

       MkDir (CheminNomFichierPDF)

 

'------------------------------------------------------------------

'Test si le fichier existe déjà ou confirmation

'puis enregistrement

 

    If Dir$(CheminNomFichierPDF) = NomFichierPDF Then 'Le fichier existe déjà

        If MsgBox("Le fichier : " & NomFichierPDF & vbNewLine & "existe déjà. Voulez-vous le remplacer?", _

         vbOKCancel + vbExclamation) = vbOK Then

            nErrors = SWmoddoc.SaveAs(CheminNomFichierPDF + NomFichierPDF)

        Else

            If MsgBox("Le fichier PDF n'a pas été créé.", vbInformation) = vbOK Then Exit Sub '-------Message et SORTIE-------

        End If

    Else

        If MsgBox("Le fichier : " & NomFichierPDF & vbNewLine & " va être créé", vbOKCancel + vbInformation) = vbOK Then

            nErrors = SWmoddoc.SaveAs(CheminNomFichierPDF + NomFichierPDF)

        Else

            If MsgBox("Le fichier PDF n'a pas été créé.", vbInformation) = vbOK Then Exit Sub '-------Message et SORTIE-------

        End If

    End If

    

End Sub

Il faut tester la condition inverse :

If fs.FolderExists(CheminNomFichierPDF) Then

 

Else

       MkDir (CheminNomFichierPDF)

End If

2 « J'aime »

Parfait Lucas, ça fonctionne !!

MERCI A TOUS POUR VOTRE AIDE !!!!!