Accélération code vba

Résolu/Fermé
simon7339 Messages postés 68 Date d'inscription lundi 10 mars 2014 Statut Membre Dernière intervention 10 avril 2018 - Modifié par pijaku le 19/06/2015 à 07:41
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 19 juin 2015 à 07:47
Bonjour à tous,

Ci-joint un fichier sur lequel j'ai travaillé avec l'aide d'un membre du forum.
http://www.cjoint.com/c/EFspZVpxePv

Le code ci-dessous (en module 5) est très lent (j'ai plus de 6000 lignes à traiter)

Si certains d'entre vous ont une idée pour accélérer ce code je suis preneur.

J'ai lu sur un autre forum :

"le truc, c'est de passer par un tableau. Tu définis toute la zone sur laquelle tu va travailler et tu la mets dans un Range. Tu définis ensuite un Variant et tu mets le Range dedans. Tu travailles sur le Variant, il n'y a plus d'accès à la feuille et ça va 10 fois plus vite. A la fin tu remets le Variant dans le Range d'un seul coup."

Exemple
Dim rg As Range
Dim v as Variant
Set rg = Worksheets("MaFeuille").Range("A1:G10000")
v = rg
'On travaille sur v ...
rg = v


Vous pensez que je peux utiliser cette méthode dans mon code? Je ne la comprends pas trop.

Mon code que j'essaie d'améliorer :

Merci d'avance pour vos conseils.

Sub Actu()
Dim DLig As Long
Dim i As Long
Dim f As Long
Dim ID As Long
Dim Trouve As Object, PlageDeRecherche As Range

Dim sngChrono As Single

sngChrono = Timer

Application.ScreenUpdating = False

Application.DisplayAlerts = False

Set PlageDeRecherche = Sheets("Feuil1").Columns(1)
For f = 2 To Worksheets.Count
  With Sheets(f)
    DLig = .Range("A" & Rows.Count).End(xlUp).Row
    DCol = .Cells(10, Columns.Count).End(xlToLeft).Column
    For i = 11 To DLig
      ID = .Range("A" & i).Value
      Set Trouve = PlageDeRecherche.Find(what:=ID, LookAt:=xlWhole)
      If Not Trouve Is Nothing Then
        therow = Trouve.Row
        .Range(.Cells(i, 17), .Cells(i, DCol)).Copy Destination:=Sheets("Feuil1").Range("Q" & therow)
      Else
      MsgBox ID & " ID Number Not found"
      End If
    Next i
  End With
Next f

Application.ScreenUpdating = True

sngChrono = Timer - sngChrono
MsgBox "Temps d'execution du code en sec : " & CStr(sngChrono)

End Sub

3 réponses

simon7339 Messages postés 68 Date d'inscription lundi 10 mars 2014 Statut Membre Dernière intervention 10 avril 2018 1
18 juin 2015 à 19:07
J'essaie de voir pour faire avec un array? Serait-ce une bonne méthode pour accélérer le code? Je ne l'ai jamais utilisé, j'essaie de comprendre avec des forum
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 427
18 juin 2015 à 21:30
Bonjour

1. Passer par un tableau, je ne pense pas que ça accélère grand chose puisque les lignes des feuilles de détail à copier ne sont pas forcément consécutives dans la freuille1, donc ne forment pas une plage
2. Quand tu dis que ça met beaucoup de temps, ça fait combien de secondes ?
Chez moi, 20 s (sur une vieille machine qui tourne à 2 Ghz) c'est assez raisonnable
3. Est ce indispensable de copier toutes les feuilles de détail en un coup.
Si tu fais des modifications dans une ligne d'une de ces feuilles, il suffirait de mettre à jour la feuille 1 au fur et à mesure avec un clic-clic sur l'id à mette à jour par exemple
4. Que fait on des id des feuilles de détails qui ne figurent pas dans la feuille 1
Tu as prévu un message d'alerte, je suppose que c'est temporaire

Cdlmnt
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
19 juin 2015 à 07:47
Bonjour,
ccm81 mes salutations au passage,

Je suis d'accord avec les recommandations de ccm81. Les tableaux ne seront pas ici d'une grande utilité.
Néanmoins, si et seulement si, ta colonne A de la feuille Sheets("Feuil1") ne contient aucun doublon, tu as peut être la possibilité de gagner du temps d'exécution.
Réponds déjà aux questions de ccm81 et à la mienne, on verra la suite.
0