Bonjour à tous,

Je sais bien que c'est le 2000ème message sur ce sujet, mais je rame depuis plusieurs jours maintenant, donc je me résigne à vous embêter...

J'ai deux feuilles dans un classeur Excel. J'ai une macro qui récupère des données dans la première feuille selon certaines conditions et qui met ces données dans la deuxième feuille.

Maintenant j'aimerai rajouter des conditions pour comparer les données dans ma feuille 2 avec celles que je vais y mettre : si l'id est le même et qu'il a les mêmes valeurs, je ne fais rien ; si l'id est le même et qu'il a des valeurs différentes, je change les valeurs concernées et je colore la case ; si l'id est différent, je crée une nouvelle ligne et je la colore en entier.

J'ai essayé plusieurs choses mais je rame sévère. Je pense que je dois faire un tableau dynamique dans lequel stocker mes valeurs. Ou utiliser un objet dictionnary.

La vérité c'est que j'en ai marre, et je suis dépitée de mes essais infructueux.
Donc si vous aviez qques pistes pour moi, merci d'avance.

Je vous mets la macro (qui fonctionne) à optimiser :
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
 
Option Explicit
'
' Macro pour mettre à jour le tableau des commandes en cours
'
Sub maj_tableau()
 
'Déclaration des variables
Dim SC As Object                                'déclare la variable SC (onglet Suivi des Commandes)
Dim MAJ As Object                               'déclare la variable MAJ (onglet Mise à Jour Commandes)
 
Dim ligneFin As Integer                         'déclare la variable ligne de fin
Dim I As Integer                                'déclare la variable I (incrément)
Dim J As Integer                                'déclare la variable J (incrément)
Dim K As Integer                                'déclare la variable K (incrément)
Dim L As Integer                                'déclare la variable L (incrément)
 
Dim TSC As Variant 'déclare la variable TSC (Tableau Suivi des Commandes)
Dim T() As Variant 'déclare la variable T
 
'Début de la macro
Application.ScreenUpdating = False
 
'Définition des onglets
Set SC = Sheets("Suivi des Commandes")          'définit l'onglet SC
Set MAJ = Sheets("Mise à Jour Commandes")       'définit l'onglet MAJ
 
ligneFin = SC.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée de la colonne 1 (=A) de l'onglet SC
TSC = SC.Range("A5:X" & ligneFin)               'définit le tableau de cellules TSC
 
'boucle 1 : sur toutes les lignes du tableau TSC
For I = 1 To UBound(TSC)
    'condition : si la cellule en colonne 23 (=W) de la ligne est égale à AUJOURDHUI ou VIDE
    If (TSC(I, 23) = Date Or TSC(I, 23) = "") And TSC(I, 20) = "" And TSC(I, 21) = "" Then
        ReDim Preserve T(6, J)                  'redimensionne le tableau T
        T(0, J) = TSC(I, 1)                     'récupère l'[Identifiant de la commande] dans la première ligne  (ligne 0)
        T(1, J) = TSC(I, 3)                     'récupère la [Désignation] dans la deuxième ligne  (ligne 1)
        T(2, J) = TSC(I, 6)                     'récupère la [Quantité commandée] dans la troisième ligne  (ligne 2)
        T(3, J) = TSC(I, 16)                    'récupère la [Date demandée finale] dans la quatrième ligne  (ligne 3)
        T(4, J) = TSC(I, 17)                    'récupère la [Date confirmée finale] dans la cinquième ligne  (ligne 4)
        T(5, J) = TSC(I, 23)                    'récupère la [Date réelle de livraison] dans la sixième ligne  (ligne 5)
        T(6, J) = TSC(I, 24)                    'récupère la [Quantité réelle livrée] dans la sixième ligne  (ligne 6)
        J = J + 1
    End If
Next I
 
'boucle 2 : sur toutes les colonnes du tableau T
For K = 0 To UBound(T, 2)
    'boucle 3 : sur les 6 lignes du tableau T
    For L = 0 To 6
        MAJ.Cells(K + 1, 1).Offset(2, L) = T(L, K) 'renvoie en transposant les données du tableau T dans l'onglet MAJ
    Next L
Next K
 
Application.ScreenUpdating = True
 
End Sub
Si vous avez des remarques pour améliorer ce morceau qui fonctionne bien, n'hésitez pas non plus!