Microsoft 365 vbDirectory ou pas ? ?

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 !

DenisHen

XLDnaute Junior
Bonjour à la communauté.
Je fais en ce moment une petite "boite de dialogue" personnalisée pour ouvrir ou sauvegarder un fichier (un mini explorateur).
Je suis surpris que certain "dossiers" ("répertoires" pour les anciens) sont parfois concidérés comme des fichiers.

Dossier ou Fichier.png


On voit bien sur la capture que "Users" est dans la liste des fichiers, et n'est pas dans la liste des dossiers.
Pour trier mes dossiers, j'ai :
VB:
If GetAttr(Chemin) = vbDirectory And Left(Chemin, 1) <> "." Then
Et pour mes fichiers :
VB:
If GetAttr(Chemin) <> vbDirectory And Left(Chemin, 1) <> "." Then
KelKin aurait une idée ?
Je pense à un problème de traduction entre "Users" et Utilisateurs".
Denis...
 
Dernière édition:
Solution
non je parlais de ça
et la discussion est longue beaucoup de participation et toutes les méthodes de listing sont passées en revue

ca fait beaucoup de lecture

ce qui a donner ces dialogs
et aussi toute ces méthode de listing ultra rapide

non lecture
Bonjour @Dranreb.
Merci pour votre réponse.
Je préfèrerais utiliser mon petit explorateur (en toute modestie), car il me servira pour ouvrir, charger, enregistrer sous ou exporter vers d'autres types de fichiers, parfois "personnels".
Et je l'utilise aussi dans d'autre logiciels (Word, AutoCAD...).
Encore merci pour votre aide.
Denis.
 
GetAttr renvoie plusieurs attribues combinés le fait d'avoir 17 = vbDirectory + vbReadOnly
il faut utiliser vbDirectory comme masque pour ne tester que l'attribue qui concerne le type de chemin
soit ( GetAttr() and vbDirectory ) = vbDirectory
ou ( GetAttr() and vbDirectory ) <> 0
 
bonjour
tout simplement par ce que dir accepte mal les caractères spéciaux dans les noms de dossiers et fichiers erreur 70 et 53
utilise shell.namespace ("chemincomplet").isfolder sachant que tu peux faire un listage récursif avec ça aussi
on oubliera pas le fso aussi
 
Bonjour DenisHen, le forum,

Essayez le fichier joint avec cette macro dans l'UserForm :
VB:
Private Sub UserForm_Initialize()
Dim fso As Object, dossier As Object, sf As Object, a(), nsf, f As Object, b(), nf, liste$(), i
With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "Sélectionnez un dossier"
    If .Show = False Then Exit Sub
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set dossier = fso.GetFolder(.SelectedItems(1) & "\")
End With
For Each sf In dossier.SubFolders
    ReDim Preserve a(nsf)
    a(nsf) = sf.Name
    nsf = nsf + 1
Next sf
For Each f In dossier.Files
    ReDim Preserve b(nf)
    b(nf) = f.Name
    nf = nf + 1
Next f
If nsf + nf = 0 Then Exit Sub
ReDim liste(Application.Max(nsf, nf) - 1, 1)
For i = 0 To nsf - 1
    liste(i, 0) = a(i)
Next i
For i = 0 To nf - 1
    liste(i, 1) = b(i)
Next i
ListBox1.List = liste
End Sub
A+
 

Pièces jointes

Bonjour le forum,

Avec la macro précédente il s'affiche chez moi des dossiers ou fichiers indésirables, par exemple :

- dans C;\Programmes le dossier Fichiers communs qui accompagne Common Files

- sur le bureau des fichiers dont les noms commencent par "~$".

Pour les éviter il suffit de les tester avec Dir voyez le fichier joint.

A+
 

Pièces jointes

Avec ce fichier (2) j'utilise 2 ListBox et le double-clic sur leurs éléments.

Comme le suggérait Patrick il y a récursivité sur les dossiers :
VB:
Dim fso As Object, chemin$, suite As Boolean 'mémorise les variables

Private Sub UserForm_Initialize()
Dim dossier As Object, sf As Object, a(), nsf, f As Object, b(), nf
If Not suite Then
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Sélectionnez un dossier"
        If .Show = False Then Exit Sub
        Set fso = CreateObject("Scripting.FileSystemObject")
        chemin = .SelectedItems(1)
    End With
End If
Set dossier = fso.Getfolder(chemin)
ListBox1.Clear: ListBox2.Clear
For Each sf In dossier.SubFolders
    If Dir(dossier & "\" & sf.Name, vbDirectory) <> "" Then
        ReDim Preserve a(nsf)
        a(nsf) = sf.Name
        nsf = nsf + 1
    End If
Next sf
If nsf Then ListBox1.List = a
For Each f In dossier.Files
    If Dir(dossier & "\" & f.Name) <> "" Then
        ReDim Preserve b(nf)
        b(nf) = f.Name
        nf = nf + 1
    End If
Next f
If nf Then ListBox2.List = b
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
chemin = chemin & "\" & ListBox1
suite = True
UserForm_Initialize 'récursivité
suite = False
End Sub

Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
If ListBox2 Like "*.xls*" Then ThisWorkbook.FollowHyperlink chemin & "\" & ListBox2: Unload Me
If ListBox2 Like "*.doc*" Then ThisWorkbook.FollowHyperlink chemin & "\" & ListBox2
If ListBox2 Like "*.pdf" Then CreateObject("WScript.Shell").SendKeys "{TAB}~": ThisWorkbook.FollowHyperlink chemin & "\" & ListBox2 ': Unload Me
End Sub

Edit : petite coquille, j'avais mis => chemin = fso.Getfolder(.SelectedItems(1))

Il faut simplement => chemin = .SelectedItems(1)
 

Pièces jointes

Dernière édition:
bonjour @job75
VB:
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
chemin = chemin & "\" & ListBox1
je suis pas sur que ce soit bon pour des éventuels fichiers trouvés dans des sub dossier de 2,3 etc... niveau
puisque chemin c'est le chemin de base me semble til (du dossier maitre) et que tu collectionne que le f.name dans b

autant pour moi je n'avais pas bien vue le suite true et false
on peut dès l'ors organiser un bouton back
histoire de ne pas être obligé de faire appel a nouveau au dialog
 

Pièces jointes

Dernière édition:
- 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

Retour