Accélération code vba
Résolu
simon7339
Messages postés
70
Statut
Membre
-
pijaku Messages postés 13513 Statut Modérateur -
pijaku Messages postés 13513 Statut Modérateur -
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
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.
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
A voir également:
- Accélération code vba
- Code ascii - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
- Planification de processeur graphique à accélération matérielle - Guide
3 réponses
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
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
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
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.
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.