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 :

Je sèche sur un code très très lent [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut Je sèche sur un code très très lent
    Bonjour le forum,

    Je sèche sur un bout de code simple, mais très lent, et je ne comprends pas pourquoi.
    Dans une feuille A, j'ai une liste de numéro de commandes, et j'effectue une recherche sur une autre feuille B afin de ramener des infos en face des numéros de commande de la feuille A.
    Le fichier contient en gros 6000 lignes, ce qui n'est pas énorme. Pourtant, ce code prend pratiquement 30 minutes.

    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
     
    Dim WsRecap As Worksheet, WsComm As Worksheet, PlageCdes As Range, C As Range
    Dim i As Long
    Set WsRecap = Sheets("Récap")
    Set WsComm = Sheets("Commandes")
    Set PlageCdes = WsComm.Range("A4:A" & WsComm.[A65536].End(xlUp).Row)
     
    Application.ScreenUpdating = False
     
    For i = 4 To WsRecap.[A65536].End(xlUp).Row
        If Len(WsRecap.Cells(i, 14)) <> 8 Then
            With PlageCdes
                Set C = .Find(WsRecap.Cells(i, 1), lookat:=xlWhole)
                    If Not C Is Nothing Then
                        WsComm.Range("B" & C.Row & ":I" & C.Row).Copy Destination:=WsRecap.Cells(i, 2)
                        WsComm.Range("O" & C.Row & ":Q" & C.Row).Copy Destination:=WsRecap.Cells(i, 14)
                    End If
            End With
        End If
    Next i
     
    Application.ScreenUpdating = True
     
    End Sub
    Le plus étrange pour moi est que quand je ne rapporte que le premier range d'infos (entre B et I plus tôt), je n'en ai que pour une vingtaine de secondes.

    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
     
    Application.ScreenUpdating = False
     
    For i = 4 To WsRecap.[A65536].End(xlUp).Row
        If Len(WsRecap.Cells(i, 14)) <> 8 Then
            With PlageCdes
                Set C = .Find(WsRecap.Cells(i, 1), lookat:=xlWhole)
                    If Not C Is Nothing Then
                        WsComm.Range("B" & C.Row & ":I" & C.Row).Copy Destination:=WsRecap.Cells(i, 2)
                    End If
            End With
        End If
    Next i
     
    Application.ScreenUpdating = True
     
    End Sub
    Et quand j'essaie de ramener le range "O:Q", je me traîne la-men-table-ment.
    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
     
    Application.ScreenUpdating = False
     
    For i = 4 To WsRecap.[A65536].End(xlUp).Row
        If Len(WsRecap.Cells(i, 14)) <> 8 Then
            With PlageCdes
                Set C = .Find(WsRecap.Cells(i, 1), lookat:=xlWhole)
                    If Not C Is Nothing Then
                        WsComm.Range("O" & C.Row & ":Q" & C.Row).Copy Destination:=WsRecap.Cells(i, 14)
                    End If
            End With
        End If
    Next i
     
    Application.ScreenUpdating = True
     
    End Sub
    Et ça commence à me rendre chèvre.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Bonjour,

    As-tu des formules dans ton fichier?

    si oui, essaie en rajoutant ceci en début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationManual
    et en fin de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationAutomatic

  3. #3
    Membre éprouvé Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Par défaut
    Les copié collé prennent énormément de temps... comme les find

    Si tu ne récupère que des valeurs essaye plutot de les stocker dans des tableaux à deux dimensions. Puis recherche les correspondances.

    C'est un avis perso

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Bonjour Mapeh et Many31

    Non, absolument aucune formule...
    J'ai pensé aux tableaux, mais j'avoue que je n'ai pas encore compris leur fonctionnement...

    Oups, je n'avais pas vu la réponse de DeaD78. Tu veux dire comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If Not C Is Nothing Then
        WsComm.Range("B" & C.Row & ":I" & C.Row).Copy Destination:=WsRecap.Cells(i, 2)
        Application.CutCopyMode = False
        WsComm.Range("O" & C.Row & ":Q" & C.Row).Copy Destination:=WsRecap.Cells(i, 14)
    End If
    Non, ça ne change rien.

    Dans les colonnes O à Q, il y a une date (20080925 par exemple, une valeur (0 par exemple aussi), et un nom d'utilisateur (GBFR1...), le tout au format standard.
    Je viens d'essayer de copier la colonne A de mes feuilles A et B dans un autre fichier, positionner mes colonnes O à Q dans ma feuille B, et recommencer la recherche, et là c'est rapide...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Effectivement, c'était comme ça.

    Bon, sortons l'artillerie lourde.

    Laisse le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CutCopyMode = False
    Ca ne mange pas de pain.

    Rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationManual
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationAutomatic
    comme suggéré.

    Je te propose aussi de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = False
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.DisplayAlerts = False
    au début de ton code et à True à la fin de ton code.

    Par ailleurs, enlève les Set. A mon sens, il ne sont pas utiles ici. Teste pour voir.

    Je vais encore jeter un œil sur ce qui est possible de faire mais commence déjà par ça.

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Rah, je viens de remplacer ma feuille Récap par une nouvelle feuille, et tout fonctionne bien. Il devait y avoir je ne sais pas quoi (un format, un truc du genre) dans ma feuille d'origine. Argh! Encore un topic que j'ouvre pour un problème bénin.

    Pardon, et merci pour votre aide en tout cas. Ce forum est très bien pour ça.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Bonjour,

    Qu'y a-t-il dans tes colonnes O à Q ?

    Tu peux aussi mettre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CutCopyMode = False
    entre les 2 Copy/Paste.

    Dis-nous vite

    EDIT : Many31, je ne vois pas pourquoi tu dis que les Copy/Paste prennent du temps. C'est mieux qu'une boucle afin de copier ligne par ligne ou de stocker ligne par ligne dans un tableau. Et pour ce qui est du .Find, je ne vois pas non plus pourquoi tu dis ça. C'est ce qu'il y a de plus optimisé pour la recherche...

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

Discussions similaires

  1. BDD sur réseau très très très lent...
    Par ericain dans le forum Access
    Réponses: 12
    Dernier message: 20/02/2015, 17h17
  2. newSchema(url) exécution très très très lente
    Par schum-hacker dans le forum Général Java
    Réponses: 6
    Dernier message: 21/01/2013, 09h32
  3. Logiciel intranet très très très lent
    Par openeyes dans le forum ALM
    Réponses: 7
    Dernier message: 15/02/2011, 15h16
  4. Améliorer les performances - très (très) (très) grands datasets
    Par debdev dans le forum Administration et Installation
    Réponses: 6
    Dernier message: 08/01/2010, 16h46
  5. Démarrage trés, trés, trés difficile
    Par Cazaux-Moutou-Philippe dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 29/06/2008, 10h45

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