IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Compter le nombre de dossiers, de fichiers et calculer la taille totale


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    870
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 870
    Par défaut Compter le nombre de dossiers, de fichiers et calculer la taille totale
    Bonjour à tous,

    Pour compter le nombre de dossiers, de sous-dossiers et calculer la taille totale, j'utilise le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub NBdossiersNBfichiersTaillesFichiers()
    Dim GestionFichier As New Scripting.FileSystemObject
    Dim Chemin As String
    Chemin = "C:\Users\...\"
    MsgBox "Nombre de sous-dossiers dans le dossier :" & vbLf & Chemin & " = " & GestionFichier.GetFolder(Chemin).SubFolders.Count
    'cela revoie le bon résultat
    MsgBox "Nombre de fichiers dans le dossier" & vbLf & Chemin & " = " & GestionFichier.GetFolder(Chemin).Files.Count
    'cela revoie le bon résultat
    MsgBox "Taille totale des fichiers dans le dossier :" & vbLf & Chemin & " = " & GestionFichier.GetFolder(Chemin).Size & " octets"
    'cela renvoie "Erreur d'exécution 70" "Permission refusée"
    End Sub
    Pourquoi ce message d'erreur, c'est certainement un problème d'autorisation, comment le régler ?

    Merci d'avance votre réponse

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il faut vérifier que tu as bien l'autorisation sur chaque dossier contenu dans ce repertoire (y compris pour chaque dossier enfant de l'ensemble de l'arborescence).

    si un seul dossier est KO sur l'autorisation, la propriété plante.


    étant donné que je ne sais pas si cette spécification doit également être valable pour les fichiers eux-même, voici une proposition de contournement :


    0) Quelques variables et constante déclarées en haut du module (elles sont utilisées dans plusieurs procédures/fonction)
    1) Ta procédure principale, que j'ai un peu modifié. Un tableau contient les réponses de fin de procédure, qui est couplé à un second tableau qui récolte les résultats à afficher.
    Dans cette procédure, j'introduis un test d'erreur lors de l'accès à la taille totale. En cas d'erreur, on passe au plan B qui est le point numéro 2
    2) Une procédure récursive qui va décortiquer toute l'arborescence et additionner, fichier par fichier, les tailles de chacun. Une gestion d'erreur basique saute un fichier si la lecture de sa taille échoue
    3) Une petite fonction proposée par Dolphy sur VBA Outlook, afin de convertir des Octets de la façon la plus appropriée. Je l'avais un peu retouchée pour en réduire le temps d'exécution et la quantité de lignes d'écriture du code



    copie tout ça dans un nouveau module standard et regarde si ça contourne ton problème, j'ai testé sur différents dossiers (réseau entreprise, réseau local etc...) et j'ai pas rencontré de PB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    Dim Fso As Object
    Dim Taille As Double
    Const Chemin As String = "C:\Users\...\"
     
    Sub NBdossiersNBfichiersTaillesFichiers()
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Dim ListeMess()
    Dim ListeResult()
    Dim i As Long
    Dim PlanB As Boolean
     
    ListeMess = Array("Nombre de sous-dossiers dans le dossier :", _
                      "Nombre de fichiers dans le dossier", _
                      "Taille totale des fichiers dans le dossier :")
     
    ReDim ListeResult(UBound(ListeMess))
     
    With Fso.getfolder(Chemin)
        ListeResult(0) = .subFolders.Count
        ListeResult(1) = .Files.Count
     
        On Error Resume Next
            ListeResult(2) = MEF_Octet_Short(.size)
            ' pour forcer l'erreur et tester manuellement le plan B
            ' t = 1/0
            If Err.Number <> 0 Then PlanB = True
        On Error GoTo 0
     
        If PlanB Then
            Call TailleParFichier(Chemin)
            ListeResult(2) = MEF_Octet_Short(Taille)
        End If
    End With
     
    For i = LBound(ListeMess) To UBound(ListeMess)
        MsgBox ListeMess(i) & vbLf & Chemin & " = " & ListeResult(i)
    Next i
     
     
    End Sub
     
    Sub TailleParFichier(Chemin As String)
    '------------------------------------------------------------------------------------------
    ' Procédure : TailleParFichier
    ' Auteur    : joe.levrai
    ' Date      : 19/01/2016
    ' Détail    : Parcours l'arborescence complète du dossier dont le Path est "Chemin"
    '             Additionne la taille de chaque fichier
    '             Contourne une erreur de lecture de la taille d'un fichier et passe au suivant
    '------------------------------------------------------------------------------------------
    Dim Fichier As Object
    Dim SousDossier As Object
     
    With Fso.getfolder(Chemin)
        If .subFolders.Count > 0 Then
            For Each SousDossier In .subFolders
                Call TailleParFichier(Chemin & SousDossier.Name & "\")
            Next SousDossier
        End If
     
        For Each Fichier In .Files
            On Error Resume Next
                Taille = Fichier.size + Taille
            On Error GoTo 0
        Next Fichier
    End With
     
    End Sub
     
     
    Function MEF_Octet_Short(lgValeur As Double) As String
    '---------------------------------------------------------------------------------------
    ' Procédure : MEF_Octet_Short
    ' Auteur    : Dolphy35 - http://dolphy35.developpez.com/
    ' Date      : 25/04/2008
    ' Détail    : Fonction permettant un affichage en octet, kilo, mega ou giga selon valeur passée en paramètre
     
    ' Modif par : joe.levrai
    ' Date      : 25/04/2015
    ' Détail    : conversion des If imbriqués en une boucle While Wend avec utilisation d'un tableau d'unités
    '---------------------------------------------------------------------------------------
     
    Tableau = Array("Oct", "Ko", "Mo", "Go")
     
    While (lgValeur / 1024 > 1) And i < UBound(Tableau)
        i = i + 1
        lgValeur = lgValeur / 1024
    Wend
     
    MEF_Octet_Short = CStr(Round(lgValeur, 2)) & " " & Tableau(i)
     
    End Function

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    870
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 870
    Par défaut
    Bonsoir joe.levrai

    J'ai testé ton code, lorsque je lance la procédure avec F5 pour "C:\Users\Public\" ça plante à "C:\Users\Public\Documents\Ma musique\".

    Hors je ne vois pas de "Documents\Ma musique\" sous "C:\Users\Public\" ???

    Je ne comprend pas ???

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    à vrai dire, moi non plus

    maintenant, tu tentes d'accéder au répertoire des dossiers publics (pour l'ensemble des comptes du PC)

    peut être que toi tu ne vois pas ce dossier, mais que l'utilisateurs qui le possède sur son profil le voit.

    je ne suis pas un pro dans ce domaine, manipuler les fichiers via Scripting, c'est ma limite actuelle

    au pire, tu peux ajouter une gestion d'erreur s'il plante lors de l'analyse d'un subfolders ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    870
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 870
    Par défaut
    Bonjour joe.levrai

    Je n'ai pas trouvé de solution pour accéder au répertoire des dossiers publics et users.

    Je suis tombé par hasard, sur cette discussion

    http://www.developpez.net/forums/d52...s-repertoires/

    Le code de ouskel'n'or convient bien à ma procédure.

    Sauf que je rencontre le petit problème suivant : avec le chemin "C:\Users\TITI\" ou C:\Users\Public\" ça bug.

    C'est certainement lié aux autorisations d'accès ?

    Comment faire pour contourner cette restriction ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Navré, mais je n'en sais rien

    J'ai été en mesure de proposer une piste qui, dans mes différents tests, fonctionne très bien. Là tu soulèves des cas d'exceptions qui m'échappent totalement. Il faut savoir se retirer quand on risque de dire des sottises.

    Un autre contributeur pourra peut-être apporter de l'eau au moulin.

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/02/2011, 13h15
  2. Compter le nombre de caractères d’un fichier txt importé par LoadVars
    Par boz_j dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 28/08/2009, 23h11
  3. Compter le nombre de fichier dans un dossier
    Par tibo894 dans le forum Langage
    Réponses: 5
    Dernier message: 08/05/2009, 14h15
  4. [SQL] Compter le nombre de dossiers, pas le nombre d'enregistrements
    Par lodan dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 11/01/2007, 20h42
  5. Réponses: 2
    Dernier message: 07/11/2005, 00h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo