XL 2021 Liste des propriétés de fichiers.

jeff1494

XLDnaute Occasionnel
Bonjour à toutes et tous;
Encore une fois je retourne vers la communauté car je suis sûr qu'une âme charitable pourra m'aider;
Voilà mon problème :
J'ai récupéré, grâce à un utilitaire, sous forme d'un fichier Excel tout le contenu d'un dossier contenant un paquet de sous-dossier et de fichiers.
Le but est de pouvoir à terme faire le ménage et de classer tout ce bazar d'une manière facilement compréhensible.
Cette partie là se fera manuellement pour l'instant.
Je récupère des informations du genre le nom, le chemin, la taille, ... de chaque fichier.
Ce qui représente les colonnes suivantes :
  1. Nom du fichier
  2. Extension du fichier
  3. Date de création
  4. Taille du fichier
  5. Répertoire où se trouve le fichier
  6. Date de modification du fichier
  7. Heure de modification du fichier
  8. Chemin d'accès au fichier.
Comme tout cela vient d'un outil externe si je veux changer des infos cela sera fait lors de la création du fichier Excel par cet outil.
Par contre sur pas mal de fichier j'ai ajouté des commentaires. Et ce sont ces derniers que j'aimerais pouvoir lister.

Existe-t-il une liste permettant d'identifier toutes les données attachées au fichier, celles que l'on peut modifier via l'écran des propriétés du fichier.
Je parle de cet écran :

Exemple.jpg

D'avance je remercie celles et ceux qui prendront le temps de se pencher sur ma demande.
Bonne journée à toutes et tous.
 

ralph45

XLDnaute Impliqué
Bonjour @jeff1494,

Sans passer par un utilitaire externe, tu as la possibilité de récupérer toutes ces informations sous les dernières versions d'Excel avec le ruban Données/Obtenir des données/À partit d'un fichier/À partir d'un dossier.

Nativement, il va te récupérer :
  1. Nom du fichier
  2. Extension du fichier
  3. Date de création
  4. Taille du fichier
  5. Répertoire où se trouve le fichier
  6. Date de modification du fichier
  7. Heure de modification du fichier
  8. Chemin d'accès au fichier
a) Mais ensuite, tu pourras personnaliser les champs à extraire dont 4. Taille du fichier (et la liste des champs à extraire supplémentaires est assez conséquente).
b) À noter que tes points 5 et 6 sont les mêmes et seront concaténés.
c) Tu pourras même accéder aux fichiers directement en créant des liens automatiques avec la fonction LIEN_HYPERTEXTE
 

jeff1494

XLDnaute Occasionnel
Bonsoir Ralph45.
Je vais aller regarder de près ce que tu m'indiques.
J'ai utilisé un outil externe juste parce que je l'ai et qu'il y a moyen de sortir un fichier Excel directement sans rien faire, et je n'ai pas réfléchi pour faire autrement.
Dans tous les cas je te remercie pour ton aide, et te souhaite une bonne soirée.
 

jeff1494

XLDnaute Occasionnel
Bonjour à toutes et tous;
J'ai un peu avancé sur mon problème.
  1. J'ai trouvé une liste des codes des méta-données des fichiers. Voir fichier Word ci-joint.
  2. J'ai récupéré un code qui fait presque ce que je veux.
Je dis presque car le chemin du dossier dans lequel on va regarder tous les fichiers est à mettre en dur, et le résultat est dans une MsgBox.
Voici ce code :

VB:
Sub ListeProprietesFichiers_getDetailsOf()
    'source:
    'http://www.microsoft.com/resources/documentation/windows/2000/server/
    'scriptguide/en-us/sas_fil_lunl.mspx
    '
    'Nécessite d'activer la référence Microsoft Shell Controls and Automation
    '
    ' Je voudrais ne pas afficher une boite de dialogue mais
    ' remplir la colonne B.
    
    
    Dim objShell As Shell32.Shell
    Dim strFileName As Shell32.FolderItem
    Dim objFolder As Shell32.Folder
    Dim Resultat As String, Reponse As String
    Dim i As Byte
    
    Set objShell = CreateObject("Shell.Application")
    'Répertoire à traiter
    Set objFolder = objShell.Namespace("C:\Users\Toto\Desktop\Devloppements\Exemples")
    'boucle sur tous les elements du repertoire
    For Each strFileName In objFolder.Items
        
        'Pour que les dosssiers ne soient pas pris en comptes
        If strFileName.IsFolder = False Then
        Resultat = ""
            For i = 0 To 34     ' Ecriture de chaque ligne de le boite de dialogue
                                ' vbLF signifie saut de ligne.
                                ' La variable "Resultat contient l'ensemble des valeurs.
                If objFolder.getDetailsOf(strFileName, i) <> "" Then _
                    Resultat = Resultat & objFolder.getDetailsOf(objFolder.Items, i) _
                    & ":  " & objFolder.getDetailsOf(strFileName, i) & "     " & "Code Méta : " & i & vbLf
            Next
        Reponse = MsgBox(Resultat & vbLf & vbLf & "Voulez vous continuer?", vbYesNo)
        If Reponse = vbNo Then Exit Sub
        End If
    Next
End Sub

Ce que je voudrais pouvoir réaliser est de pouvoir parcourir les différentes lignes de mon fichier , donc de rendre variable le dossier de recherche. Voilà à quoi ressemble ce fichier.

Fichier commentaires.jpg
(ce dernier est généré par l'outil dont je parle dans mon premier message). Je sais que l'on peut faire quasi la même chose en VBA, mais pour l'instant je m'en tient à ce que j'ai déjà (à savoir cet outil).

On retrouve donc les colonnes suivantes :
  • Le nom (Col A) qui contient soit le nom des dossiers et sous-dossiers qui contiennent les fichiers (lignes suivantes).
  • Le commentaire (Col B) c'est là que je voudrais insérer le commentaire du fichier.
  • Le type du fichier (Col C).
  • Les colonnes suivantes (D, E, F, G, H) contiennent les données qui n'ont pas d'autre valeurs que d'être informatives.
  • Le chemin (Col I) qui contient le chemin d'accès au fichier.
Mon but est donc de pouvoir rendre variable les différents chemins d'accès aux fichiers, puis de remplacer la sortie en MsgBox par une écriture dans la colonne B du commentaire du fichier si il existe.

Et pour chaque fichier listé (par exemple voir ligne du fichier Code méta-data fichiers.xls) tester si le code de méta-data 24 est présent alors le mettre dans la colonne B de ce fichier.

J'ai bien essayé d'adapter le code que j'ai trouvé, mais le domaine des "objShell, et confrères" m'est totalement inconnu.

Ce que j'ai essayé de faire est très brouillon, et n'amène à rien. La seule chose intéressante que j'ai trouvé est de pouvoir créer une variable (déclarée As Variant), qui peut contenir le chemin d'accès au fichier. Colonne I concaténée avec la colonne A. Et donc de rendre variable ce qui se nomme "objShell.Namespace".

Donc si une âme charitable pouvait m'aider, j'apprécierai énormément.
En remerciant par avance ceux qui prendront de leur temps, je vous souhaite une bonne soirée à toute et tous.
 

Pièces jointes

  • Liste métadonnées des fichiers.docx
    22.3 KB · Affichages: 5

jeff1494

XLDnaute Occasionnel
J'ai regardé rapidement ce dont tu parles, et j'avoue que je suis très loin d'avoir le niveau pour comprendre ce que j'ai pu voir.
Néanmoins, j'ai vu quelques choses qui me sont plus accessible que d'autres.
Donc je vais m'inspirer de tout cela et essayer de pondre ma version personnelle, pour résoudre mon petit problème.

En tous cas merci de m'avoir aiguillé, bonne journée à toi.
 

patricktoulon

XLDnaute Barbatruc
un truc comme ça vite fait
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'collection sub  et fonction avec récursivité
'liste recursive d'un dossier avec lecture des propriétés
'date 18/08/2024
'librairie utilise shell Automation( en late binding)
'auteur :patricktoulon
Option Explicit
Sub test()
    Dim chemin, table(1 To 100000, 1 To 150)
    chemin = "K:\vba excel\01 HTML XML CDO OUTLOOK requete html"
    ListeProprietesFichiers_getDetailsOf chemin, table
    Cells.Clear
    Application.ScreenUpdating = False
    With Feuil1.[a1].Resize(UBound(table), 50)
        .Value = table
        .Columns.AutoFit
        .VerticalAlignment = xlCenter
    End With
End Sub

Sub ListeProprietesFichiers_getDetailsOf(folder, ByRef table, Optional a As Long = 2)

    Dim strFileName As Object, objFolder As Object, i As Byte, e, ProP$

    Static objShell As Object: If a = 2 Then Set objShell = CreateObject("Shell.Application")

    Set objFolder = objShell.Namespace(folder) 'Répertoire à traiter

    For Each strFileName In objFolder.Items 'boucle sur tous les elements du repertoire

        'Pour que les dosssiers ne soient pas pris en comptes
        If strFileName.IsFolder = False Then
            e = 0
            For i = 0 To 34
                'objFolder.getDetailsOf(objFolder.Items, i)'on obtient le nom de la propriété
                'objFolder.getDetailsOf(strFileName, i)     'on obtient la valeur de la propriété

                ProP = " Nom Taille Type d’élément Modifié le Date de création Date d’accès Attributs Type identifié Propriétaire Sorte Notation Auteurs "

                If ProP Like "* " & objFolder.getDetailsOf(objFolder.Items, i) & " *" Then
                    e = e + 1: table(a, e) = objFolder.getDetailsOf(strFileName, i)
                    table(1, e) = objFolder.getDetailsOf(objFolder.Items, i)
                End If

            Next
            table(a, 13) = strFileName.Path
            a = a + 1
        Else
            'si c 'est un dossier on relance la fonction (appel récursifs)
            a = a + 1
            ListeProprietesFichiers_getDetailsOf (strFileName.Path), table, a

        End If
    Next
End Sub
 

patricktoulon

XLDnaute Barbatruc
bonjour @scraper
le sujet ici est :lister les fichiers dans dossiers et sous dossier avec leur propriétés
le lien n'apporte rien de plus que ce que @jeff1494 avait déjà
voici une version plus propre sans ligne vides (à moins que tu veuillent les dossiers aussi)
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'collection sub  et fonction avec récursivité
'liste recursive d'un dossier avec lecture des propriétés
'date 18/08/2024
'librairie utilise shell Automation( en late binding)
'auteur :patricktoulon
'version :2
OptionOption Explicit
Sub test()
    Dim chemin, table(1 To 100000, 1 To 150)
    chemin = "K:\vba excel\01 HTML XML CDO OUTLOOK requete html"
    ListeProprietesFichiers_getDetailsOf chemin, table
    Cells.Clear
    Application.ScreenUpdating = False
    With Feuil1.[a1].Resize(UBound(table), 50)
        .Value = table
        Columns.AutoFit
        .VerticalAlignment = xlCenter
    End With
End Sub

Sub ListeProprietesFichiers_getDetailsOf(folder, ByRef table, Optional a As Long = 1)

    Dim strFileName As Object, objFolder As Object, i As Byte, e, ProP$

    Static objShell As Object: If a = 1 Then Set objShell = CreateObject("Shell.Application")

    Set objFolder = objShell.Namespace(folder) 'Répertoire à traiter

    For Each strFileName In objFolder.Items 'boucle sur tous les elements du repertoire

        'Pour que les dosssiers ne soient pas pris en comptes
        If strFileName.IsFolder = False Then
            e = 0
              a = a + 1
      For i = 0 To 50
               'Debug.Print objFolder.getDetailsOf(objFolder.Items, i)
               ' objFolder.getDetailsOf(objFolder.Items, i)'on obtient le nom de la propriété
                'objFolder.getDetailsOf(strFileName, i)     'on obtient la valeur de la propriété

                ProP = " Nom Taille Type d’élément Modifié le Date de création Date d’accès Attributs Type identifié Propriétaire Sorte Notation Auteurs Commentaires "

                If ProP Like "* " & objFolder.getDetailsOf(objFolder.Items, i) & " *" Then
                    e = e + 1: table(a, e) = objFolder.getDetailsOf(strFileName, i)
                    table(1, e) = objFolder.getDetailsOf(objFolder.Items, i)
                End If
            Next
            table(a, 14) = strFileName.Path
            Else
            'si c 'est un dossier on relance la fonction (appel récursifs)
            ListeProprietesFichiers_getDetailsOf (strFileName.Path), table, a

        End If
    Next
End Sub
je n'aurais jamais pensé à utiliser shell Automation en récursif pour autre chose que les archives ZIP :D ;)
ben comme ça j'aurais fait le tour pour le listage des fichiers dans une sub ou fonction récursive

tu avais la base du code dans mes ressources concernant le ZIP

ps j'ai ajouté la colonne "commentaire"
 

jeff1494

XLDnaute Occasionnel
Salut Patricktoulon;
En effet j'avais bien vu ton code sur les ZIP, et je voulais essayer de voir si je comprenait quelque chose.
Dans tous les cas je te remercie beaucoup pour ton aide.
Ne me reste plus qu'a comprendre ce que tu as fait, et là c'est pas gagné d'avance, mais je vais m'accrocher.

Concernant les dossiers et sous-dossiers je ne mais que très rarement de commentaires (pas possible avec Windows, alors j'utilise xplorer2 Lite, qui lui permet d'ajouter des commentaires au niveau des dossier, et donc des sous-dossiers.
Donc pas a se soucier des dossiers et sous-dossiers.

Je vais en tout premier lieu utiliser ce que tu m'as gentiment fourni pour voir ce que cela donne.
Je verrais peut-être à faire en sorte de pouvoir sélectionner le fichier au travers de la boite de dialogue standard de Windows, cela je dois être capable de le faire.

Ainsi que de mettre un lien pointant directement sur le fichier, sans l'ouvrir. Peut-être un lien qui ouvrira directement le fichier en question. Je ne sais pas quel niveau de difficulté cela représente d'ouvrir le fichier.

Je suis peut-être un peu ambitieux mais c'est comme cela que j'apprends, en me forçant à faire des choses que je ne pense pas être capable de faire au premier abord.


Encore un grand merci pour ton aide.
Bonne soirée à toi.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
313 866
Messages
2 103 082
Membres
108 521
dernier inscrit
manouba