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 :

Ouvrir dans plusieurs sous répertoires des fichiers excel dont le nom commence par la même chaine de caractère [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Ouvrir dans plusieurs sous répertoires des fichiers excel dont le nom commence par la même chaine de caractère
    Bonjour à tous

    j'aimerais grâce au code ci-dessous :

    1-parcourir un répertoire
    2-ouvrir les sous répertoires un par un
    3-ouvrir à chaque fois le fichier dont le nom commence par une chaîne de caractères donnée
    4-faire un copier coller suivant certaines conditions

    J'ai pour l'instant réussi à coder les étapes 1, 2 et 4. Reste la 3 : j'ai pu faire toute ma manip sur un fichier en particuler, je veux rendre la manipulation plus générale. Pourriez-vous me donner un coup de main s'il vous plait ?

    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
    Sub AllFolders(TheFolder As String)
     '***chercher dans les sous dossiers d'un répertoire racine***
        'declaration de l'objet file system
        Dim fso As Object, Folder As Object
        Dim Fichier As Object, Fichier1 As Object
        Dim sousRep As Object
     
        Set fso = CreateObject("Scripting.FileSystemObject")
     
        'on charge le Dossier à scanner : on demande au moteur de chercher dans TheFolder => dans le chemin indiqué_
        '_de chercher les sous répertoires dans le répertoire
        Set Folder = fso.GetFolder(TheFolder)
     
       ' on met la liste des fichiers du dossier dans Fichier
        Set Fichier = Folder.Files
     
        For Each Fichier1 In Fichier
          Call b_search
        Next
     
        'traitement récursif des sous dossiers
        For Each sousRep In Folder.subfolders
          'path retourne l'adresse physique en plein texte
          AllFolders sousRep.Path
        Next sousRep
          Set fso = Nothing
    End Sub
    ______________________
     
    Sub a_Parcourir_Repertoire()
      AllFolders "C:\Users\MOKRRAOY\Downloads\"
    End Sub

    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
    Sub b_search(TheFile As String)
    '**** rechercher dans le fichier source la cellule dont la valeur correspond à celle de la cellule D4 du fichier cible****
     
    'Dim fso As Object, Fichier As Object
    Dim periode As String
    Dim celluletrouvee As Range
    Dim wbSource As Workbook
     
    'ouvrir le fichier2 et cibler la cellule periode
     
    Set wbSource = Workbooks.Open("C:\Users\MOKRRAOY\Downloads\GFK_NOTE_JARDIN_Mar15-Apr15.xls")
    periode = wbSource.Worksheets("SYNTHESE").Range("$D$4").Value
     
     
    'revenir vers le fichier1.xlsm
     
    Set celluletrouvee = ThisWorkbook.Sheets("CRF").Range("1:50").Find(periode, lookat:=xlWhole)
     
        If celluletrouvee Is Nothing Then
            MsgBox ("période indisponible")
            wbSource.Close SaveChanges:=False
        Else
     
            Call c_copie(periode, celluletrouvee)
        End If
     
    End Sub
    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
    Sub c_copie(periode As String, celluletrouvee As Range)
    '***Copie des données du fichier cible dans le fichier de base***
        '***attention ceci n'est pas un copier coller***
     
    Dim wbSource As Workbook
    Dim i, j As Integer
    Dim offseti, offsetj As Integer
     
    offseti = celluletrouvee.Row
    offsetj = celluletrouvee.Column
     
    Set wbSource = ActiveWorkbook
     
    If wbSource.Worksheets("SYNTHESE").Range("D04").Value = periode Then
        For i = 8 To 15 Step 1
            For j = 2 To 5 Step 1
              ThisWorkbook.Sheets("CRF").Cells(offseti + 2, offsetj).Value = wbSource.Worksheets("SYNTHESE").Cells(i, j).Value
              offsetj = offsetj + 1
            Next j
            offsetj = celluletrouvee.Column
            offseti = offseti + 1
        Next i
     
    Else
        MsgBox "yolooo"
     
    End If
     
    wbSource.Close SaveChanges:=False
     
    End Sub

    Merci par avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Bonjour,

    À première vue j'irais ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For Each Fichier1 In Fichier
          If Left(Fichier1,n) = "la chaîne de caractères" Then  'Changer le 'n' pour le bon nombre de caractère
              Call b_search
          End If
        Next

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Bonjour et merci Parmi

    J'ai fait ça du coup

    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
    Sub AllFolders(TheFolder As String)
     '***chercher dans les sous dossiers d'un répertoire racine***
        'declaration de l'objet file system
        Dim fso As Object, Folder As Object
        Dim Fichier As Object, Fichier1 As Object
        Dim sousRep As Object
     
        Set fso = CreateObject("Scripting.FileSystemObject")
     
        Set Folder = fso.GetFolder(TheFolder)
     
       ' on met la liste des fichiers du dossier dans Fichier
        Set Fichier = Folder.Files
     
        For Each Fichier1 In Fichier
          If Left(Fichier1, 16) = "GFK_NOTE_JARDIN_" Then
          Call b_search(Fichier1)
          End If
        Next
     
        'traitement récursif des sous dossiers
        For Each sousRep In Folder.subfolders
          'path retourne l'adresse physique en plein texte
          AllFolders sousRep.Path
        Next sousRep
          Set fso = Nothing
    End Sub
     
    Sub a_Parcourir_Repertoire()
      AllFolders "C:\Users\MOKRRAOY\Downloads\"
    End Sub

    et ça

    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
    Sub b_search(Fichier1 As Object)
    '**** rechercher dans le fichier source la cellule dont la valeur correspond à celle de la cellule D4 du fichier cible****
     
    'Dim fso As Object, Fichier As Object
    Dim periode As String
    Dim celluletrouvee As Range
    Dim wbSource As Workbook
     
    'ouvrir le fichier2 et cibler la cellule periode
     
    Set wbSource = Workbooks.Open(Fichier1)
    periode = wbSource.Worksheets("SYNTHESE").Range("$D$4").Value
     
     
    'revenir vers le fichier1.xlsm
     
    Set celluletrouvee = ThisWorkbook.Sheets("CRF").Range("1:50").Find(periode, lookat:=xlWhole)
     
        If celluletrouvee Is Nothing Then
            MsgBox ("période indisponible")
            wbSource.Close SaveChanges:=False
        Else
     
            Call c_copie(periode, celluletrouvee)
        End If
     
    End Sub
    La Sub c_copie ne change pas

    Résultat : il ne se passe rien. Même pas un message d'erreur.

    Une idée ?

    Encore merci

  4. #4
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 272
    Points
    11 272

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Met des points d'arrêt aux endroits stratégiques et vas-y en pas à pas (F8).
    Tu devrais pouvoir trouver l'erreur ou la partie problématique.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    j'ai fait ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Dim Compter As Integer
        Set fso = CreateObject("Scripting.FileSystemObject")
     
        'on charge le Dossier à scanner : on demande au moteur de chercher dans TheFolder => dans le chemin indiqué_
        '_de chercher les sous répertoires dans le répertoire
        Set Folder = fso.GetFolder(TheFolder)
        Compter = Folder.Files.Count
    Compter = 0 alors que j'ai un sous répertoire dans ma routine

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Si c'est le nombre de sous-répertoires que tu cherches, ce n'est pas Files, mais SubFolders que tu dois mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Compter = Folder.SubFolders.Count

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Points : 22
    Points
    22
    Par défaut c'est bon
    Ca y est mon code fonctionne.

    Fichier1 est un objet, donc fallait ajouter .Name pour ensuite parler de la chaine de caractères

    voici le code en entier pour ceux que ça intéresse

    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
    Sub AllFolders(TheFolder As String)
     '***chercher dans les sous dossiers d'un répertoire racine***
        'declaration de l'objet file system
        Dim Folder As Object, sousRep As Object
        Dim Fichier As Object, Fichier1 As Object
        Dim fso As Object
     
        Set fso = CreateObject("Scripting.FileSystemObject")
     
        'on charge le Dossier à scanner : on demande au moteur de chercher dans TheFolder => dans le chemin indiqué_
        '_de chercher les sous répertoires dans le répertoire
        Set Folder = fso.GetFolder(TheFolder)
        Set sousRep = Folder.SubFolders
     
       ' on met la liste des fichiers du dossier dans Fichier
        Set Fichier = Folder.Files
     
        For Each Fichier1 In Fichier
          If Left(Fichier1.Name, 16) = "GFK_NOTE_JARDIN_" Then
          'If Not Fichier1 Is Nothing Then
            Call b_search(Fichier1)
          'End If
          End If
        Next
     
        'traitement récursif des sous dossiers
        For Each sousRep In Folder.SubFolders
          'path retourne l'adresse physique en plein texte
          AllFolders sousRep.Path
        Next sousRep
          Set fso = Nothing
    End Sub
     
    Sub a_Parcourir_Repertoire()
      AllFolders "C:\Users\MOKRRAOY\Downloads\01-NON ALIMENTAIRE"
    End Sub
     
     
    Sub b_search(Fichier1 As Object)
    '**** rechercher dans le fichier source la cellule dont la valeur correspond à celle de la cellule D4 du fichier cible****
     
    'Dim fso As Object, Fichier As Object
    Dim periode As String
    Dim celluletrouvee As Range
    Dim wbSource As Workbook
     
    'ouvrir le fichier2 et cibler la cellule periode
     
    Set wbSource = Workbooks.Open(Fichier1)
    periode = wbSource.Worksheets("SYNTHESE").Range("$D$4").Value
     
     
    'revenir vers le fichier1.xlsm
     
    Set celluletrouvee = ThisWorkbook.Sheets("CRF").Range("1:50").Find(periode, lookat:=xlWhole)
     
        If celluletrouvee Is Nothing Then
            MsgBox ("période indisponible")
            wbSource.Close SaveChanges:=False
        Else
     
            Call c_copie(periode, celluletrouvee)
        End If
     
    End Sub
     
     
    Sub c_copie(periode As String, celluletrouvee As Range)
    '***Copie des données du fichier cible dans le fichier de base***
        '***attention ceci n'est pas un copier coller***
     
    Dim wbSource As Workbook
    Dim i, j As Integer
    Dim offseti, offsetj As Integer
     
    offseti = celluletrouvee.Row
    offsetj = celluletrouvee.Column
     
    Set wbSource = ActiveWorkbook
     
    If wbSource.Worksheets("SYNTHESE").Range("D04").Value = periode Then
        For i = 8 To 15 Step 1
            For j = 2 To 5 Step 1
              ThisWorkbook.Sheets("CRF").Cells(offseti + 2, offsetj).Value = wbSource.Worksheets("SYNTHESE").Cells(i, j).Value
              offsetj = offsetj + 1
            Next j
            offsetj = celluletrouvee.Column
            offseti = offseti + 1
        Next i
     
    End If
     
    wbSource.Close SaveChanges:=False
     
    End Sub

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/01/2011, 15h58
  2. Réponses: 10
    Dernier message: 05/12/2010, 19h23
  3. Réponses: 2
    Dernier message: 08/10/2010, 11h15
  4. Supprimer des tables dont le nom commence par XXX
    Par Escandil dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 11/04/2006, 21h46
  5. Supprimer des tables dont le nom commence par XXX
    Par Escandil dans le forum PostgreSQL
    Réponses: 11
    Dernier message: 06/09/2005, 17h53

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