Rendre code plus rapide question générique
Bonsoir :)
J'ai commencé à évoluer depuis quelques semaines et je m'en sors pas mal disons... j'aimerais toutefois comprendre comment accélérer mes codes qui mettent des trentaines de seconde parfois pour fonctionner !!! J'ai lu qu'il faut mettre Aplication.Calculation=....manuel puis la remettre Application.Calculation=....automatique OK mais est ce que cette manœuvre se fait sur toute la sub ou uniquement avant et après une boucle dans la sub ?
Hello,
Généralement j'utilise ca pour optimiser mon code :
Sub test()
Application.Screenupdating = False
Application.Calculation = Xlmanual
'
'
'ton code
'
'
Application.screenupdating = True
Application.Calculation = XlAutomatic
End subComme tu l'as mentionné, cela sera actif à partir du moment ou tu le mets en places dans ton code et ça se désactivera quand tu diras dans le code que tu le réactives, tu peux l'utiliser plusieurs fois dans ton code c'est pas dérangeant. C'est comme un interrupteur, tu l'éteins et après tu le rallumes. Si tu veux l'allumer plusieurs fois et l'éteindre plusieurs fois entre temps tu peux aussi c'est pas interdit :)
J'espère que je suis clair ;)
@+
Justement quand je le place au tout début et à la fin d code j'ai un user userform vide qui s'affiche... c'est pourquoi j'ai songé et proposé à le placer seulement là où ily à une boucle ... dans ce cas je vais alors essayer de le mettre plusieurs fois à dives endroits et je reviens vous dire le résultat :)
Bah non ça met 15 ou 17 secondes pour se faire !! Voici en fait le code :
Private Sub CommandButton2_Click()
Sheets("Formulaire").Cells(18, 3) = TextBox3
With Sheets("For")
Sheets("Formulaire").Range("B21:G41").Copy
Sheets("For").Cells(1, 2).PasteSpecial Paste:=xlPasteValues
End With
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'Trie
Range("A1:G21").Select
ActiveWorkbook.Worksheets("For").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("For").Sort.SortFields.Add Key:=Range("A1:A21"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("For").Sort
.SetRange Range("A1:G21")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Insertion de lignes vides pour une meilleure présentation sur la listBox du userform
Dim sh As Worksheet
Dim i As Integer
'bon on va travailler sur la feuille
'active au moment du lancement
Set sh = Sheets("For")
i = 2
While sh.Cells(i, 1) <> ""
If sh.Cells(i - 1, 1) <> sh.Cells(i, 1) Then
sh.Cells(i, 1).EntireRow.Insert Shift:=xlShiftDown
i = i + 1
End If
i = i + 1
Wend
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
'Là c'est une copie du trie avec insertions dans un autre feuillet pour facilité de manoeuvre (Rowsource du Listbox)
With Sheets("Formulaire")
Sheets("For").Range("A1:G30").Copy
Sheets("Formulaire").Cells(21, 20).PasteSpecial Paste:=xlPasteValues
End With
Dim LastRw As Long
With Sheets("Formulaire")
LastRw = Sheets("Formulaire").Cells(Rows.Count, 10).End(xlUp).Row
Sheets("Formulaire").Range("J22:O" & LastRw).FillDown
End With
UserForm2.Show
End SubIl y a des copie/Coller ok met je pense que c le trie et l'insertion de lignes vides qui ralentissent le code ...
Si y des conseils je serais preneur
Merci :)
bonjour,
vous voulez faire quoi dans cette macro ? Il y a quoi dans la plage A1:A20 de "For" ?
Surtout, il faut minimaliser les interactions avec la feuille, cela coût du temps, faire tout en mémoire.
en fait ce que j'ai copié dans la feuille "formulaire" qui est Range("B21:G41").Copy je l'ai collé dans une autre feuille que j'ai appelé "For" pour effectuer mon trie et insertion de lignes vides librement. C'est comme du bricolage.
puis le résultat que j'ai après tri et insertion dans la feuille de bricolage "For" je le copie et colle de nouveau dans une autre plage dans "Formlaire" qui sera l'origine de ma listbox.
Je ne vois pas comment utiliser et déclarer des tableaux en mémoire. J'ai lu le cours vba du site traitant de ce sujet, que j'ai un peu compris, mais je ne vois pas comment l'appliquer à mon cas ...
