Optimisation code Excel VBA
Bonjour,
Je suis complètement novice en VBA. J'ai bidouillé à partir de code que j'ai trouvé pour faire la chose suivante : Lorsque que je ferme un fichier, la macro enregistre le fichier en pdf. Le code fonctionne parfaitement pour ce que je veux faire.
J'ai cependant 4 problématiques :
1) Le code que j'ai mis demande un chemin précis. Je voudrais que le fichier s'enregistre dans le dossier archive qui est au même niveau que le fichier excel. Le code doit être réplicable facilement dans plusieurs fichiers excel donc je veux le génériquer au maximum
2) Je n'arrive pas à rajouter des lignes de code pour que le fichier défiltre l'onglet 1 avant d'enregistrer en pdf. Je souhaiterais faire ceci : la personne ferme le fichier => ca défiltre => ca enregistre en pdf
3) Le nom du fichier qui s'enregistre en pdf a un format de ce type : "20210819 1107 - Nomdufichier.xlsm.pdf". Pour faire plus propre, je voudrais supprimer le ".xlsm".
4) Je voudrais que quelque part, je puisse avoir une liste en pdf de tous les fichiers qui se sont enregistrés via cette requête : une liste de nom de fichier serait suffisant.
Voici le code en question :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim fichier As String
Date_F = Format(Date, "yyyymmdd ")
Heure = Format(Time, "hhmm - ")
NomFic = ThisWorkbook.Name
With Worksheets("Onglet 1")
fichier = "\" & Date_F & Heure & NomFic & ".pdf"
Dossier = "C:\Doc\"
Chemin = Dossier & fichier
.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Chemin, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
End With
End Sub
Merci d'avance!
bonjour,
une proposition (résultat dans un fichier txt dans le répertoire archive pdf)
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim fichier As String
Date_F = Format(Date, "yyyymmdd ")
Heure = Format(Time, "hhmm - ")
nomfic = ThisWorkbook.Name
nomfic = Left(nomfic, InStrRev(nomfic, ".") - 1)
With Worksheets("Onglet 1")
On Error Resume Next
.ShowAllData
On Error GoTo 0
fichier = "\" & Date_F & Heure & nomfic & ".pdf"
dossier = ThisWorkbook.Path & "\archive"
chemin = dossier & fichier
.ExportAsFixedFormat Type:=xlTypePDF, Filename:=chemin, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
End With
Open dossier & "\listepdf.txt" For Append As 1
Print #1, chemin
Close 1
End SubMerci ! Cela fonctionne très bien. Et cela a déclenché d'autres questionnement !!
Du coup :
1) Est-ce qu'à la clôture du fichier, on ne peut lancer la macro que si des modifications ont été sauvegardées pendant la session. Ex : J'ouvre le fichier, je ne modifie pas, je fais juste que filtrer/défiltrer => la macro à la fermeture se lance pas. Mais si je modifie des données et donc que je sauvegarde => la macro se lance à la fermeture du fichier. Peut-être que c'est plus pertinent d'avoir une macro qui se lance à la sauvegarde et pas à la fermeture du coup ?
2) Est-ce que c'est possible de rajouter, dans le nom du fichier (en fin), le nom de famille de l'utilisateur (pas son prénom) qui a lancé la macro en fermant le fichier ? Nous utilisons Excel 365 avec des profils donc le nom doit être une donnée possible à ajouter.
3) le fichier txt généré peut-il être à chaque fois généré en txt et transformer ce nouveau txt en pdf avec toutes les lignes déjà présentes ?
bonjour,
la réponse est oui aux 3 questions. mais sache qu'enlever un filtre est une modification.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim fichier As String
Date_F = Format(Date, "yyyymmdd ")
Heure = Format(Time, "hhmm - ")
nomfic = ThisWorkbook.Name
nomfic = Left(nomfic, InStrRev(nomfic, ".") - 1)
With Worksheets("Onglet 1")
On Error Resume Next
.ShowAllData
On Error GoTo 0
If ThisWorkbook.Saved = False Then
fichier = "\" & Date_F & Heure & nomfic & "-" & Environ("username") & ".pdf"
dossier = ThisWorkbook.Path & "\archive"
chemin = dossier & fichier
.ExportAsFixedFormat Type:=xlTypePDF, Filename:=chemin, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
listefichierpdf = dossier & "\listepdf.txt"
Open listefichierpdf For Append As 1
Print #1, chemin
Close 1
Set wb = Workbooks.Add
Open listefichierpdf For Input As 1
Do While Not EOF(1)
i = i + 1
Input #1, l
If Not EOF(1) Then Cells(i, 1) = l
Loop
Close 1
With wb
chemin = dossier & "\listepdf.pdf"
.ExportAsFixedFormat Type:=xlTypePDF, Filename:=chemin, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=True, OpenAfterPublish:=False
.Close False
End With
End If
End With
End Sub