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 :

Collection de fichiers


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 93
    Par défaut Collection de fichiers
    Bonjour Forum,

    Comment ca va?

    J'aimerais faire une collection de fichiers.

    Voila la demarche que je dois faire:
    dans un repertoire A j'ai plusieurs repertoires AAs.
    Dans un repertoire AA j'ai encores des sous repertoires AAAs.
    Et dans un repertoire AAA j'ai un fichier XLS (et plusieurs autres fichiers).

    J'aimerais donc pouvoir recuperer tous les fichiers excels dans les repertoires AAA. la condition est que le repertoire AAA doit avoir un nom commencant par MR.

    J'ai bien fait un code qui marche mais j'enchaine les boucles, ce qui est relativement long vu la quantite de repertoire que je dois traiter (depasse les 5 min) .

    Je me demandais si il n'existait pas des methodes deja prevu par VBA.

    Je sais qu'il existe searchscope et tout ce genre de methodes. mais outre le fait que je n'ai pas tres bien saisi comment cela fonctionnait, je ne peux pas les utiliser car application.searchfile n'existe plus dans Excel 2007.

    Voici mon code, si jamais vous voyez comment l'ameliorer, n'hesiter surtout pas

    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
     
     
    For Each folderAA In repertoireA.subfolders
     
     
        If (folderAA.Name > dateJour) Then
     
            For Each folderAAA In folder.subfolders
     
     
                If folderAAA.Name Like "MR*" Then
     
                    fichier = Dir(folder2.path & "\*.xls")
     
                    If fichier <> "" Then
     
                    test.Add (repertoireS.getfile(folderAAA.path & "\" & fichier))
     
                    End If
                End If
            Next folder2
        End If
    Next folder

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Si tu es prêt à utiliser plutôt les fonctions de l'Api de Windows,

    Ce n'est pas en minutes, que nous compterons, mais en secondes (voire fraction de seconde dans certains cas - dépend du nombre de répertoires présents dans l'arborescence du répertoire de départ de la recherche) pour trouver ton répertoire.

    Plusieurs questions se posent cependant :

    question 1 : quid si plusieurs sous-répertoires commencent par "MR" ?
    Que fais-tu ? Comment sauras-tu qu'ils t'intéressent (qu'il n'y en a pas d'autres pouvant commencer par "MR", contenant des xls et n'ayant rien à voir avec ce que tu recherches ?

    question 2 : (en fonction de la réponse en 1) : t'arrêtes-tu au 1er répertoire trouvé et commençant par "MR" ou continues-tu à chercher ?

    point 3 : chercher sera relativement rapide ainsi mais je ne peux préjuger du temps que nécessitera le reste de ton code

    Je m'y mets ou non en fonction de tes réponses précises à ces 3 points.

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    600 fichiers répartis dans 21 répertoires :
    Pour les classer par ordre alpha et par répertoire, les lister dans une feuille calculs avec hyperlinks, ça donne 12 secondes.
    Combien as-tu de fichiers ? Combien de répertoires ?
    Tu fais une règle de trois.
    Sans Hyperlink, ça "devrait" être sensiblement plus court.

    Edit
    Après test, c'est le classement alpha qui prend du temps, pas le parcours des 16 répertoires.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 93
    Par défaut
    Bonjour tout le monde,

    Bien que de questions, je vais tacher d'y repondre aussi precisement que possible. je m'excuse pour le delai mais j'ai 8h de decalage avec vous.

    Alors mise en situation:

    je dois regrouper les valeurs issues d'analyses chimiques. Pour valider l'analyse on se base sur une reference. L'appareil effectuant l'analyse creer un repertoire AA pour chaque jour d'analyse dans son repertoire A .
    Chaque echantillon a son propre repertoire AAA, donc si 150 echantillons sont analyses, 150 repertoires seront crees.

    Les echantillons references (appeles Materiau de reference MR) qui m'interessent sont tous dans un dossier AAA commencant par MR. La suite du nom varie en fonction de l'analyse effectuee.

    Dans une meme journee je peux avoir plusieurs analyses, donc plusieurs MR:
    ex: MRanalyse1, MRanalyse2.

    J'ai donc besoin de recuperer tous les fichiers excel contenant les resultats de tous les MR (et ce quelque que soit l'analyse). Il n'y a qu'un fichier excel par dossier MR.

    L'appareil analytique ne cree des dossiers MR que pour les materiaux de reference, il ne peut donc pas y avoir de dossiers commencant pas MR qui ne soient pas interessants.
    Pour ce qui est de la rapidite de la suite du code, la voici tu pourras ainsi juger:

    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
     
     
    For i = 1 To excelFile.Count
     
        ' create a new MR
     
        Set newSample = New echantillon
     
        Set wb = Workbooks.Open(excelFile(i))
        Set sh = wb.Worksheets(1)
     
     
        ' set matrix
        If sh.Range("A2") Like "MR*" Then
     
            newSample.matrice = "liquide"
        ElseIf sh.Range("A2") Like "MR*" Then
     
            newSample.matrice = "sol"
        Else
            newSample.matrice = "Probleme"
        End If
     
        ' set analysed date
     
        newSample.DateAnalyse = sh.Range("A3")
     
     
        'set analytes name
        For k = 1 To ThisWorkbook.Worksheets.Count - 1
     
     
            indice = newSample.Taille
     
           newSample.nomAnalyte(indice) = ThisWorkbook.Worksheets(k).name
     
     
        'add value
     
            With sh.Range("C1:C65536")
     
     
                Set analyte = .Find(newSample.nomAnalyte(indice))
     
                If Not analyte Is Nothing Then
                    newSample.Valeur(indice) = analyte.Offset(1, 0).Value
                Else
                    newSample.Valeur(indice) = 9999999
     
                End If
            End With
     
            newSample.modifier
        Next k
        collecSample.Add Item:=newSample  
      Set sh = Nothing
     
      wb.Close
     
      Set wb = Nothing
     
    Next i
    je ne sais pas si le fait d'ouvrir et de fermer des fichier excel comme ca prend du temps, je n'ai pas encore tester cette partie de code. Pour la suite je sais que ca sera rapide. Juste ecrire les resultats dans une feuille excel.

    Voila ucfoutu, j'espere avoir repondu a tes questions. Par contre pour les API j'avoue que je ne suis pas tres familier avec ca, je vais voir ce que je peux trouver la dessus.

    Pour ouskel'n'or, comme je l'ai dit j'ai un repertoire par jour (environ 350). Dans ces repertoires j'ai environ entre 50 et 300 sous repertoires (dependant des activites). Et je dois faire l'annee 2007 mais pour plusieurs machines.

    Je ne sais pas si cela explique le fait que ce soit lent?

    J'espere avoir repondu a toute vos questions et merci pour vos reponses.

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir,

    2 questions, donc :

    1) dans les sous-répertoires de 1er niveau du répertoire A : y-a-il autre chose que des sous-répertoires AA ?

    Si non : c'est bon et ne pas répondre à la 2ème question

    si oui :

    2) les noms des sous-répertoires de 1er niveau AA répondent-ils à une forme précise et laquelle ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 93
    Par défaut
    salut ucfoutu,

    effectivement le repertoire A est le repertoire de l'application gerant l'appareil et il ne contient que des sous repertoires AA. C'est un repertoire nomme DATA. Il n'est la que pour contenir les resultats d'analyse.

    les repertoires AA ont comme nom la date d'analyse yyyy-mm-jj. Ce nom est fixe par l'utilisateur. il a ete etabli dans mon lab que l'on nommerait les sequences d'analyse comme cela vu que l'on lance une sequence par jour.

    Voila j'espere avoir repondu a tes questions.


    merci

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour Ousk

    Essai avec ma vieille bécane : 8 secondes pour près de 350 fichiers et de très nombreux sous-répertoires (dont certains sont donc "sautés") et avec tout inclus (filtre, etc...)

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Salut ucfoutu,
    En VB, ton test, ou en VBA ?
    A+

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Salut ucfoutu,
    En VB, ton test, ou en VBA ?
    A+
    Je l'ai fait depuis VB, mais celà n'a absolument aucune importante, puisque je n'utilise pas du tout VB (sauf pour remplir la liste). Tout le reste est par utilisation directe de l'Api de Windows ...(et celle-là, elle se moque bien de savoir si ce qu'elle exécute lui est demandé par Pierre ou par Paul) ..

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Donc, je vais devoir tester si je veux en avoir le coeur net
    Allez, pour ce coup-ci, je vais te faire confiance...
    En fait j'ai la flemme et j'ai envie de passer à autre chose
    Bonne continuation

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 93
    Par défaut
    Rebonjour,

    ucfoutu je viens de passer un peu de temps sur ton code et voila ce que j'ai remarque,

    a la premiere passe HS = -1 donc n'entre pas dans le traitement

    au deuxieme appel , on entre en traitement mais la variable erreur est a true
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If LCase(chemin) <> LCase(chemin0) And (Not LCase(chemin) Like LCase(chemin0 & "\##-##-*\" & aie & "*")) Then
    chemin = "C:\A\AA"
    chemin0 = "C:\A"

    donc on remplit effectivement les conditions pour avoir une erreur.

    Pour l'appel suivant chemin devient bien "C:A\AA\MRanalyse.D mais HS reste a -1 donc on entre pas dans le traitement.

    C'est tout ce que j'ai pu voir comme trucs qui clochaient mais j'avoue que j'ai encore beaucoup a comprendre de ton code, j'ai l'impression d'etre un mecano du coin en train de travailler sur une F1

    Voila ou j'en suis. Je vais essayer de continuer la dessus. Si jamais tu vois que ca traine trop ou que ca devient trop complique pour pas grand chose je comprendrais si tu me conseillais de voir une approche plus classique (lire: "que je comprends" )


    Merci ouskel'n'or, je viens juste de voir ton post. Je vais regarder ca et essayer de l'adapter je prefere avoir trop de possibilite de codes que pas assez . Merci encore

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/06/2011, 15h16
  2. restauration du fichier vers une collection
    Par dimainfo dans le forum VB.NET
    Réponses: 4
    Dernier message: 06/05/2008, 02h18
  3. Réponses: 6
    Dernier message: 11/07/2007, 17h30
  4. Collection de fichier texte
    Par yancimer dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/09/2006, 15h44

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