Bonjour à tous,

Grâce au magnifique tutoriel sur les variables tableaux de silkyroad, j'ai finalement réussi à optimiser ma procédure.

Celle-ci me permet d'analyser mes volumes de commandes par semaine sur une année complète.
Concrètement, j'ai environ 8000 références qu'il a fallu que je retrace dans 25000 lignes de commandes sur l'année (ça fait donc 3 boucles relativement balaises).

Cependant, comme c'est ma première procédure où j'utilise les variables tableaux, je me doute bien qu'il y a beaucoup mieux à faire et donc optimisable.
En ce moment tout fonctionne pour le mieux, cependant, le temps de traitement est d'environ 30min (37sec par semaine)

Structure du classeur :
1ère feuille :
- Colonne A : Répertoire des références articles
- Colonne B : volume commandé en semaine 1
- Colonne C : volume commandé en semaine 2
- Etc jusqu'à 52

Voici le code que j'utilise :

4 tableaux chargés des données dont j'ai besoin

Tableau 1 : Références articles
Tableau 2 : Références commandées
Tableau 3 : N° de semaine
Tableau 4 : Volume commandé

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
Sub Prévision_Semaine()
 
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
 
Dim Debut As Date, Temps As Date, Fin As Date
Début = Time
 
'Compteur de ligne afin d'obtenir le nombre de références articles
Ligne = Sheets("Base").Range("A13:A" & Rows.Count).End(xlDown).Row
 
'Compteur de ligne afin de connaître le nombre de commandés passées
Dim LigneAccdep As Long
LigneAccdep = Sheets("accdep80").Range("A2:A" & Rows.Count).End(xlDown).Row
 
'Variable pour compteur ligne
Dim i As Long
 
'Variable pour compteur de semaine
Dim Sem As Byte
 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Déclaration des tableaux
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Tableau chargé des numéros d'articles et nom du fournisseur
'présent en colonne A de la feuille "Prévision semaine"
Dim TabArticle() As Variant
ReDim TabArticle(Ligne)
 
'Tableau chargé des numéros d'articles et nom du fournisseur
'présent en colonne H de la feuille "accdep80"
Dim TabArticle2() As Variant
ReDim TabArticle2(LigneAccdep)
 
'Tableau chargé des numéros de semaine de livraison des articles
'présent dans la feuille "accdep80"
Dim TabArticle3() As Variant
ReDim TabArticle3(LigneAccdep)
 
Dim TabArticle4() As Variant
ReDim TabArticle4(LigneAccdep)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
'Variable permettant d'obtenir le volume total commandé sur une semaine par référence
Dim VolCde As Long
 
'Création de la feuille de synthèse
Sheets.Add after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "Prévision semaine"
 
'Transfert des références articles vers la feuille de synthèse
Sheets("Base").Range(Sheets("Base").Cells(13, 3), Sheets("Base").Cells(Ligne, 3)).Copy
Sheets("Prévision semaine").Range("A2").PasteSpecial
 
'Chargement des données dans le tableau N°1
For i = 2 To Ligne
    TabArticle(i) = Sheets("Prévision semaine").Range("A" & i)
Next i
 
'Chargement des données dans le tableau N°2
For i = 2 To LigneAccdep
    TabArticle2(i) = Sheets("accdep80").Range("H" & i)
Next i
 
'Chargement des données dans le tableau N°3
For i = 2 To LigneAccdep
    TabArticle3(i) = Sheets("accdep80").Range("AX" & i)
Next
 
'Chargement des données dans le tableau N°4
For i = 2 To LigneAccdep
    TabArticle4(i) = Sheets("accdep80").Range("R" & i)
Next
 
'Boucle pour les semaines
For Sem = 1 To 52
 
    'Seconde boucle pour passer sur toutes les références articles
    For i = 2 To Ligne
 
        'Troisième boucle pour passer sur toutes les lignes de commandes
        For j = 2 To LigneAccdep
 
            'Test pour récupérer le volume commandé par référence article
            If TabArticle(i) = TabArticle2(j) And TabArticle3(j) = Sem Then
 
                VolCde = VolCde + TabArticle4(j)
            End If
 
        Next j
 
    'Associe le volume commandé à la référence article sur la feuille synthèse
    Cells(i, Sem + 3) = VolCde
    VolCde = 0
 
    Next i
 
Next Sem
 
Fin = Time
 
Temps = Fin - Début
 
MsgBox ("c'est fini !" & Chr(10) & "temps de traitement" & Temps)
 
End Sub
Auriez-vous des pistes à me faire part pour gagner en efficacité ?

En espérant avoir été assez clair, sinon n'hésitez pas à me poser des questions,

Bonne journée à vous,