XL 2013 Mémoriser le dernier emplacement de sauvegarde

M.Ben

XLDnaute Nouveau
Bonjour la communauté,

Je viens vers vous car je bloque sur une macro pour une feuille Excel que je développe.

La macro en question me permet de spécifier un emplacement de fichier, de nommer ce dit fichier et l'enregistrer en PDF via un clic bouton.

Le problème que je rencontre est le suivant, je souhaiterai que l'emplacement défini reste en mémoire et que lorsque je reclique sur mon bouton, une boite de dialogue apparaisse en montrant l'endroit où se trouve l'emplacement du dernier fichier enregistré et que si je le souhaite je puisse enregistrer mon fichier au même endroit ou alors lui spécifier un nouvelle endroit où sauvegarder le fichier ainsi de suite.

Actuellement mon code est sous Excel 2013 mais je le fais tourner également sous Excel 365

Ci-dessous le code en question.
Private Sub EnregistrementPdf_Click()

Dim Name As Variant
Dim Chemin As String


With Application.FileDialog(msoFileDialogFolderPicker)

'Définit un titre pour la boîte de dialogue
.Title = "Selectionner un lecteur et un dossier de sauvegarde"
.Show

'Affiche le nom du dossier sélectionné
If .SelectedItems.Count > 0 Then

Chemin = .SelectedItems(1) & "\"
ActiveWorkbook.Names.Add Name:="Emplacement", RefersTo:=Chemin

'Fait apparaitre un Boite de dialogue pour renseigner un nom "Nom du fichier"
Name = InputBox("Renseignez le nom du fichier", "Nom Fichier", "Renseignez le nom ici")
'Range("A47").Value = Name 'Test la fonction Name
Chemin = Chemin & Name & ".pdf"

'Convertis et sauvegarde en PDF
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
Chemin, Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
From:=1, To:=2, OpenAfterPublish:=True

Else
MsgBox "Abandon", , "information"

End If

End With

End Sub

J'espère que ma demande est suffisamment claire et que parmi vous des personne seront m'aider.

Bien à vous
 
Solution
d'accord le chemin est donc variable seul le dernier est valide c'est ça
si c'est ça alors
VB:
Sub test()
    Dim cheminPDF$, Chemin
    'on cherche si le name "cheminPDF existe et si oui on recupere le chemin precedamment enregistré
    'et  on determine cheminPDF comme dossier courrant(pour etre sur
    For Each nam In ThisWorkbook.Names
        If nam.Name = "cheminPDF" Then cheminPDF = Split(Split(nam.RefersTo, Chr(34))(1), Chr(34))(0): ChDir cheminPDF
    Next

    'on ouvre la boite de dialog qui n'enregistre pas mais crée le chemin a l'inverse du dialog "SaveAs"
    'dans le initial file name je met cheminpdf +du texte t'invitant a taper le nom que tu veux
    Chemin = Application.GetSaveAsFilename(InitialFileName:=cheminPDF &...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour M.Ben et bienvenu sur XLD,
Vous avez plusieurs possibilités :
1- La plus simple : vous utilisez des cellules pour mémoriser le chemin, et ensuite il suffira de faire :
VB:
Chemin=range("A1") par ex.
2- On peut aussi définir une variable en public qui restera mémoriser même si on sort de la macro, mais évidemment sera effacée lorsque vous fermerez le fichier. Pour cela il faut déclarer cette variable AVANT le sub :
Code:
Public Chemin As String
Private Sub EnregistrementPdf_Click()
Dim Name As Variant
...
et évidemment supprimer le "Dim Chemin As String" existant.
 

patricktoulon

XLDnaute Barbatruc
re oui @vgendron a raison
j'ai une proposition et pas que pour le dossier
je te propose une vrai fenêtre d'enregistrement la "Application.GetSaveAsFilename"
elle a tout de la saveAS sauf quelle ne fait que récupérer le chemin tapé
et dans son <<initialfilename>> je met le cheminPDF si il existe dans les name

quand tu a tapé le nom et cheminPDF n'existe pas dans les names alors il est créé

et tu exporte en pdf avec "chemin"qui est le return de ce dialog

terminé tu a ce que tu veux la prochaine fois que tu ouvre ce dialog
il ira chercher d'abords dans le name "cheminPDF"
on a ainsi supprimer le besoin de l'inputbox et c'est une vrai fenêtre d'enregistrement

et par 2 fois
une avec chdir et l'autre avec initialfilename on sélectionne cheminPDF comme dossier courant

testé plusieurs fois
jai commenté le code mais c'est assez simple a comprendre

VB:
Sub test()
    Dim cheminPDF$
    'on cherche si le name "cheminPDF existe et si oui on recupere le chemin precedamment enregistré
    'et  on determine cheminPDF comme dossier courrant(pour etre sur
    For Each nam In ThisWorkbook.Names
        If nam.Name = "cheminPDF" Then cheminPDF = Split(Split(nam.RefersTo, Chr(34))(1), Chr(34))(0): ChDir cheminPDF
    Next

    'on ouvre la boite de dialog qui n'enregistre pas mais crée le chemin a l'inverse du dialog "SaveAs"
    'dans le initial file name je met cheminpdf +du texte t'invitant a taper le nom que tu veux
    Chemin = Application.GetSaveAsFilename(InitialFileName:=cheminPDF & "entrez un nom pour ce fichier ici", filefilter:="PDF Files (*.pdf), *.pdf", Title:="ENREGISTREMENT DE LA CAPTURE")

    'si on annule on sort directe
    If Chemin = False Then MsgBox "Abandon!!": Exit Sub

    'si on a pas annulé et que le name "cheminPDF" n'existe pas on le cré avec le chemin(pour la premiere fois au moins )
    If cheminPDF = "" Then ThisWorkbook.Names.Add Name:="cheminPDF", RefersTo:=Mid(Chemin, 1, InStrRev(Chemin, "\"))

    'terminé
    'et on sauve la feuille en pdf avec le nom tapé dans la boite de dialog

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Chemin, Quality:= _
                                    xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
                                    From:=1, To:=2, OpenAfterPublish:=True

End Sub

Voilà monsieur ;)
 

M.Ben

XLDnaute Nouveau
Merci à vous pour vos retours rapides et forts instructifs.

J'ai testé toutes vos propositions (sauf la mémorisation du chemin dans une cellule qui me séduit moins).

La solution 2 de Sylvanu qui est de déclarer ma variable "Chemin" en Public, a fonctionné une fois et après celle-ci n'a plus voulu fonctionner.
J'avais beau cliquer sur mon bouton ou même run la macro, la boite de dialogue n'a plus voulu s'exécuter (pas de message d'erreur, mais rien ne se passait).

J'ai bien apprécié la macro proposé par patricktoulon (grand merci d'avoir pris le temps de commenter tes lignes, n'étant pas un expert comme vous tous, les commentaires m'aident énormément à progresser et à comprendre).

La macro tourne extrêmement bien et elle allège la mienne qui demande plus d'étape à l'utilisateur (ça enlève l'étape de l'InputBox que je trouve assez moche ^^, je suppose qu'on doit pouvoir la personnaliser, mais ça ne faisait pas partie de mes priorités).

Cependant elle ne conserve pas le chemin du dernier fichier enregistré.

Je m'explique:

- J'ai fait un premier essai où j'ai enregistré l'onglet qui m'intéressait sur mon bureau.

- J'ai cliqué de nouveau sur mon bouton, la boite de dialogue s'ouvre bien au niveau de mon bureau, là où est situé mon dernière enregistrement, jusque-là tout va bien.

- J'ai alors enregistré ma feuille à un autre endroit (autre que mon bureau).

- J'ai cliqué une troisième fois sur mon bouton et là, la boite de dialogue c'est ouverte de nouveau sur mon bureau à l'emplacement de mon premier enregistrement et non du dernier enregistrement.

- J'ai fermé mon fichier Excel et réouvert en pensant que ça réinitialise le Chemin mais j'avais toujours en mémoire le chemin de mon bureau.

Désolé pour se pavé.

Si ça vous intéresse et si cela peut faciliter les échanges, j'ai joint mon fichier.
Car je me demande si toutes mes macros que j'ai dedans ne viennent pas mettre le bazar.
 

Pièces jointes

  • Calculs chaine de cotation 4.5 .xlsm
    769.9 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
d'accord le chemin est donc variable seul le dernier est valide c'est ça
si c'est ça alors
VB:
Sub test()
    Dim cheminPDF$, Chemin
    'on cherche si le name "cheminPDF existe et si oui on recupere le chemin precedamment enregistré
    'et  on determine cheminPDF comme dossier courrant(pour etre sur
    For Each nam In ThisWorkbook.Names
        If nam.Name = "cheminPDF" Then cheminPDF = Split(Split(nam.RefersTo, Chr(34))(1), Chr(34))(0): ChDir cheminPDF
    Next

    'on ouvre la boite de dialog qui n'enregistre pas mais crée le chemin a l'inverse du dialog "SaveAs"
    'dans le initial file name je met cheminpdf +du texte t'invitant a taper le nom que tu veux
    Chemin = Application.GetSaveAsFilename(InitialFileName:=cheminPDF & "entrez un nom pour ce fichier ici", filefilter:="PDF Files (*.pdf), *.pdf", Title:="ENREGISTREMENT DE LA FEUILLE EN PDF")

    'si on annule on sort directe
    If Chemin = False Then MsgBox "Abandon!!": Exit Sub

    'si on a pas annulé et que le name "cheminPDF" n'existe pas on le cré avec le chemin(pour la premiere fois au moins )
    If cheminPDF <> "" Then ThisWorkbook.Names("cheminPDF").Delete
    ThisWorkbook.Names.Add Name:="cheminPDF", RefersTo:=Mid(Chemin, 1, InStrRev(Chemin, "\"))

    'terminé
    'et on sauve la feuille en pdf avec le nom tapé dans la boite de dialog

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Chemin, Quality:= _
                                    xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
                                    From:=1, To:=2, OpenAfterPublish:=True

End Sub
 
Dernière édition:

M.Ben

XLDnaute Nouveau
d'accord le chemin est donc variable seul le dernier est valide c'est ça
si c'est ça alors
VB:
Sub test()
    Dim cheminPDF$, Chemin
    'on cherche si le name "cheminPDF existe et si oui on recupere le chemin precedamment enregistré
    'et  on determine cheminPDF comme dossier courrant(pour etre sur
    For Each nam In ThisWorkbook.Names
        If nam.Name = "cheminPDF" Then cheminPDF = Split(Split(nam.RefersTo, Chr(34))(1), Chr(34))(0): ChDir cheminPDF
    Next

    'on ouvre la boite de dialog qui n'enregistre pas mais crée le chemin a l'inverse du dialog "SaveAs"
    'dans le initial file name je met cheminpdf +du texte t'invitant a taper le nom que tu veux
    Chemin = Application.GetSaveAsFilename(InitialFileName:=cheminPDF & "entrez un nom pour ce fichier ici", filefilter:="PDF Files (*.pdf), *.pdf", Title:="ENREGISTREMENT DE LA FEUILLE EN PDF")

    'si on annule on sort directe
    If Chemin = False Then MsgBox "Abandon!!": Exit Sub

    'si on a pas annulé et que le name "cheminPDF" n'existe pas on le cré avec le chemin(pour la premiere fois au moins )
    If cheminPDF <> "" Then ThisWorkbook.Names("cheminPDF").Delete
    ThisWorkbook.Names.Add Name:="cheminPDF", RefersTo:=Mid(Chemin, 1, InStrRev(Chemin, "\"))

    'terminé
    'et on sauve la feuille en pdf avec le nom tapé dans la boite de dialog

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Chemin, Quality:= _
                                    xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
                                    From:=1, To:=2, OpenAfterPublish:=True

End Sub
Exactement, ce que je recherchais.

Un grand merci patricktoulon.
 

M.Ben

XLDnaute Nouveau
Bonjour la communauté XLD,

Ce poste est juste la pour préciser quelque chose sur la macro pour l'enregistrement de fichier avec chemin variable et mémorisation du dernier chemin connu.
Après l'ajout de quelques fonctionnalités supplémentaires, la macro qui fonctionnait jusqu'à lors c'est mis à m'envoyer un message d'erreur (erreur 76) et du coup l'enregistrement ne voulait plus se faire alors qu'aucune modif sur cette macro n'était faite.
En remplaçant :" ChrDir cheminPDF" par "ChrDir "C:\" " à la fin de la ligne ci-dessous, cela à réglé le problème.
If nam.Name = "cheminPDF" Then cheminPDF = Split(Split(nam.RefersTo, Chr(34))(1), Chr(34))(0): ChDir cheminPDF
 

Discussions similaires

Réponses
22
Affichages
391
Réponses
3
Affichages
199
Réponses
16
Affichages
621