XL 2013 FileFormat Erreur Argument

LEIYAZ

XLDnaute Nouveau
Bonjour,

J'ai été sollicité par un de mes collègues pour automatiquement créer une copie d'un fichier dans un dossier "Backup" lors de la sauvegarde.

Je me suis attelé à la tâche, cela fonctionne bien lorsque je sauvegarde en Format xlsm mais je souhaite le sauvegarder en xlsx sans macros car si on ouvre le fichier copié, la macro contenue dedans créer une erreur.

J'ai donc voulu utiliser FileFormat pour modifier le format du fichier copié. Voici mon code :

VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ActiveWorkbook.Save

    ChDir "N:\FOURNITURES HOTELIERES - BUREAUTIQUES - LINGE - EH - EB -EL\BACKUP"
    ActiveWorkbook.SaveCopyAs Filename:="N:\FOURNITURES HOTELIERES - BUREAUTIQUES - LINGE - EH - EB -EL\BACKUP\FICHIER TEST.xlsx", FileFormat:=xlOpenXMLWorkbook

End Sub

Mais lorsque je sauvegarde, j'ai une erreur m'indiquant une Erreur de compilation qui surligne en bleu FileFormat :

erreur.PNG


Lorsque j'enleve le FileFormat et que je laisse l'extension xlsm, la copie du fichier s'exectue bien sans problemes.

Pouvez vous m'aider svp ?

En vous remerciant,
 
Solution
Avec les Application.EnableEvents :
VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim chemin$, nomfich$
Cancel = True
chemin = Path & "\"
nomfich = Left(Name, InStrRev(Name, ".") - 1)
Application.DisplayAlerts = False
Application.EnableEvents = False 'désactive les évènements
SaveAs chemin & "BACKUP\" & nomfich, 51 '.xlsx
SaveAs chemin & nomfich, 52 '.xlsm
Application.EnableEvents = True 'réactive les évènements
End Sub

LEIYAZ

XLDnaute Nouveau
Bonjour,

Merci Sylvanu pour ta réponse rapide.

Oui effectivement cela fonctionne, mais j'ai oublié de mentionner que lorsque je procède ainsi, lorsque j'ouvre le fichier xlsx nouvellement crée, j'ai ce message d'erreur :

erreur.PNG


Et je ne peux donc utiliser le fichier...
 

job75

XLDnaute Barbatruc
Bonjour LEIYAZ, sylvanu,

Surtout ne pas utiliser de macro Workbook_BeforeSave et exécuter :
VB:
Sub Sauvegarder()
Application.DisplayAlerts = False
Me.SaveAs Left(Me.FullName, InStrRev(Me.FullName, ".") - 1), 51 '.xlsx
Me.SaveAs Left(Me.FullName, InStrRev(Me.FullName, ".") - 1), 52 '.xlsm
End Sub
Ainsi on reste sur le fichier .xlsm.

Edit : oublié de préciser que la macro est dans ThisWorkbook.

Sinon utiliser :
VB:
Sub Sauvegarder()
Application.DisplayAlerts = False
With ThisWorkbook
    .SaveAs Left(.FullName, InStrRev(.FullName, ".") - 1), 51 '.xlsx
    .SaveAs Left(.FullName, InStrRev(.FullName, ".") - 1), 52 '.xlsm
End With
End Sub
A+
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour
@job75
astuce que je connais bien mais
si le but est d'enregistrer des sauvegardes en xlsx
quand tu sauve a nouveau en xlsm tu enregistre avec les modifs, hors il est peut être question de document et le xlsm est peut être une base de document qui est remis a zéro une fois la copie enregistrée
style facture, fiche de liaison ,planning ,etc...

perso je préfère copy des selectedsheets et activeworkbook.save as ...............
 

job75

XLDnaute Barbatruc
Salut patricktoulon,

Le code du post #1 vise à copier le fichier tel quel mais sans VBA.

Maintenant si l'on veut placer la sauvegarde dans le sous-dossier BACKUP :

VB:
Sub Sauvegarder()
Dim chemin$, nomfich$
Application.DisplayAlerts = False
With ThisWorkbook
    chemin = .Path & "\"
    nomfich = Left(.Name, InStrRev(.Name, ".") - 1)
    .SaveAs chemin & "BACKUP\" & nomfich, 51 '.xlsx
    .SaveAs chemin & nomfich, 52 '.xlsm
End With
End Sub
 

LEIYAZ

XLDnaute Nouveau
Bonjour @job75, merci pour le dernier code, cela fonctionne lorsque je met un bouton pour y assigner la sub sauvegarder.

Ce que je souhaites, c'est lorsque j'appuie sur sauvegarder ou avec Ctrl+S que la Macro s'exécute sans créer un autre bouton. C'est pour cela que je voulais créer un Workbook BeforeSave dans this workbook.

Donc dans this workbook j'ai mis ce code

VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call Module1.sauvegarder
End Sub

et dans un module j'ai mis celui-ci

Code:
Sub sauvegarder()
Dim chemin$, nomfich$
Application.DisplayAlerts = False
With ThisWorkbook
    chemin = .Path & "\"
    nomfich = Left(.Name, InStrRev(.Name, ".") - 1)
    .SaveAs chemin & "BACKUP\" & nomfich, 51 '.xlsx
    .SaveAs chemin & nomfich, 52 '.xlsm
End With
End Sub

Mais lorsque je créer un bouton pour appeler la macro cela fonctionne bien mais lorsque j'appuie sur sauvegarder, ca crée la copie mais le document se ferme tout seul (ou plante carrément).

Comment faire pour appeler la macro en appuyant sur sauvegarder au en faisant Ctrl+S ?

Merci encore pour vos réponses rapides.
 

job75

XLDnaute Barbatruc
Puisque vous y tenez mettez tout ceci dans ThisWorkbook :
VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Static flag As Boolean
If flag Then Exit Sub
Dim chemin$, nomfich$
Cancel = True
flag = True
Application.DisplayAlerts = False
chemin = Path & "\"
nomfich = Left(Name, InStrRev(Name, ".") - 1)
SaveAs chemin & "BACKUP\" & nomfich, 51 '.xlsx
SaveAs chemin & nomfich, 52 '.xlsm
flag = False
End Sub
Notez qu'il n'est pas nécessaire de mettre Me. devant Path et Name.
 

job75

XLDnaute Barbatruc
Avec les Application.EnableEvents :
VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim chemin$, nomfich$
Cancel = True
chemin = Path & "\"
nomfich = Left(Name, InStrRev(Name, ".") - 1)
Application.DisplayAlerts = False
Application.EnableEvents = False 'désactive les évènements
SaveAs chemin & "BACKUP\" & nomfich, 51 '.xlsx
SaveAs chemin & nomfich, 52 '.xlsm
Application.EnableEvents = True 'réactive les évènements
End Sub
 

Statistiques des forums

Discussions
311 723
Messages
2 081 934
Membres
101 844
dernier inscrit
pktla