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 :

Optimiser un code pour gagner en vitesse [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut Optimiser un code pour gagner en vitesse
    Bonjour,

    Je vous fais part de deux petits codes que je souhaite optimiser.

    Le premier a pour but de boucler dans un répertoire et de récupérer le nombre de fichiers commençant par 'SEE'. Qu'en pensez-vous ?

    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
    Function NumberFilesSee(ByVal Folder As String) As Long
        Dim Fso As Scripting.FileSystemObject
        Dim fld As Scripting.Folder
        Dim fil As Scripting.File
        Dim NbrFilesSee As Long
     
        Set Fso = New Scripting.FileSystemObject
        Set fld = Fso.GetFolder(Folder)
        For Each fil In fld.Files
            If Left(fil.Name, 3) = "SEE" Then
                NbrFilesSee = NbrFilesSee + 1
            End If
        Next fil
        NumberFilesSee = NbrFilesSee
        Set Fso = Nothing
    End Function
    Le seconde a pour but de tourner dans le même répertoire et de m'indiquer le nombre de fichiers commençant soit par 'SEE' soit par une série (8 permiers caractères) de caractères définis. Qu'en pensez-vous ?

    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
    Function NumberFilesSeeAndUser(ByVal Folder As String) As Long
        Dim Fso As Scripting.FileSystemObject
        Dim fld As Scripting.Folder
        Dim fil As Scripting.File
        Dim NbrFilesSeeAndUser As Long
     
        Set Fso = New Scripting.FileSystemObject
        Set fld = Fso.GetFolder(Folder)
        For Each fil In fld.Files
            If Left(fil.Name, 3) = "SEE" Then
                NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            End If
            If Left(fil.Name, 8) = "00000221" Or Left(fil.Name, 8) = "00061065" _
                Or Left(fil.Name, 8) = "00101663" Or Left(fil.Name, 8) = "00000413" _
                Or Left(fil.Name, 8) = "00060935" Or Left(fil.Name, 8) = "00060777" _
                Or Left(fil.Name, 8) = "00101142" Or Left(fil.Name, 8) = "00060106" Then
                    NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            End If
        Next fil
        NumberFilesSeeAndUser = NbrFilesSeeAndUser
        Set Fso = Nothing
    End Function

    Ces deux fonctions me renvoient les nombres dont j'ai besoin pour la suite du traitement.

    Temps de réaction :

    • Quand j'ai 100 fichiers : respectivement 00:00:00:31 et 00:00:00:61
    • Quand j'ai 200 fichiers : respectivement 00:00:00:61 et 00:00:01:30
    • Quand j'ai 376 fichiers : respectivement 00:00:01:95 et 00:00:10:20


    Et comme je n'ai pas dix dossiers par jours, le porquoi de la demande. Si vous avez des idées ou peut-être est-ce le matériel ou le réseau qui est foireux ? A votre avis ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 598
    Points : 34 283
    Points
    34 283
    Par défaut
    Salut,

    le fait de passer par chaque fichier de ton dossier me semble long effectivement. Peut-etre que passer par une boucle Dir qui pointe directement sur les fichiers concernes te ferait gagner du temps

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'dans l'idee
    dim compteur1 as Integer
    Dim compteur2 as Integer
    dim tmp as string
    tmp=Dir(Folder & "\SEE*.*")
    Do until tmp= ""
    compteur1 = compteur1+1
    tmp = Dir()
    Loop
    'meme chose pour le compteur2
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Bon, je teste et il me met tout de suite tmp="". Donc, il s'arrête.
    Je dois oublier quelque chose.

    je cherche et je trouve génial

    Bon pour un critère c'est bon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier = Dir(Chemin & "SEE*.Digitsol")
    Mais comment faire pour utiliser plusieurs critères en même temps ?
    1er critère : SEE
    2e critère (de rattrapage) : 00000221 + 00061065 + 00101663 + 00000413 + 00060935 + 00060777 + 00101142 + 00060106 -->> Les chiffres représentent les 8 premiers caractères qui remplassent parfois le SEE

  4. #4
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Bon pour éviter des modifictaions sur modifications, ...

    Je fais les tests les uns après les autres et c'est magique. La rapidité est ......................... super hyper méga rapide.

    Donc un très grand merci à jpcheck

  5. #5
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Donc, pour mon premier test, je fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Dim Chemin As String, Fichier As String
        Chemin = Folder
        Fichier = Dir(Chemin & "SEE*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSee = NbrFilesSee + 1
            Fichier = Dir()
        Loop
     
    NumberFilesSee = NbrFilesSee
    Pour le second :

    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
        Dim Chemin As String, Fichier As String
        Chemin = Folder
        Fichier = Dir(Chemin & "SEE*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            Fichier = Dir()
        Loop
    '1
        Fichier = Dir(Chemin & "00000221*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            Fichier = Dir()
        Loop
    '2
        Fichier = Dir(Chemin & "00061065*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            Fichier = Dir()
        Loop
    '3
        Fichier = Dir(Chemin & "00101663*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            Fichier = Dir()
        Loop
     
    '4
        Fichier = Dir(Chemin & "00000413*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            Fichier = Dir()
        Loop
     
    '5
        Fichier = Dir(Chemin & "00060935*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            Fichier = Dir()
        Loop
     
    '6
        Fichier = Dir(Chemin & "00060777*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            Fichier = Dir()
        Loop
     
    '7
        Fichier = Dir(Chemin & "00101142*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            Fichier = Dir()
        Loop
     
    '8
        Fichier = Dir(Chemin & "00060106*.Digitsol")
        Do While Len(Fichier) > 0
            NbrFilesSeeAndUser = NbrFilesSeeAndUser + 1
            Fichier = Dir()
        Loop
    Le second est un peu - c'est pas très grave vu l'ultra rapidité. Mais peut-on rationnaliser cela ?

  6. #6
    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 274
    Points
    11 274
    Par défaut
    Salut regarde ici Liste des fichiers d'un dossier ou là Liste des fichiers d'un dossier : Office 32/64 Bits et adapte à ton contexte.



    ............. Balles tragiques à Charlie

  7. #7
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Très complet. Je cherche à comprendre et je dis quoi. Merci.

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour.

    Citation Envoyé par QuestVba Voir le message
    Mais peut-on rationnaliser cela ?
    Créer une procédure avec le chemin et le nom du fichier dans une variable en paramètre …

    _________________________________________________________________________________________________
    Je suis Charlie

    Jour d'ouverture des soldes : liquidation totale chez Charlie Hebdo …

    Un scientifique lira des centaines de livres au cours de sa vie, mais sera toujours persuadé qu'il lui reste beaucoup à apprendre.
    Un religieux n'en lira qu'un et sera persuadé d'avoir tout compris …

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

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

Discussions similaires

  1. optimisation du code pour des combobox
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 08/03/2008, 13h30
  2. Optimisation code pour gagner en rapidité
    Par polodu84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/03/2008, 15h32
  3. Réponses: 0
    Dernier message: 29/08/2007, 16h57
  4. Optimiser un code pour éviter " out of memory"
    Par risack dans le forum MATLAB
    Réponses: 16
    Dernier message: 19/03/2007, 09h36
  5. Réponses: 8
    Dernier message: 14/09/2006, 16h43

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