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 :

recherche un fichier dans des sous répertoire et recopier son contenu


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 14
    Points
    14
    Par défaut recherche un fichier dans des sous répertoire et recopier son contenu
    bonjour je souhaiterai réaliser le programme suivant à partir d'un fichier excel "1":

    - chercher un fichier excel "2" qui se situe dans des sous-répertoires (sans indiquer le chemin exact, mais seulement en indiquant le répertoire racine à partir duquel chercher dans les sous répertoire le nom du fichier excel "2")
    - lire et recopier le contenu de excel "2" dans le fichier excel "1"

    Je vois qu'il y a plusieurs possibilités:
    Application.FileSearch
    Scripting.FileSystemObject

    Mais je ne sais pas trop comment les utiliser...

  2. #2
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Fait une recherche sur "recherche fichier récursive"

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 14
    Points
    14
    Par défaut
    merci des info
    j'ai créé ce code

    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
     
    Sub Search_File_In_subfolders(FileName As String)
     
    Dim chemin, répertoire, fichier, rep As String
    Dim MyFolder As Object
    Dim MySubFolder As Object
     
     
    'Adresse de ThisWorkBook
    chemin = ThisWorkbook.Path
     
    'déclare l'objet FSO (gestion des dossiers et fichiers)
    Set FS = CreateObject("Scripting.FileSystemObject")
     
    'Déclare la méthode GetFolder de l'objet FSO
    Set MyFolder = FS.GetFolder(chemin)
     
    'Boucle pour parcourir chaque sous-répertoire
    For Each MySubFolder In MyFolder.SubFolders
        répertoire = chemin & "\" & MySubFolder.Name
     
            'rep = répertoire & "\" & "*" & FileName & "*" & ".xls"
            rep = répertoire & "\" & FileName & ".xls"
     
     
            If FS.FileExists(rep) Then
                MsgBox "Existe"
            Else
                MsgBox "existe pas"
     
            End If
     
    Next
     
     
    End Sub
    Cela permet de parcourir les différents sous-repertoires et de vérifier l'existance d'un fichier. En revanche, comment faire pour chercher un fichier avec une recherche partielle? du type :
    'rep = répertoire & "\" & "*" & FileName & "*" & ".xls"
    Le problème est que VBA rajoute les * au nom du fichier.

  4. #4
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    J'ai plusieurs observations.
    1. Pour pouvoir utiliser le résultat dans d'autres procédures, il vaut mieux créer une fonctions
    2. FileExists n'est pas adapté parce qu'il n'accepte pas les jokers du genre «*.xls»
    3. Ta procédure n'étant pas récursive, elle ne trouvera que les fichiers qui se trouvent dans les répertoires du répertoire que tu as indiqué, mais pas dans les sous-répertoires.

    Est-ce vraiment ce que tu veux ?
    Si c'est le cas, il suffit de coder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If Dir(répertoire & "\" & FileName) <> "" Then
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            If FS.FileExists(rep) Then
    Les jokers sont acceptés et ton problème est résolu.
    Si tu veux que la recherche s'effectue dans les sous, les sous-sous et les sous-sous-répertoires, il faudra utiliser une fonction récursive.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 14
    Points
    14
    Par défaut
    merci defluc, c'est bien cela que je veux faire avec la fonction récursive.

    J'ai trouve cela :
    http://warin.developpez.com/access/fichiers/

    avec le code suivant :
    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
    Option Explicit
    Sub Explorer(p_strFichier As String, p_strCheminDepart As String, Optional p_oFld As Scripting.Folder)
        'On Error GoTo err
     
        Dim oFSO As Scripting.FileSystemObject
        Dim oFld As Scripting.Folder
        Dim oFl As File
        If p_oFld Is Nothing Then
            'Instanciation du FSO (déclare l'objet FSO (gestion des dossiers et fichiers))
            Set oFSO = New Scripting.FileSystemObject
            'Accède au répertoire du départ de recherche
            Set p_oFld = oFSO.GetFolder(p_strCheminDepart)
        End If
     
        Set oFl = p_oFld.Files(p_strFichier)
        MsgBox oFl.Path
     
    SubDir:
        'Explore les sous-dossiers
        For Each oFld In p_oFld.SubFolders
            Explorer p_strFichier, p_strCheminDepart, oFld
            DoEvents
        Next oFld
     
    fin:
        Exit Sub
    err:
        Select Case err.Number
            Case 53: Resume SubDir
            Case Else:
                MsgBox "Erreur inconnue"
                Resume fin
        End Select
     
    End Sub
    problème, quand j'execute la macro j'ai un "type défini par l'utilisateur non définir" sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub Explorer(p_strFichier As String, p_strCheminDepart As String, Optional p_oFld As Scripting.Folder)

  6. #6
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    bonsoir,

    à relire : I-A. Introduction

    N'oubliez pas d'ajouter la référence Microsoft Scripting Runtime à votre projet sans quoi une erreur sera levée.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 14
    Points
    14
    Par défaut
    exact, je viens de voir cela à l'instant

    Le code répond bien à mon besoin, part contre je sais pas comment le modifier pour faire une recherche partielle :

    *nom partiel du fichier*

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 14
    Points
    14
    Par défaut
    voici la fonction :

    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
    Function Explorer(p_strFichier As String, p_strCheminDepart As String, Optional p_oFld As Scripting.Folder) As String
        On Error GoTo err
        
        Dim oFSO As Scripting.FileSystemObject
        Dim oFld As Scripting.Folder
        Dim oFl As File
        Dim rep As String
        If p_oFld Is Nothing Then
            'Instanciation du FSO (déclare l'objet FSO (gestion des dossiers et fichiers))
            Set oFSO = New Scripting.FileSystemObject
            'Accède au répertoire du départ de recherche
            Set p_oFld = oFSO.GetFolder(p_strCheminDepart)
        End If
        
        Set oFl = p_oFld.Files(p_strFichier)
        MsgBox oFl.Path
        Explorer = oFl.Path
        
    SubDir:
        'Explore les sous-dossiers
        For Each oFld In p_oFld.SubFolders
            Explorer p_strFichier, p_strCheminDepart, oFld
            DoEvents
        Next oFld
        
    fin:
        Exit Function
    err:
        Select Case err.Number
            Case 53: Resume SubDir
            Case Else:
                MsgBox "Erreur inconnue"
                Resume fin
        End Select
    
    End Function
    afin terminer ma programmation , il me reste 2 problèmes à résoudre:
    - le retour de la valeur de la fonction (chemin ou se trouve le fichier) ne fonctionne pas (voir ci dessus en gras). La fonction est appelée de la manière suivante:
    Chemin = Explorer(FileName & ".xls", racine)
    Une fois la fonction terminée, chemin est vide (renvoit : "")
    - Est'il possible de faire une recherche partielle? (chercher un fichier qui contient l'expression que je donne).

    @+

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 14
    Points
    14
    Par défaut
    Pour le 1er problème, cela semble venir de Exit function quand je lance la fonction en pas à pas, le explorer=ofl.path est bien enregistré, par contre explorer se vide une fois la ligne exit function exécutée.

Discussions similaires

  1. VBA Recherche de Fichier dans des sous répertoires
    Par GuiJenn34 dans le forum Général VBA
    Réponses: 12
    Dernier message: 09/06/2015, 14h14
  2. recherche de fichier dans des sous repertoires
    Par Abou Zar dans le forum Langage
    Réponses: 2
    Dernier message: 11/01/2010, 09h48
  3. compte de fichiers contenus dans des sous répertoires
    Par Jasmine80 dans le forum Langage
    Réponses: 4
    Dernier message: 27/02/2008, 08h58
  4. Suppression de fichiers dans des sous-répertoires
    Par astrolane dans le forum Langage
    Réponses: 2
    Dernier message: 07/09/2007, 15h22
  5. Recherche de fichiers dans des sous répertoires
    Par Mimi Bulles dans le forum Langage
    Réponses: 8
    Dernier message: 25/04/2006, 16h41

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