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 :

Dir dans une boucle basée sur Dir [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 155
    Par défaut Dir dans une boucle basée sur Dir
    Bonjour,

    J'ai un problème de boucle et je m'arrache les cheveux dessus. Je n'arrive pas à trouver une confirmation de ma supposition ni une solution de contournement. Alors je fais appel à vous.

    J'ai une boucle se basant sur la fonction Dir() : je veux en effet parcourir tous les fichiers d'un répertoire. Au sein de ma boucle, je fais appel à la fonction Dir pour vérifier la présence d'un fichier dans un autre répertoire. Concrètement ça donne ça.

    Je définis d'abord les variables Rep_bis et Rep_projet

    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
     
        Fichier_BIS = Dir(Rep_bis & "BIS_*.spa")
     
        Do While Fichier_BIS <> ""
     
            idpatient = Mid(Fichier_BIS, 5, 7)
     
            Fichier_patient = Rep_projet & "Patient_BIS_" & idpatient & ".xlsx"
     
            If Dir(Fichier_patient) <> "" Then
                Debug.Print "Entrée dans la boucle if"
            Else
                Debug.Print "Pas entrée dans la boucle if"
            End If
            Fichier_BIS = Dir()
        Loop
    J'ai essayé de changer la condition If, sans utiliser la fonction Dir (par exemple j'ai essayé avec If idpatient = "01-0001" etc... Avec cette condition ça marche, je boucle bien sur les fichiers du répertoire. En revanche avec le If Dir(Fichier_patient) <> "" Then, ça ne fonctionne plus, je ne boucle plus sur les fichiers de mon répertoire.

    Je crains de ne pas avoir compris un truc sur le fonctionnement du Dir et que l'imbrication d'un dir dans une boucle sur Dir casse tout.

    Pouvez-vous me confirmer ce point ?

    Si tel est le cas, auriez-vous une idée à me suggérer pour remplacer le Dir dans mon If ?

    J'espère être à peu près clair...

    Merci d'avance pour votre aide

    Bonne fin d'après-midi

  2. #2
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 167
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Oui, Dir s'appellle une première fois en indiquant le dossier dans lequel chercher et le nom du fichier (incomplet si on utilise des * ou ?)
    Puis les appels suivants sans paramètres donneront la réponse suivante, Dir renvoyant une chaine vide s'il n'y a pas de réponse suivante

    La réutilisation d'un Dir avec des paramètres en cours de boucle réinitialise son utilisation avec les nouveaux paramètres et oublie les anciens
    Peut-être que Dir n'est pas la solution la plus adaptée ici (je n'ai pas bien compris ce qui devait être fait), il y a d'autres solutions avec des objets FileSystemObject

    Ou rester avec Dir et stocker les noms trouvés dans un tableau, pour ensuite tous les chercher dans le second dossier

  3. #3
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 167
    Billets dans le blog
    2
    Par défaut
    Re,

    Du genre (TabloPatient stocke les idpatient trouvés et TabloResult stocke au même indice VRAI s'il existe dans le dossier Rep_projet, sinon faux)

    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
    Dim TabloPatient() As String, TabloResult() As Boolean, i As Long
        Fichier_BIS = Dir(Rep_bis & "BIS_*.spa")
        i = 0
        ReDim TabloPatient(1 To 1)
        Do While Fichier_BIS <> ""
            i = i + 1
            ReDim Preserve TabloPatient(1 To i)
            TabloPatient(i) = Mid(Fichier_BIS, 5, 7)
            Fichier_BIS = Dir
        Loop
        ReDim TabloResult(1 To UBound(TabloPatient, 1))
        For i = 1 To UBound(TabloPatient, 1)
            Fichier_patient = Rep_projet & "Patient_BIS_" & TabloPatient(i) & ".xlsx"
            TabloResult(i) = Dir(Fichier_patient) <> ""
        Next i

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Hello,

    Je ne cesse de le répéter, la fonction Dir ne supporte pas les boucles imbriquées ni la récursion.

    La solution est le bibliothèque FSO, qui en apporte plus de lisibilité sur vos intentions.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim Fso As Scripting.FileSystemObject
    Set !fso = New Scripting.FileSystemObject
     
    Dim Folder As Scripting.Folder
    Set Folder = Fso.GetFolder("C:\myFolder")
     
    Dim SubFolder As Scripting.Folder
    For Each SubFolder In Folder.Folders
        Dim File As Scripting.File
        For Each File In SubFolder.Files
            '// instruction quelconque
        Next
    Next
    Et qu'on ne me ressorte pas l'argument de la bibliothèque externe qui peut ne pas être disponible, Fso est livré en standard avec n'importe quel Windows ou Office,
    ni l'argument des performances, l'époque des 486 Dx 33 est terminée depuis 30 ans, les ressources des machines actuelles dépassent largement les besoins de n'importe quelle suite bureautique.

  5. #5
    Membre confirmé
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 155
    Par défaut
    Bonjour,

    Merci beaucoup pour vos réponses détaillées et circonstanciées.

    @deedolith : oups désolé, je n'ai pas cherché correctement alors et ne suis pas tombé sur tes messages indiquant la fonction Dir ne supporte pas les boucles imbriquées ni la récursion. J'espère que tu m'en excuseras.
    OK pour la bibliothèque FSO que je ne connaissais pas et que je vais m'empresser d'aller découvrir.
    Pas d'inquiétude pour les arguments mentionnés, je n'aurais même pas eu l'idée d'y penser.
    Merci pour l'exemple.

    @tototiti2008 : merci pour les explications sur le fonctionnement de Dir().
    Merci pour l'exemple aussi.
    Pour répondre à ta question, je cherche à concaténer des fichiers. Il y a peut-être beaucoup plus simple que l'idée que j'ai eue.
    Pour rentrer un peu dans les détails : dans un répertoire j'ai des résultats de mesures pour des patients. Le nombre de fichiers par patient varie de 1 à ... Les noms des fichiers sont BIS_Num_patient-Initiales_patient_Date_mesure(num_fichier).spa
    Je cherche donc à rassembler toutes les mesures pour un patient dans un fichier unique pour avoir au final qu'un seul fichier par patient ce qui facilitera le traitement ultérieur.
    J'essayais donc
    1. de parcourir les fichiers du répertoire stockant les fichiers de mesures
    2. si le fichier de synthèse du patient en cours existe alors je copie les données du fichier de résultat en cours à la fin du fichier de synthèse (le fichier de synthèse est déjà ouvert)
    3. sinon si un fichier de synthèse est ouvert, je le ferme et je crée un nouveau fichier de synthèse pour un nouveau patient et je copie les données du fichier de résultat en cours dans le fichier de synthèse

    Je vais essayer avec les solutions proposées mais si vous pensez que ma solution n'est pas la bonne et qu'il en existe une plus simple, je suis preneur.

    Merci pour votre aide.

    Bonne journée

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 702
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Et qu'on ne me ressorte pas l'argument de la bibliothèque externe qui peut ne pas être disponible, Fso est livré en standard avec n'importe quel Windows ou Office,
    ni l'argument des performances, l'époque des 486 Dx 33 est terminée depuis 30 ans, les ressources des machines actuelles dépassent largement les besoins de n'importe quelle suite bureautique.
    Bonjour,

    Dir reste intéressant sur le plan des performances lorsque l'on doit gérer des dossiers et fichiers nombreux sur un lien réseau (et là, un bon processeur ou SSD sur le PC exécutant le VBA ne peut rien faire).
    C'est le constat que j'ai pu faire dans mon entreprise.

    Donc Fso a du sens si pas de problème de perf. Sinon il reste possible de contourner le problème des Dir imbriqués via l'utilisation d'une sous-procédure encapsulant le second Dir.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Citation Envoyé par Promethee25 Voir le message
    Dir reste intéressant sur le plan des performances lorsque l'on doit gérer des dossiers et fichiers nombreux sur un lien réseau (et là, un bon processeur ou SSD sur le PC exécutant le VBA ne peut rien faire).
    C'est le constat que j'ai pu faire dans mon entreprise.

    Donc Fso a du sens si pas de problème de perf.
    Sans benchmark, permet moi d'en douter.

  8. #8
    Membre confirmé
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 155
    Par défaut
    Bonjour,

    J'ai enfin pu reprendre ma macro de la semaine dernière.

    Grâce à votre aide, ça marche !

    J'ai adopté la solution FSO. Nickel. Je ne connaissais pas, ça m'a permis de découvrir quelque chose. Merci !

    Bonne fin d'après-midi à toutes et tous
    Laurent

  9. #9
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 167
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Pour le parcours des fichiers à traiter ça semble donc bon, si j'ai compris
    Je ne sais pas ce qu'est un fichier .spa, s'il s'agit d'un fichier texte il faudra probablement lire le fichier texte pour ajouter les données au fichier de synthèse

    On peut essayer d'ouvrir le fichier texte avec Excel pour faire un copier/coller à la suite du fichier de synthèse, mais attention aux paramètres d'ouverture du fichier texte dans Excel qui procède généralement à des conversions, voir si ça n'altère pas les données

    Sinon on peut ouvrir le fichier texte en VBA (des exemples ici : https://www.developpez.net/forums/d2...fichier-texte/)

  10. #10
    Membre confirmé
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 155
    Par défaut
    Merci pour ta réponse.

    J'ai effectivement oublié de mentionner que le fichier spa est un fichier texte. Pas de problème pour son ouverture. Ca marche.

    Mon problème était vraiment l'imbrication de la fonction Dir().

    J'ai décrit ce que je voulais faire au cas où mon idée ne soit pas la bonne et que vous ayez des suggestions à me faire.

    J'espère avoir le temps de faire ça cette après-midi ou en début de semaine prochaine. Je fermerai la discussion quand ça sera ok.

    Bonne journée

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/10/2011, 09h13
  2. Réponses: 4
    Dernier message: 28/03/2011, 13h46
  3. comment mettre un tableau dans une boucle et sur la meme page
    Par pikkolina dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 24/05/2009, 19h21
  4. Réponses: 3
    Dernier message: 29/08/2007, 17h17
  5. pb critère sql dans une requete basée sur controle d'un form
    Par STANDBOY dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 27/02/2006, 16h17

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