Résolu VBA pour enregistrer sous (Excel .xlsm)

  • Auteur de la discussion Philou250
  • Date de début

Philou250

Habitué
Bonjour à toutes et à tous,

Je suis actuellement en train de coder une petite macro pour "enregistrer sous" un fichier Excel supportant les macro (.xlsm).
Je précise que la macro doit ouvrir la boite de dialogue pour sauvegarder, proposer un nom de sauvegarde (en fonction du contenu de certaines cellules), et ensuite, si l'utilisateur est satisfait du nom, il l'enregistre. (C'est à dire qu'il doit quand même pouvoir modifier le nom de sauvergarde).

Du coup j'ai testé ce code :
Code:
Dim REP As FileDialog

SaveFileName = "" & Cellule1 & " " & Cellule2 & ""
ChDir "V:\...\..."
Set REP = Application.FileDialog(msoFileDialogSaveAs)
With REP
    .AllowMultiSelect = False
    .InitialFileName = SaveFileName
    If .Show = -1 Then
        FichierProtoMaster.SaveAs Filename:=.SelectedItems(1)
   End If
End With

Mais par défaut il propose d'enregistrer le fichier en .xls, j'aimerai qu'il propose d'enregistrer en .xlsm par défaut (car sinon il ne fonctionne pas). Avez-vous une idée de code réalisant ceci ?


 

zeb

Modérateur
Salut,

Wow! Une clause With pour se dispenser de taper quatre fois trois lettres... (oui, je sais, l'aide d'Excel fait comme ça aussi ;) )
Et une concaténation de chaînes vides... :/

Deux solutions à ton problème :

Pas génial :
Mets une extention par défaut à ton nom de fichier.

Canonique :
Utilise la propriété FilterIndex de ton objet FileDialog.
 

Philou250

Habitué
Merci pour ta réponse.
J'ai également trouvé des informations sur le fileformat (du coup j'ai testé le code ci-dessous et ça enregistre bien sous le format .xlsm) :

Code:
    SaveFileName = "" & Cellule1 & "_" & Cellule2
    ChDir "V:\Prototypes\Prototype_Request"                
    Set REP = Application.FileDialog(msoFileDialogSaveAs)
    With REP
        .AllowMultiSelect = False
        .InitialFileName = SaveFileName

        If .Show = -1 Then
            FichierProtoMaster.SaveAs Filename:=SaveFileName, _
            FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
        End If
    End With

(J'ai essayé également de rajouter un : .FilterIndex = 2 avec le with REP, mais je n'ai pas vu de différence. Je n'ai pas non plus vu d'explication de sa fonction. Quelle est son utilité ?)

Mais j'ai beau modifier le nom du fichier lors de l'enregistrement, il garde le nom qui est stocké dans la variable SaveFileName (normal étant donné que j'ai écrit Filename:=SaveFileName).
Donc j'aurai voulu savoir s'il y avait une possibilité de prendre en compte le nom que l'utilisateur a donné au fichier.

Merci
 

zeb

Modérateur
Meilleure réponse
M'enfin!

Le FilterIndex sert à présélectionner le type de fichiers.

Les fichiers sélectionnés par le FileDialogBox sont stockés dans le tableau SelectedItems.
T'as demandé "pas de sélection multiple", alors ton tableau n'aura qu'un élément.

Code:
Dim rep As FileDialog

Set rep = Application.FileDialog(msoFileDialogSaveAs)
rep.AllowMultiSelect = False
rep.InitialFileName = "toto.xlsm"
rep.FilterIndex = 2
If rep.Show = -1 Then MsgBox rep.SelectedItems(1)
 

Philou250

Habitué
Je me permets de relancer ce sujet pour dire qu'il y a une erreur dans le code ci-dessous :

[Edit] /!\ Erreur de code /!\ Voir les messages ci-dessous[/Edit]

En effet, a ligne : ChDir "V:\Prototypes\Prototype_Request" qui sert à ouvrir la boite de dialogue sur le bon dossier ne fonctionne pas !! (la ligne s'exécute mais n'est pas prise en compte finalement.)

Je ne me suis pas aperçu du "bug" tout de suite car en apparence cela fonctionnait mais en fait non ! (je n'explique pas les détails, je risque de m'emberlificoter pour pas grand chose^^)

Bref en gros, pour ouvrir le dossier souhaité dans le but d'enregistrer ensuite un fichier, j'ai tapé ce code ci-dessous à la place des deux premières lignes :

ChDrive "V:\"
ChDir "V:\Prototypes\Prototype_Request"
savefilename = CurDir & "\TEST.xlsm"

Donc voilà, si ça peut aider quelqu'un.
 

zeb

Modérateur
Salut,

M'enfin, qu'est-ce que tu nous a fait là mon cher Philou !?
Et SelectedItems, où t'en sers-tu ?

Vire donc ces ChDrive et ChDir d'un autre temps !
Et mets ton chemin dans InitialFileName.

Code:
With Application.FileDialog(msoFileDialogSaveAs)
    .AllowMultiSelect = False
    .InitialFileName = "V:\Prototypes\Prototype_Request\" & Cellule1 & "_" & Cellule2
 
    If .Show Then
        FichierProtoMaster.SaveAs Filename:=.SelectedItems(1), _
                                  FileFormat:=xlOpenXMLWorkbookMacroEnabled, _
                                  CreateBackup:=False
    End If
End With
 

Philou250

Habitué
En effet. Moins de code, suppression d'une variable (SaveFileName), tout aussi efficace, et moins has-been apparemment ;)
 

zeb

Modérateur
Des variables en plus ou en moins, ce n'est pas si important. D'ailleurs, je n'utilise personnellement pas With. Je préfère déclarer une variable. Je peux ainsi la tracer dans les outils de débogage.

Par contre, l'utilisation à bon escient des propriétés en entrée (InitialFileName) et en sortie (SelectedItems) est primordiale.

Re-regarde ton code. Le choix proposé à l'utilisateur n'était pas pris en compte pour la sauvegarde !
Seule l'annulation l'était.

----------------------

J'ai même supprimé la comparaison avec -1 dans le test. Show renvoie en fait Vrai ou Faux. Pas besoin d'en faire plus ;)

----------------------

Même en plein été tu vais du VB ?
 

Philou250

Habitué
Ah mais, en fait je n'ai pas montré le bon code^^, je me suis focalisé sur les lignes ChDir ... et du coup je n'ai pas vu que la suite du code était erronée. Donc c'était ce code que j'ai voulu montrer :

Code:
ChDrive "V:\"
ChDir "V:\Prototypes\Prototype_Request"
SaveFileName = CurDir & "\" & Cellule1 & "_" & Cellule2

Set REP = Application.FileDialog(msoFileDialogSaveAs)
    With REP
        .AllowMultiSelect = False
        .InitialFileName = SaveFileName
        .FilterIndex = 2
        If .Show = -1 Then
            FichierProtoMaster.SaveAs Filename:=.SelectedItems(1), FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
        End If
    End With

Oui, j'aime bien le VB, et je ne suis pas encore en Vacances ;)
Tu ne prends, toi non plus, pas de pause ? ^^
 

zeb

Modérateur
Non, pas de vacances cette année, mais c'est mon choix.

@drul, va voir si l'étoile noire c'est pas programmé en VB !

(Ceci expliquerait peut être la piètre qualité de la DCX - Défense Contre X-fighter, et surtout l'intrusion si facile de R2D2 dans le réseau informatique... :lol: )
 

drul

Obscur pro du hardware
Staff
Ben depuis "independance day" je sais que tous les extra terrestes utilisent du C++ et une interface RJ45 pour leurs réseaux informatique ... :spamafote:
Pour l'étoile noire, stp retourne pas la hallebarde dans la plaie, elle me manque trop :cry:

P.S. bon on va arrêter de flooder ce topac je crois ...
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 852
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut