Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 VBA - Syntaxe de FileFilter en Dialog GetSaveAsFilename

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,
Quoi de plus compliqué que de sélectionner des extensions avec Excel VBA !?
Ça fait 1 heure que j'essaie de trouver la syntaxe infernale de FileFilter sans succès. Je n'arrive pas à integrer les CSV. Il ne prend que les *.xls*.
VB:
Sub a()
    Dim DialogReturn As Variant
 
    DialogReturn = Application.GetSaveAsFilename(InitialFileName:=ThisWorkbook.Path, _
                                                 FilterIndex:=2, _
                                                 FileFilter:="Classeurs Excel (*.xls*), xls*, (*.csv), *.csv")
    MsgBox "DialogReturn = " & DialogReturn
End Sub

Merci par avance pour toute assistance.
 
Dernière édition:
Solution
Alors, en conclusion de ces recherches, voici comment utiliser ce Dialog à la logique infernale.

Code:
FileFilter:="<Partie gauche>, <Partie droite>")
  1. Seule la partie gauche (avant la virgule) est utile
  2. La partie droite (après la virgule) ne sert à rien mais sa présence est obligatoire
  3. La partie gauche sert:
    • d'affichage dans la zone Type du Dialog (toute la partie gauche)
    • de filtre d'affichage des fichiers via des masques nom de fichier + extensions séparés par point-virgule (ce qui est dans la parenthèse)
    • de choix de l'extension si un nom de fichier est inclus dans le InitialFileName, correspondant à la 1ère extension mentionnée sans wildcards après le point si elle existe (ce qui est dans...
Bonjour Dudu2,
Sur mon PC cette macro n'affiche que les csv :
VB:
Sub a()
    Dim DialogReturn As Variant
    DialogReturn = Application.GetSaveAsFilename(InitialFileName:=ThisWorkbook.Path, _
                                                 FileFilter:="Classeurs Excel (*.csv*), csv*, (*.csv), *.csv")
    MsgBox "DialogReturn = " & DialogReturn
End Sub
 
Après 1h30 d'essais j'ai fini par y arriver.
C'est vraiment une grosse daube cette instruction avec des répétitions inutiles en plus séparées tantôt par "," tantôt par ";".
VB:
Sub a()
    Dim DialogReturn As Variant
  
    DialogReturn = Application.GetSaveAsFilename(InitialFileName:=ThisWorkbook.Path, _
                                                 FileFilter:="Classeurs Excel (*.xls*; *.csv), .xls*;.csv")
    MsgBox "DialogReturn = " & DialogReturn
End Sub

Merci @sylvanu pour ton retour.
 
Dernière édition:
En plus dans le Dialog InitialFileName ce serait plutôt InitialFilePath car on ne peut pas donner de nom initial au fichier.
Ou alors il faut lui donner un nom sans extension et il rajoute la première extension sans "wildcards" des FileFilter. Mais quelle daube !
Franchement qu'on me mette le type qui a fait ça dans un octogone je lui règle son compte.
 
Dernière édition:
Pour passer le nom de fichier je suis obligé de faire ça !
VB:
Sub a()
    Dim DialogReturn As Variant
    Dim BN As Integer
 
    'MsgBox Indispensable pour que le SendKeys fonctionne
    BN = MsgBox("Enregistrer le fichier", vbOKCancel)
 
    If BN = vbOK Then
        'Si on veut l'affichage d'un nom de fichier, il faut le préciser SANS extension sinon il ne sera pas affiché.
        'Si on indique un nom de fichier sans extension et qu'il y a des extensions en FileFilter, le Dialog ajoutera
        'automatiquement la première extension sans "wildcards" de FileFilter (ici "toto.csv") à l'affichage.
        'Et s'il n'y en a pas d'extension sans "wildcards" en FileFilter le Dialog ajoutera seulement un point "."
        'mais uniquement dans la valeur de Return et pas à l'affichage !
        'DialogReturn = Application.GetSaveAsFilename(InitialFileName:=ThisWorkbook.Path & "\toto", _
                                                     FileFilter:="Classeurs Excel (*.xls*; *.csv), .xls*;.csv")

        'Une autre option est d'envoyer le nom de fichier par SendKeys et de ne pas avoir d'extensions en FileFilter.
        'Mais ce SendKeys ne fonctionnera que s'il est immédiatement précédé d'un MsgBox (ou autre astuce à trouver).
        CreateObject("wscript.shell").SendKeys ThisWorkbook.Name                          
        DialogReturn = Application.GetSaveAsFilename(InitialFileName:=ThisWorkbook.Path, _
                                                     FileFilter:="Tous fichiers (*.*), .*")

        MsgBox "DialogReturn = " & DialogReturn
    End If
End Sub

Voir Post #19 pour un exemple d'utilisation.
 
Dernière édition:
Bonsoir dudu2 j'arrive un peu tard mais bon
fait c'est pareil que sa petite sœur la GetOpenFilename
VB:
'Tuto dossiers et fichier :patricktoulon
Sub test()
    '                                     [[GetSaveAsFilename]]
    '
    legende = "Tout les fichiers de type "              ' Légende du filtre
    Exts = Array("txt", "csv", "cmd")                   ' Les extensions
    filtr = "*." & Join(Exts, ";*.")                    ' Format filtre Excel(String)
    dossier_Racine = "C:\Users\patricktoulon\Desktop"   ' Dossier racine
 
 
    'SaveAsFilename
    dest = Application.GetSaveAsFilename( _
                                         InitialFileName:=dossier_Racine, _
                                         FileFilter:=legende & "(" & filtr & ")," & filtr, _
                                         Title:="ENREGISTREMENT DE LA CAPTURE")
    'InitialFileName:=string
    'FileFilter:=string
    'Title:=string
'------------------------------------------------------------------------------------------------------------
 
    '                                     [[GetOpenFilename]]
    '
    'pas de dossier racine pour GetOpenFilename
    'on utilisera la commande ChDrive pour le disque et ChDir pour le dossier
    ChDrive dossier_Racine
    ChDir dossier_Racine
    choix = Application.GetOpenFilename( _
                                        FileFilter:=legende & "(" & filtr & ")," & filtr, _
                                        FilterIndex:=1, _
                                        Title:="CHOISISSEZ UN FICHIER")
 
   
    'FileFilter:=string
    'FilterIndex:=1 '( Long)
    'Title:=string
 
End Sub

et si tu cherche aussi folder comme il n'y a pas de com on a ceci
'ouvrir un dialog folder (fonction perso)
VB:
Sub TEST3()
    MsgBox GetOpenFolderName
End Sub

Function GetOpenFolderName()
    Dim ShellApp As Object, folder As Object
    Set ShellApp = CreateObject("Shell.Application")
    Set folder = ShellApp.BrowseForFolder(0, "CHOISIR UN DOSSIER", 0, "")
    If Not folder Is Nothing Then GetOpenFolderName = folder.Self.Path

'Set folder = Shell.BrowseForFolder(Hwnd, Title, Options, RootFolder)
'Hwnd           Long    - Le handle de la fenêtre parente (mettre 0 si on s’en fiche).
'Title          String  - Le texte affiché dans la barre de titre du dialogue.
'Options        Long    -    Contrôle le comportement du dialogue
        '                     0   &H0     Par défaut : tout les dossiers sont visibles
        '                     1   &H1     rien que  les dossiers du système de fichiers
        '                     16  &H10    avec input pour la saisie manuelle
        '                     512 &H200   rien que les dossiers existants

'RootFolder     Variant - Le dossier racine de départ. Peut être un chemin ("C:\...") ou une constante spéciale (ex : &H11& pour Mes Documents).
End Function
 

Pièces jointes

Dernière édition:
Merci @patricktoulon, à 3h15 du matin !
Je vais garder ces exemples documentés.

Cependant pour GetSaveAsFilename, tu dis:
c'est pareil que sa petite sœur la GetOpenFilename

Mais en GetSaveAsFilename, on veut pouvoir préciser un nom de fichier plus probablement qu'avec GetOpenFilename.

Et là c'est la cata pour 2 raisons
1 - D'une part, si on indique une extension au nom de fichier du InitialFileName, il n'affiche pas le nom du fichier.
2 - D'autre part, si on n'indique pas d'extension au nom de fichier et qu'on a indiqué une ou des extensions dans FileFilter, il va ajouter tout seul la première extension listée de FileFilter qui ne contient pas de "wildcards". Ici .csv (FileFilter:="Classeurs Excel (*.xls*; *.csv), .xls*; .csv")). Sans compter le cas où il n'y a pas d'extension sans "wildcards" où il va ajouter un "." mais seulement au Return.
C'est du grand n'importe quoi.

Donc la seule solution viable pour indiquer un nom de fichier, c'est d'envoyer le nom de fichier par un SendKeys avant le Dialog GetSaveAsFilename et de ne préciser aucune extension comme dans l'exemple du Post #5 que je viens de compléter en commentaires plus clairs et complets qui montrent que le mec qui a fait ça est un vrai débile.
 
Dernière édition:
Salut,
voici une solution fournie par ExcelGPT en utilisant FileDialog :
VB:
Sub UseFileDialog()
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogSaveAs)
    With fd
        .InitialFileName = ThisWorkbook.FullName
        .Title = "Sauvegarder comme"
        If .Show = -1 Then
            Debug.Print .SelectedItems(1)
        Else
            MsgBox "Sauvegarde Annuler"
        End If
    End With
End Sub
Avec msoFileDialogSaveAs on ne peut pas utiliser Filters pour choisir ses filtres, mais par défaut tous les filtres possibles pour des fichiers Excel sont inclus.
Nullosse.
 
Merci @nullosse pour cette solution qui semble plus simple et efficace.
Cependant pour un classeur de FullName .xlsm, il remplace par un FullName .xlsx.
Décidément, on se demande vraiment pourquoi ces foutues fonctions prennent l'initiative de changer les infos qu'on fournit sans justification apparente !

Edit: et impossible de faire .Filters.Add, ça part en live (propriété non gérée par cet objet).
Le filtre qui s'impose et qu'on n'a pas indiqué est .xlsx uniquement et pas tous les fichiers ni même tous les fichiers Excel !
C'est encore de la daube en barre.
 
Dernière édition:
juste en passant
re:
en même temps il y a comme une évidence du pourquoi de la raison
 
Moi je ne vois pas la raison pour laquelle il squeeze le nom de fichier du InitialFileName si on y met une extension.
A la limite qu'il vérifie que l'extension fasse partie de celles qu'on a listées dans le FileFilter, OK, mais ça devrait être tout, et encore car le FileFilter c'est pour filtrer l'affichage, pas pour prédéfinir l'extension qu'on veut utiliser.

De plus qu'il choisisse arbitrairement la 1ère extension non "wildcards" pour suffixer le nom de fichier sans extension indiquée ça n'a pas de sens. Si j'ai plusieurs extensions possibles listées, je ne vois pas pourquoi la 1ère serait prioritaire par rapport aux autres et pourquoi les extensions non "wildcards" seraient à ignorer.

L'idée de ne pas prendre en compte ce qu'on lui donne, nom de fichier avec extension, c'est complètement débile. De quoi je me mêle !?
 
Dernière édition:
re:
réfléchi 30 secondes
il serait alors possible de mettre le initialfilname à "machin.Dudu2" avec comme extension "(*.txt;*.csv;*.cmd)" dans le filter
ça ne voudrais alors plus rien dire
que devrait faire le dialog dans ce cas là hein dis moi
la seule solution valable et robuste et sure!! est d'interdire l'extension dans le nom
il met l'index 1 automatiquement
simple , pas de galère dans le teston(sauf chez dudu 🤪 🤪 🤣 🙃 )
perso au contraire je pense que c'est bien pensé justement
 
Je vois pas pourquoi la machine voudrais m'empêcher de mettre "machin.Dudu2" comme nom de fichier.
Il me semble que c'est mon problème et mon choix et pas celui du mec ou de la team qui a codé le fonction.

Sans compter que l'extension qu'ils ajoutent c'est au petit bonheur la chance de trouver la 1ère extension non "wildcards" de FileFilter qui n'a aucune valeur de référence par rapport aux autres extensions listées. De la daube je te dis !
 
Sauf si j'ai des extensions variées "*.Dudu1", "*.Dudu2", "*.Dudu3" (ou tout simplement diverses extensions Excel) car il va m'en imposer une et une seule qui n'est pas forcément celle que je veux pour le fichier à enregistrer à ce moment précis.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…