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 :

Probleme de lenteur lors d'une recherche


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 235
    Points : 75
    Points
    75
    Par défaut Probleme de lenteur lors d'une recherche
    Bonjour, je doit ouvrir un fichier texte avec excel puis renseigner une plage de cellule à l'aide des valeurs de la 1er colonne. Simplement, pour des petits fichiers avec peut de lignes, cela est relativement rapide, mais lorsque je passe à des documents qui font plusieurs milliers de lignes, le traitement est très long, je vous met mon code, si qqn voit comment je pourrait accélerer la recherche.
    Code vba : 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
    Sub ouverture()
        Application.ScreenUpdating = False
        LeFichierAOuvrir = Application.GetOpenFilename(Title:="Nom du fichier PGI à ouvrir")
        If LeFichierAOuvrir <> "Faux" Then
            classeur = ActiveWorkbook.Name
            nomfeuil = ActiveSheet.Name
            OuvrirLeFichier
        Else
            Exit Sub
        End If
        Windows(classeur).Activate
        Application.DisplayAlerts = True
        Application.ScreenUpdating = True
        Workbooks(classeur).Sheets(nomfeuil).Range("A1").Activate
        Workbooks(classeur).Sheets(nomfeuil).Range("A1").Show
    End Sub
    Sub OuvrirLeFichier()
        Workbooks.OpenText Filename:= _
                LeFichierAOuvrir, Origin:=xlMSDOS _
                , StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
                ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
                , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
                TrailingMinusNumbers:=True
        classeurorigine = ActiveWorkbook.Name
        feuilleorigine = ActiveSheet.Name
        Workbooks(classeur).Activate
        Range("B70").Value = classeurorigine
        Sheets(nomfeuil).Select
        If Range("O2") = 1 Then
                Call ImporterAuxiliaire
        ElseIf Range("O2") = 2 Then
                Call ImporterGénéraux
        ElseIf Range("O2") = 3 Then
                Call ImporterSection
        ElseIf Range("O2") = 4 Then
                Call ImportPGI3
        ElseIf Range("O2") = 5 Then
            Call ImporterJnal2
        End If
    End Sub

    Code vba : 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
    Public Sub ImportPGI3()
        Dim x
        Dim y As Integer, z As Integer, i As Long
        'on cherche la derniere ligne non vide de la feuille excel
        Workbooks(classeurorigine).Activate
        Sheets(feuilleorigine).Select
        dl = Range("A65536").End(xlUp).Row
        'formatage de la plage de cellule avec umport des valeurs
        Workbooks(classeur).Sheets(nomfeuil).Activate
        Application.Goto reference:="t_journal", Scroll:=True
        Range("t_journal").ClearContents
            y = 1
            For i = 1 To dl
                If Mid((Workbooks(classeurorigine).Sheets(feuilleorigine).Cells(i, 1)), 1, 3) <> "***" Then
                    z = Range("t_journal").Rows.Count
                    If y > z - 1 Then
                        Range("t_journal").Cells(z, 1).Insert Shift:=xlDown
                        Range("t_journal").Cells(y, 1).Value = Mid((Workbooks(classeurorigine).Sheets(feuilleorigine).Cells(i, 1)), 1, 3)
                    End If
     
                Range("t_journal").Cells(y + 1, 1).Value = Mid((Workbooks(classeurorigine).Sheets(feuilleorigine).Cells(i, 1)), 1, 3)
                Range("t_journal").NumberFormat = "@"
                y = y + 1
                End If
            Next
        Call FiltreDoublons
    End Sub
    Sub FiltreDoublons()
        Dim Plage As Range, i As Long, dll As Long
        'on supprime les doublons de la plage de cellule
        dll = Range("t_journal").End(xlUp).Row
        For i = dll To 2 Step -1
            If Range("t_journal").Cells(i, 1).Value = Range("t_journal").Cells(i - 1, 1).Value Then
                Range("t_journal").Cells(i, 1).EntireRow.delete
            End If
        Next
    End Sub

  2. #2
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    En règle générale (ou plutot d'après les quelque teste que j'ai fait et ce que j'ai pu lire) find est plus rapide que le parcours des ligne avec des tests sur les caractères.
    J'ai égalemnt remarqué qu'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for each cell in range "A1:A100"
    est un tout petit peu plus rapide que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i = 1 to 100
    cells(i,1)
    C'était de lordre que quelque pourcent je croie mais si ton traitement est vraiment long c'est toujours ca
    « Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 58
    Points : 32
    Points
    32
    Par défaut
    il me semble que Select case est plus rapide que if elseif ...

    va jeter un oeil ici, ça m'a pas mal aidé :

    http://xcell05.free.fr/pages/prog/accvba.htm#Excel

    Il existe aussi une partie traitant de l'optimisation du code sur dvp.com, mais je ne sais plus si c'est dans le cours vb ou vba. A chercher ...

  4. #4
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bonjour,

    Tu as quelques select et activate qui ralongent inutilement le temps.

    Il y a dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.DisplayAlerts = True
    et pas de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.DisplayAlerts = False
    en début de document.

    Pour tester les temps de traitement tu peux utiliser un compteur du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub testtempscode00()
    Dim Debut As Long, fin As Long
     
    Debut = GetTickCount()
    ' Debut du code
    ''Procedure_principale
    'Fin du code
    fin = GetTickCount()
     
    MsgBox "Temps mis en millisecondes : " & fin - Debut
     
     
    End Sub
    Il y a d'autres exemples plus evolués dans "Contribuez".

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 235
    Points : 75
    Points
    75
    Par défaut
    OKi merci

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

Discussions similaires

  1. Problemes de rechargement de pages lors d'une recherche
    Par Conan_86 dans le forum Langage
    Réponses: 4
    Dernier message: 28/01/2011, 10h41
  2. [Zend Search Lucene] Lenteur lors d'une recherche
    Par rehren dans le forum Zend Framework
    Réponses: 3
    Dernier message: 03/12/2010, 09h09
  3. probleme de lenteur lors de l'execution d'une macro sous excel
    Par smartbis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/05/2007, 08h49
  4. Probleme lors d'une recherche sur les forums
    Par JUSTIN Loïc dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 8
    Dernier message: 27/07/2005, 12h22
  5. Enlever la surbrillance lors d'une recherche avec vi
    Par sekiryou dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 04/03/2004, 13h55

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