La logique est bonne. Si tu veux placer une variable dans ta formule, utilise une formule contenant des références absolues.
Avec ton ancienne formule, l'enregistreur de macro donnait :
Range("J21").Select
ActiveCell.FormulaR1C1 = _
"=INDEX(Produit!R[-18]C[-9]:R[181]C[4],MATCH(R[-6]C[-9],Produit!R[-18]C[-9]:R[181]C[-9],0),3)"
Note la partie : MATCH(R[-6]C[-9]
En fait le -6 signifie qu'il situera ta cellule 6 ligne au-dessus. Le -9 situera ta colonne 9 colonnes à gauche. Comme tu mets la formule en J21, le R[-6]C[-9] équivaudra donc à la cellule se trouvant ligne 21-6=15 et colonne J-9=A => A15
Tout ça pour dire que mettre une variable devient possible avec la formule suivante (qui contient une référence absolue) :
=INDEX(Produit!A3:N202;EQUIV($A$15;Produit!A3:A202;0);3)
Donc un petit coup d'enregistreur de macro et j'obtiens :
Range("J21").Select
ActiveCell.FormulaR1C1 = _
"=INDEX(Produit!R[-18]C[-9]:R[181]C[4],MATCH(R15C1,Produit!R[-18]C[-9]:R[181]C[-9],0),3)"
Avec une variable, ça donne :
Range("J21").Select
ActiveCell.FormulaR1C1 = _
"=INDEX(Produit!R[-18]C[-9]:R[181]C[4],MATCH(R" & NumeroLigneEffacer & "C1,Produit!R[-18]C[-9]:R[181]C[-9],0),3)"
C'est un peu plus clair ? Ça fait peut-être beaucoup d'infos à emmagasiner en même temps mais ça devrait te permettre de mieux cerner le problème.