Bonjour,
Je cherche à accélérer une macro faisant des calculs en chaine.
Chaque ligne de ma feuille Excel effectue un calcul distinct, prenant entre 1.33 s et 1.37 s, chacun.
Cependant, je m’apprête à utiliser : 180000*5=900000 lignes (et peut être encore plus par la suite, auquel cas j'emplirai toutes les lignes disponibles).
Donc un total de plus de 330h.
Ma feuille de calcul contient de nombreuses cellules se recalculant à chaque ligne :
- les cellules de calcul 19 à 59 sont utiles aux itérations de la ligne en cours
- les 24 cellules suivantes et les 7 précédentes n’ont pas besoin de se mettre à jour
=> j'aimerais bloquer le recalcul automatique des cellules, sauf celles qui me servent précisément, ainsi, je pense que cela diminuerai la consommation
Si au lieu d'utiliser des cellules avec formules je saisissais tout en VBA, serait-ce un gain de performances ?
Est-ce que arrêter la macro de temps en temps et redémarrer l'ordinateur peut provoquer un gain de performances ?
Merci d'avance pour votre aide
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
25
26
27
28
29
30 Sub calcul_2() 'MBE Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Dim start As Single Dim nbcalculs As Double start = Timer nbcalculs = Feuil7.Cells(3, 1).Value For a = 4 To nbcalculs If Feuil7.Cells(a, 18) = "" Then Tinf = 20: Tsup = 1199 Feuil7.Cells(a, 18) = 0 Feuil7.Rows(a:a).Calculate 'je voudrais que seule la ligne en cours se recalcule. Dans lidéal uniquement de la colonne 19 à la colonne 59 inclues Do While (Tsup - Tinf) > 1 Feuil7.Cells(a, 25) = (Tinf + Tsup) / 2 If Feuil7.Cells(a, 60) < 1 And Feuil7.Cells(a, 19) < 1 Then Tinf = (Tinf + Tsup) / 2 Else Tsup = (Tinf + Tsup) / 2 End If Loop t1 = (Tinf + Tsup) / 2 Feuil7.Cells(a, 18) = Format(t1, 0) Feuil7.Cells(1, 18) = a / Feuil7.Cells(3, 1).Value 'Cette fonction écrit le pourcentage d'avancement global End If Next Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True MsgBox "Durée : " & Timer - start & " secondes" End Sub
Partager