Bonjour à toutes et à tous,

Je travaille actuellement sur une macro Excel permettant de coloriser une carte du monde (formes vectorielles).
Le classeur comporte deux feuilles, une pour la carte et une pour les données.

Le code fonctionne pour le moment à peu près correctement (il me reste d'autres détails à peaufiner), mais l'interrogation principale concerne l'emploi de Like pour faire les tests et attribuer la bonne couleur au pays.

En effet, les valeurs de la cellule données ne sont pas uniformisées (par exemple, le programme cherche des valeurs type "Hello1" quand certaines cellules du tableau peuvent contenir "Hello1 World").

Dans mon code, le test d'équivalence a la forme suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
           For k = 4 To 42
           'Si les données de la cellule i (numéro de ligne) et u (année) est égale à la
           'valeur de la cellule en ligne k colonne 3 ALORS
                If donnees.Cells(i, u) = carte.Cells(k, 3) Then
où :
  • k appartient à une boucle for opérant sur les lignes 4 à 42 de la feuille carte (dans la colonne 3, j'ai les valeurs recherchées)
  • i appartient à une boucle for opérant sur les lignes 6 à la dernière ligne utilisée dans la feuille données
  • u désigne le numéro de colonne dans laquelle le test doit s'effectuer


J'ai trouvé le tutoriel de SilkyRoad pour la manipulation de chaînes et j'ai tenté de l'adapter avec un adressage de cellule(x,y). Cela donnait quelque chose comme

Code : Sélectionner tout - Visualiser dans une fenêtre à part
If carte.Cells(k,3).Value Like "*&donnees.Cell(i,u)&*" Then
Sauf que la suite du code (attribution de la couleur au pays) m'envoie une erreur

Erreur Code 9 : l'indice n'appartient pas à la sélection

Ma liste initiale de couleurs comporte également des motifs (hachures) et j'ai essayé de les détecter. Cela pourrait à priori fonctionner, il ne me manque que le moyen d'enregistrer le type de motif (variable pattern) pour pouvoir le restituer par la suite (il n'est pas stocké sous forme de texte, mais de nombre)

Voici le code de la macro :
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Sub cartes()
 
Dim carte As Worksheet
Set carte = Worksheets("carte")
 
Dim donnees As Worksheet
Set donnees = Worksheets("données")
 
Dim code As String
'Dim pattern As String
Dim pays As Shape
Dim color As Long
 
Dim R(42) As Integer
Dim G(42) As Integer
Dim B(42) As Integer
'Dim Rp(42) As Integer
'Dim Gp(42) As Integer
'Dim Bp(42) As Integer
 
Dim z As Boolean
 
' vide les couleurs de la carte
limpacarta
 
'lit les couleurs
 
carte.Select
 
For k = 4 To 42
    color = Cells(k, 2).Interior.color
    R(k) = Int(color Mod 256)
    G(k) = Int((color Mod 65536) / 256)
    B(k) = Int(color / 65536)
    'color = Cells(k, 2).Interior.PatternColor
    'Rp(k) = Int(color Mod 256)
    'Gp(k) = Int((color Mod 65536) / 256)
    'Bp(k) = Int(color / 65536)
    'pattern = Cells(k, 2).Interior.pattern
Next k
 
 
'lit l'année
 
For i = 4 To 11
    If Cells(i, 7) <> "" Then u = i + 1
Next i
 
'lit la catégorie
 
For i = 4 To 10
    If Cells(i, 10) <> "" Then v = Cells(i, 9)
Next i
 
 
'couleur pour chaque pays
For Each pays In carte.Shapes
 
    'Récupérer le code du pays contenu dans le nom de l'objet
    code = pays.Name
 
    'aller chercher dans la colonne son nom
    For i = 6 To donnees.UsedRange.Rows.Count
 
    'Si la valeur de la cellule i dans la colonne de données 3 est égale
    'au code lu dans la carte ET QUE la valeur de la cellule i dans la colonne de données 4
    'est égale à v ALORS
    If donnees.Cells(i, 3) = code And donnees.Cells(i, 4) = v Then
    'And donnees.Cells(i, 3).Font.ColorIndex = 21 Then
 
        'de k =4 à k=21
           For k = 4 To 42
           'Si les données de la cellule i (numéro de ligne) et u (année) est égale à la
           'valeur de la cellule en ligne k colonne 3 ALORS
                'If donnees.Cells(i, u) = carte.Cells(k, 3) Then
                If carte.Cells(k, 3).Value Like "*&donnees.Cell(i,u)&*" Then
 
                        pays.Select
                            With Selection.ShapeRange.Fill
                            .ForeColor.RGB = RGB(R(k), G(k), B(k))
                            .Visible = msoTrue
                            .Solid
                            '.BackColor.RGB = RGB(Rp(k), Gp(k), Bp(k))
                            '.pattern = pattern
                            End With
 
                       z = False
                End If
 
            Next k
 
                If z = True Then
                            With Selection.ShapeRange.Fill
                            .ForeColor.RGB = RGB(R(k), G(k), B(k))
                            .Visible = msoTrue
                            .Solid
                            '.BackColor.RGB = RGB(Rp(k), Gp(k), Bp(k))
                            '.pattern = pattern
                            End With
                End If
        End If
 
    z = True
    Next i
 
 
 
Next pays
 
 
 
 
 
 
 
 
End Sub
 
 
 
 
Sub limpacarta()
 
'tout pays en blanc
 
Dim carte As Worksheet
Set carte = Worksheets("carte")
 
carte.Select
 
For Each pays In carte.Shapes
 
pays.Select
Selection.ShapeRange.Fill.ForeColor.SchemeColor = 1
Selection.ShapeRange.Fill.Visible = msoTrue
Selection.ShapeRange.Fill.Solid
 
Next pays
 
End Sub
Comme il s'agit d'une macro que l'on m'a fourni, certains points me restent obscurs : par exemple, je ne vois pas vraiment à quoi sert le booléen, si ce n'est à faire sortir de la boucle en for...

Merci pour les coups de pouce que je pourrais recevoir de votre part