Bonjour à tous,
Je me permets de laisser un petit message car le code que je réalise rame tellement qu'il met 45min avant de finir (si il fini) si bien que la tâche que la macro effectue serait plus rapide à la mains.
But de la macro :
La macro suivante à pour but de répliquer la ligne 9 à 14, sur n itération (demandé à l'utilisateur).
Initialement, l'idée pour gagner du temps était de copier 1 fois puis 2 puis 4 puis 8 (2^n) etc... mais évidemment arrivé à copier 1000 lignes, Excel sature et plante.
J'ai donc découper en deux parties : l'une pour augmenter le nombre de ligne copié d'un coup (2^4) puis de manière constante (2^4 mais j fois).
Initialement, le copier coller de ces lignes fonctionnes très bien mais cela met de plus en plus de temps à chaque copier coller.
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
31
32
33
34
35
36
37
38
39
40
41 Sub PropagerModificationDeLignes9a14() ' ' PropagerModificationDeLignes9a14 Macro ' Permet de propager les formules de calcules de la lignes 10 à 14 jusquà 12 000 itération ' Worksheets("Bilan Dynamique").Activate Rows("15:15").Select Range(Selection, Selection.End(xlDown)).Select Selection.Clear Application.Calculation = xlManual itMax = InputBox("Nombre d'itération maximum souhaité", "Choix du nombre d'itération", "100") If (itMax <> 0) Then iMax = 4 jMax = itMax / (2 ^ (iMax + 1)) jMax = Round(jMax + 0.5) For i = 0 To iMax - 1 Rows("9:" & (6 * 2 ^ i + 8)).Select Application.CutCopyMode = False Selection.Copy Rows((6 * 2 ^ i + 9) & ":" & (6 * 2 ^ (i + 1) + 9)).Select Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _ , SkipBlanks:=False, Transpose:=False 'Application.Wait Time + TimeSerial(0, 0, 1) Next Rows("9:" & (6 * 2 ^ i + 8)).Select Application.CutCopyMode = False Selection.Copy For j = 0 To jMax - 1 Rows((6 * 2 ^ (i) * j + 9 & ":" & 6 * 2 ^ (i) * (2 * j + 1) + 8)).Select Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _ , SkipBlanks:=False, Transpose:=False 'Application.Wait Time + TimeSerial(0, 0, 1) Next Application.Calculation = xlAutomatic End If ' End Sub
Le Code fonctionne péniblement jusqu'à 2000 itération (ligne 12008) puis erreur 1004. Je pense que cela vient de la fonction "coller" qui sature en mémoire (pourtant le nombre de ligne copier reste constant).
Si jamais vous avez une idée de comment permettre à ce code d'aller plus vite, je suis preneur !
Pierre
Partager