OK c'est bon j'ai compris...
C'est mon "l=1" qui fout le bordel, vu qu'il est suivi d'un "next l"
Donc finalement si tu fais le raisonnement pas à pas, tu comprends vite que pour toutes les cellules juste à droite d'une grise, on n'a pas testé le premier lieu...
La solution : l=0
Ton code modifié :
Sub colorie()
Application.ScreenUpdating = False
Dim i As Integer, j As Integer
Dim k As Byte, l As Byte
Dim maxi As Integer, maxj As Integer
Dim cel As Range
maxi = [M25].End(xlDown).Row
maxj = [P21].End(xlToRight).Column
' on efface la couleur de toutes les cellules
Range("Q26", Cells(maxi, maxj)).Interior.ColorIndex = xlNone
' on colorie en bleu les intersections de produits dont les lieux correspondent
For i = 26 To maxi
For j = 17 To maxj
For k = 1 To 8
For l = 1 To 8
If Cells(i, k) = Cells(j + 9, l) And Cells(i, k) <> "" Then
Cells(i, j).Interior.ColorIndex = 8
j = j + 1
k = 1
l = 0
End If
Next l
Next k
Next j
Next i
' on colorie en gris toutes les cellules non bleues, et on enlève la couleur des bleues
For Each cel In Range("Q26", Cells(maxi, maxj))
If cel.Interior.ColorIndex <> 8 Then
cel.Interior.ColorIndex = 15
ElseIf Not cel.Value = "rien" Then
cel.Interior.ColorIndex = xlNone
End If
Next cel
End Sub
Jai modifié pour effacer les couleurs en début de macro, au cas où il y aurait eu des modifs de lieu quand tu relances la macro.
Et aussi pour garder les "rien" en bleu, comme ça tu peux enlever ta MFC (que sinon tu dois copier en cas d'ajout de produit nouveau)
Amicalement,
Sylvain