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 :

Problème boucle fichier et dir


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut Problème boucle fichier et dir
    Bonjour,
    Je souhaite boucler sur tous les fichiers zip d'un dossier pour les dézipper vers un ensemble de dossiers mais je bloque sur Le fichier redevient toujours le premier fichier du dossier source!!!

    Le 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    MyPath = "C:\Users\ZZZ\Desktop\YYY\TRANSPORTS\ZIP\"
     
     
    fic = Dir(MyPath & "*.zip")
     
     
     
    Dossier = MyPath
     
     
     
    Do Until MyPath & fic = ""
     
     
     
     
    For Z = 1 To UBound(Tablo)
     
     
     
    If InStr(1, fic, Tablo(Z)) <> 0 Then
     
     
     
    DossierDestination = "C:\Users\ZZZ\Desktop\YYY\TRANSPORTS\PJ\" & NOM(Z)
     
     
    FichierArchive = fic
     
     
     
    'Décompression
            Set ApplicationArchivage = CreateObject("Shell.Application")
            ApplicationArchivage.Namespace(DossierDestination & "\").CopyHere ApplicationArchivage.Namespace(MyPath & fic).Items
            Set ApplicationArchivage = Nothing
    Exit For
     
    End If
     
     
    Next Z
     
     
     
    fic = Dir(MyPath)
     
    Loop
    Comment dois-je procéder pour passer au .zip suivant?


    MERCI BEAUCOUP POUR TOUT COUP DE MAIN

  2. #2
    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,

    Comme tu test les valeurs concaténées de MyPath & fic, et que la valeur de MyPath ne change jamais, le test est toujours vrai (boucle infinie).

    De plus, par respect du SRP (https://en.wikipedia.org/wiki/Single...lity_principle), divise ta fonction en 2:
    Une s'occupant de collecter les chemins des fichiers.
    L'autre s'occupant de dézipper.

    Egalement, je ne fait pas trop confiance à la fonction DIR, cette dernière ne supporte pas bien la récursivité, je préfère passer par FSO, qui en plus est plus parlant:
    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
    Public Sub UnzipFiles()
        Const Source As String = "C:\Users\ZZZ\Desktop\YYY\TRANSPORTS\ZIP\"
        Const Destination As String = "C:\Users\ZZZ\Desktop\YYY\TRANSPORTS\PJ\"
     
        Dim Fso As Scripting.FileSystemObject
        Set Fso = CreateObject("Scripting.FileSystemObject")
     
        Dim SourceFolder As Scripting.Folder
        Set SourceFolder = Fso.GetFolder(Source)
     
            '// Collecte des fichiers
        Dim Files As Collection
        Set Files = GetZipFiles(SourceFolder)
     
            '// Decompression
        Dim File As String
        For Each File In Files
            Dim DestinationFolder As Scripting.Folder
            Set DestinationFolder = Fso.GetFolder(Destination)
     
            Unzip File, Destination
        Next
    End Sub
     
    Public Function GetZipFiles(ByRef Folder As Scripting.Folder) As Collection
        Dim Fso As Scripting.FileSystemObject
        Set Fso = CreateObject("Scripting.FileSystemObject")
     
        Dim Files As Collection
        Set Files = New Collection
     
        Dim File As Scripting.File
        For Each File In Folder.Files
            If (Fso.GetExtensionName(File.Name) = "zip") Then
                Files.Add File
            End If
        Next
        Set GetZipFiles = Files
    End Function
     
    Public Sub Unzip(ByRef File As Scripting.File, ByVal Destination As Scripting.Folder)
        Dim ApplicationArchivage As Object
        Set ApplicationArchivage = CreateObject("Shell.Application")
        ApplicationArchivage.Namespace(Destination.Path).CopyHere ApplicationArchivage.Namespace(File.Path).Items
    End Sub
    PS: Pas compris ce que Tablo(Z) et NOM(Z) viennent faire la dedans.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Merci, ils donnent les valeurs à tester, ça vient de plus haut dans le code et n'impacte pas la question

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Je précise:

    - Les fichiers zip sont nommés par exemple: XXX32.zip...;
    - Ces noms se trouvent dans les cellules d'une colonne du fichier Excel;
    - Dans une colonne à droite, se trouvent les noms prénoms des personne;
    - Les fichiers XXX32.zip...doivent être décompressés dans les dossiers C\:....\NOM Prénom\... (possibilité de devoir les créer)


    D'où NOM(Z), j'ai d'abord alimenté une variable tableau avec tout mes noms prénoms et je comptais repartir de ce tableau, avec une boucle for next pour trouver à chaque couple (nom de fichier zip; valeur de ma colonne A) le nom de dossier correspondant (le créer le cas échéant) et décompresser....

    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
     
    Dim Tablo() As String, NOM() As String
     
    Set wbk = Workbooks("transport.xlsm")
    Set wbsht = wbk.Sheets(Sheets.Count - 1)
     
    Set derlig = wbsht.Range("A500000").End(xlUp)
     
    derlig = derlig.Row
     
    KMPTR = 0
     
    For i = 2 To derlig
     
    KMPTR = KMPTR + 1
     
    ReDim Preserve Tablo(KMPTR)
    ReDim Preserve NOM(KMPTR)
     
     
    Tablo(KMPTR) = wbsht.Range("A" & i)
    NOM(KMPTR) = wbsht.Range("C" & i) & " " & wbsht.Range("D" & i)
     
     
     
    Next i
     
     
    MyPath = "C:\Users\ZZZ\Desktop\YYY\TRANSPORTS\ZIP\"
     
     
     
    fic = Dir(MyPath & "*.zip")
     
     
     
    Dossier = MyPath
     
     
    Do Until MyPath & fic = ""
     
     
     
     
    For Z = 1 To UBound(Tablo)
     
     
    If InStr(1, fic, Tablo(Z)) <> 0 Then
     
     
     
    DossierDestination = "C:\Users\ZZZ\Desktop\YYY\TRANSPORTS\PJ\" & NOM(Z) 'le dossier dans lequel les fichiers seront décompressés"
     
     
     
    FichierArchive = fic
     
     
    If Dir(DossierDestination, 16) = "" Then MkDir DossierDestination
     
    'Décompression
            Set ApplicationArchivage = CreateObject("Shell.Application")
            ApplicationArchivage.Namespace(DossierDestination & "\").CopyHere ApplicationArchivage.Namespace(MyPath & fic).Items
            Set ApplicationArchivage = Nothing
    Exit For
     
    End If
     
     
    Next Z
     
     
    fic = Dir(MyPath)
     
    Loop

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    J'ai poursuivi dans ton sens et arrive à une erreur sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unzip File, Destination
    :

    Erreur 424 objet requis??

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Corrigé:

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

Discussions similaires

  1. [DOS] Récupérer un nom de fichier depuis DIR
    Par palcoquoz dans le forum Scripts/Batch
    Réponses: 9
    Dernier message: 19/05/2017, 21h20
  2. [XL-2003] Boucles (fichier exemple)
    Par Nonno 94 dans le forum Excel
    Réponses: 2
    Dernier message: 12/09/2012, 21h48
  3. [AC-2007] Ordre de restitution des fichiers du DIR VBA
    Par lbrun79 dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/02/2012, 08h47
  4. imprimer en boucle fichier excel
    Par digger dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/12/2005, 16h38

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