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 :

parcourir les fichiers d'un dossier


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Points : 43
    Points
    43
    Par défaut parcourir les fichiers d'un dossier
    Bonjour à tous,


    J'ai écris un code qui parcours les fichiers d'un dossier afin d'en trouver un spécifique.

    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
     
    Public CA As String 'déclare la variable CA (Chemin d'Accès)
     
    Sub recherche_fichier_MH()
     
    CA = "\\192.168.1.5\Fichiers communs\INFORMATIQUE\Stat pour macro\PASSEPORT\Archives\" 'Definit l'emplacement du dossier CA
    Dim FSO As Scripting.FileSystemObject
    Dim SourceFolder As Scripting.Folder
    Dim SubFolder As Scripting.Folder
    Dim FileItem As Scripting.File
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = FSO.GetFolder(CA)
     
    For Each FileItem In SourceFolder.Files
     
    'Mon code
     
    Next
    End sub
    le dossier contient plusieur millier de fichier, mais le code n'en parcours qu'une centaine, je ne comprend pas pourquoi.

    Une idée?

    merci

  2. #2
    Invité
    Invité(e)

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Merci pour les liens.
    J'ai beau chercher je ne trouve pas mon erreur.
    Ma macro fonctionne mais ne parcours pas tout les fichiers du dossier.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Novembre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2018
    Messages : 15
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par chevrotine56 Voir le message
    Merci pour les liens.
    J'ai beau chercher je ne trouve pas mon erreur.
    Ma macro fonctionne mais ne parcours pas tout les fichiers du dossier.
    Bonjour Chevrotine56,
    Peut-être pourrais-tu mettre l'intégralité de ton code pour que les gens puissent le lire et détecter d'éventuelles anomalies/erreurs ?
    Je vois uniquement un commentaire avec marqué "Mon code"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For Each FileItem In SourceFolder.Files
     
    'Mon code
     
    Next
    Bien à toi.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 117
    Points : 1 640
    Points
    1 640
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public CA As String 'déclare la variable CA (Chemin d'Accès)
    A moins que tu aies une justification solide, déclare cette variable en local (les globales, c'est le mal).

    Je voit que tu as une variable Subfolder,
    dois-tu également parcourir les sous-dossiers ?
    Dans ce cas, pense à la récursivité.

  6. #6
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Le Subfolder c'est en prévision d'évolution du système, quand j'aurais trop de data ca sera trié avec des sous dossiers.
    Les variable sont en local car elles sont appelés dans plusieurs autre macro.


    Voici le code au complet.



    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    Public BDD As FileDialog 'déclare la variable BDD (Boîte de Dialogue Dossier)
    Public CA As String 'déclare la variable CA (Chemin d'Accès)
    Public CD As Workbook 'déclare la variable CD (Classeur Destination)
    Public OD As Worksheet 'déclare la variable OD (Onglet Destination)
    Public FS_SORTIE As String 'décalre la variable FS (Fichier Source)
    Public FS_ENTRANT As String 'décalre la variable FS (Fichier Source)
    Public CS_SORTIE As Workbook 'déclare la variable CS (Classeur Source)
    Public OS_SORTIE As Worksheet 'déclare la variable OS (Onglet Source
    Public MH_SORTIE As String
    Public CS_ENTRANT As Workbook 'déclare la variable CS (Classeur Source)
    Public OS_ENTRANT As Worksheet 'déclare la variable OS (Onglet Source)
    Public MH_ENTRANT As String
    Public DEST As Range 'déclare la variable DEST (celllue de DESTination)
    Public Derligne As Long
    Public Num_ope_entrant As Long
    Public Num_ope_sortie As Long
    Public LigneA As Long
    Public LigneB As Long
    Public Rng As Range
    Public colonne_cours As Long
    Public nbre_lignes_max_colonne_cours As Long
    Public nbre_lignes_max_mh_entrant As Long
    Public nbre_lignes_max_mh_sortant As Long
    Public cle_cours As Variant
     
     
    Option Explicit
     
    Sub Extract_données()
     
    1    Dim nb_caract As Long
    2    Dim pos_anti As Long
    3    Dim Fichier_dest As String
     
    4    Application.Calculation = xlManual 'calcul en mode manuel
    5    Application.ScreenUpdating = False  'ne pas mettre a jour l'ecran
     
    6    Call Effacer_les_données
    7    '*******************************************************************************************
    8    '*******************************************************************************************
    9    ' Partie recherche de données
     
    10    CA = "\\192.168.1.5\Fichiers communs\INFORMATIQUE\Stat pour macro\PASSEPORT\Archives\" 'Definit l'emplacement du dossier CA
     
    11    Set CD = ThisWorkbook 'définit la classeur destination CD
    12    Set OD = CD.Sheets("INTERFACE") 'définit l'onglet destination OD (à adapter à ton cas, ici j'ai mis le premier onglet)
     
    13    MH_SORTIE = Sheets("INTERFACE").Cells(8, 2).Value 'Definit la variable MH_SORTIE égale a la cellule A3 de la feuille interface
    14    MH_ENTRANT = Sheets("INTERFACE").Cells(8, 6).Value 'Definit la variable MH_ENTRANT égale a la cellule D3 de la feuille interface
     
    15    '*******************************************************************************************
    16    '*******************************************************************************************
    17    ' Partie recherche de données MH SORTIE
    18    ' Definit le Nom de la serie _ le premier numero de serie et le derniere numero de serie
    19    '*******************************************************************************************
    20    compteA = InStr(MH_SORTIE, " ")
    21    compteB = Len(MH_SORTIE)
    22    compteC = InStr(MH_SORTIE, "-")
    23    compteD = compteC - compteA - 2
    24    compteE = compteB - compteC
     
    25    type_MH_sortant = Left(MH_SORTIE, compteA - 1)
     
    26    Num_Ser_sort_prem = Mid(MH_SORTIE, compteA + 1, compteD)
    27    Num_Ser_sort_der = Mid(MH_SORTIE, compteC + 2, compteE)
     
    28    '*******************************************************************************************
    29    'Recherche dans le dossier le MH SORTIE
    30    '*******************************************************************************************
     
    31    Dim FSO As Scripting.FileSystemObject
    32    Dim SourceFolder As Scripting.Folder
    33    Dim SubFolder As Scripting.Folder
    34    Dim FileItem As Scripting.File
     
    35    Set FSO = CreateObject("Scripting.FileSystemObject")
    36    Set SourceFolder = FSO.GetFolder(CA)
     
    37    For Each FileItem In SourceFolder.Files
    38       'FileItem.Name 'pour recup le nom de fichier
    39       FS_SORTIE = FileItem
    40       nb_caract = Len(FS_SORTIE)
    41       pos_anti = InStrRev(FS_SORTIE, "\")
    42       Fichier_dest = Right(FS_SORTIE, nb_caract - pos_anti - 11)
    Debug.Print Fichier_dest
     
    43       For Num_serie = Num_Ser_sort_prem To Num_Ser_sort_der
    44          If Fichier_dest = type_MH_sortant & " " & Num_serie & ".xlsx" Then
     
    45             Workbooks.Open FS_SORTIE 'ouvre le fichier source FS
    46             Set CS_SORTIE = ActiveWorkbook 'définit le classeur source CS
    47             Set OS_SORTIE = CS_SORTIE.Worksheets(1) 'définit l'onglet source OS (à adapter à ton cas, ici j'ai j'ai mis le premier onglet)
     
    48             '*******************************************************************************************
    49             '*******************************************************************************************
    50             ' Partie copier / Coller MH SORTIE
    51             '*******************************************************************************************
    52             '*******************************************************************************************
     
    53             Derligne = Cells(Rows.Count, 1).End(xlUp).Row 'cherche la derniere ligne du tableau
    54             For LigneA = Derligne To 1 Step -1 'boucle de la derniere ligne a 1
    55                If Not IsNumeric(Cells(LigneA, 1)) = True Or IsEmpty(Cells(LigneA, 1)) Then 'si la cellule n'est pas une valeur numerique ou si elle est vide
    56                   Rows(LigneA).Delete 'supprimer la ligne
    57                End If 'fin de condition
    58             Next LigneA 'ligne suivante
     
    59             Derligne = Cells(Rows.Count, 1).End(xlUp).Row 'cherche la derniere ligne du tableau
    60             OS_SORTIE.Range(Cells(1, 1), Cells(Derligne, 5)).Copy 'Copie le tableau
    61             Workbooks("Listing vide de ligne.xlsm").Activate 'selectionne le classeur de desination
    62             Worksheets(5).Activate 'selectionne l'onglet de destination
    63             ActiveSheet.Name = "MH SORTANT " & MH_SORTIE 'renome l'onglet de destination
    64             LigneB = Cells(Rows.Count, 1).End(xlUp).Row 'Affect le numero de la derniere ligne a la variable LigneB
    65             Cells(LigneB, 1).Offset(1, 0).Select 'Selectionne la ligne en dessous de la derniere
    66             ActiveSheet.Paste 'colle les données
     
    67             Application.CutCopyMode = False 'Désactive le presse papier
    68             CS_SORTIE.Close False 'ferme le claseur source CS (sans enregistrer)
    69             'FS_SORTIE = Dir 'définit le prochain fichier source excel du dossier ayant CA comme chemin d'accès
    70             'Loop 'boucle
     
    71             Derligne = Cells(Rows.Count, 1).End(xlUp).Row 'cherche la derniere ligne du tableau
    72             ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 3), Header:=xlYes 'supprime les doublons
    73             Cells(1, 1).Select
     
    74          End If
    75       Next
    76    Next
     
    End Sub

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 117
    Points : 1 640
    Points
    1 640
    Par défaut
    Ouch !!!

    Que de variables globales , je doute que tu en aies besoin d'autant.
    Je pense qu'il va falloir revoir ta conception.

    Citation Envoyé par chevrotine56 Voir le message
    Les variable sont en local car elles sont appelés dans plusieurs autre macro.
    Malheureusement, ce n'est pas une excuse valable.
    Les paramètres, ca sert à quelque chose, fais en bon usage.

    Comprend bien que la raison d'être d'une variable globale ne doit pas être "par confort".
    Une variable globale peut être altérée par n'importe quelle fonctionnalité, n'importe quand, sans aucun contrôle ni aucune restriction, sauf la discipline du développeur ce qui est questionnable et source majeur d'erreurs particulièrement difficile à déboguer.
    Donc moins on en as, mieux on se porte.

    Egalement, ta fonction est trop longue et mérite d'être divisée en plusieurs sous-fonctions, ce sera plus facile à maintenir.
    En clair elle viole le SRP (https://en.wikipedia.org/wiki/Single...lity_principle)
    et la Loi de Demeter (https://en.wikipedia.org/wiki/Law_of_Demeter).

  8. #8
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 357
    Points : 637
    Points
    637
    Par défaut
    Salut,
    Attention quand tu compares des noms de fichiers, dans la fenêtre d'exécution renseigne ceci ?"Test 1" = "test 1" et valide par [Entrer] et le résultat est Faux...

    Fait un test rapide en collant un Option Compare Text en tête de module si cela résous ton souci alors tu doit réécrire ta comparaison avec strComp par exemple.
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Je pend note de vos remarques.

    Que de variables globales , je doute que tu en aies besoin d'autant.
    Je pense qu'il va falloir revoir ta conception.
    Je comprend, je re travaillerais cette partie plus tard. Pour le moment mon fichier dois compiler de la données et je n'ai pas de problème de variables croisé.


    Salut,
    Attention quand tu compares des noms de fichiers, dans la fenêtre d'exécution renseigne ceci ?"Test 1" = "test 1" et valide par [Entrer] et le résultat est Faux...

    Fait un test rapide en collant un Option Compare Text en tête de module si cela résous ton souci alors tu doit réécrire ta comparaison avec strComp par exemple.
    je n'ai pas d'erreur lié au format du texte, les fichiers comparés sont généré automatiquement par mon ERP; le format ne peut pas changer.

    Ce que je ne comprend pas, c'est que le code fonctionne sur le principe, car il parcours mes fichiers et fait ce que je veux.
    Mais sur les 1200 fichiers contenue dans le dossier, il n'en parcours que 200 par petites série qui ne suivent pas dans le dossier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcourir les fichiers d'un dossier
    Par sergi12 dans le forum Qt
    Réponses: 1
    Dernier message: 05/02/2017, 08h26
  2. [Débutant] Parcourir les fichier d'un dossier.
    Par Jazz_ dans le forum C#
    Réponses: 5
    Dernier message: 11/01/2012, 13h48
  3. Réponses: 3
    Dernier message: 15/04/2011, 12h55
  4. parcourir les fichiers d'un dossier, fichier par fichier
    Par gregcat dans le forum Windows Forms
    Réponses: 9
    Dernier message: 18/04/2008, 15h40
  5. Ouvrir un dossier et parcourir les fichiers
    Par anthony44j dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 30/04/2007, 11h36

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