Recherche / Index / Equiv ou autre fonction ?
Bonjour à tous,
Voici mon problème :
Dans le fichier joint, sur la ligne 3 (Onglet saisie produits), je cherche à reporter en colonne AZ3, une croix ou rien en fonction des mentions de danger saisies dans les colonnes I3:AB3 et en fonction de la matrice qui se trouve dans l'onglet Mentions danger.
J'ai essayé d'utiliser la fonction Index/Equiv mais ça ne marche que pour une cellule (I3, dans l'exemple). Comment je peux faire pour la ligne entière (I3:AB3).
L'utilisation de la fonction SI est trop longue pour Excel, d'où ma demande sur ce forum.
Merci d'avance
Pascale
Bonjour Pascale, bonjour le forum,
Une solution VBA pourrait-elle te convenir ?
J'ai commencé par faire un copier/coller des mentions de l'onglet Mentions danger vers l'onglet Saisie produits car sinon ni les formules ni le VBA ne fonctionnent...
Ensuite le code :
Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Saisie produits)
Dim OM As Worksheet 'déclare la variable OM (Onglet Mentions danger)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim R As Variant 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim K As Byte 'déclare la variable K (incrément)
Dim COL As Integer 'déclare la variable COL (COLonne)
Set OS = Worksheets("Saisie produits") 'définit l'onglet OS
Set OM = Worksheets("Mentions danger") 'définit l'onglet OM
DL = OS.Cells(Application.Rows.Count, "A").End(xlUp).Row 'de'finit la dernière ligne éditée DL de la colonne A de l'onglet OS
TV = OS.Range("A1:BC" & DL).CurrentRegion 'définit le tableau des valeurs TV
For I = 3 To DL 'boucle 1 : sur touts les lignes éditée I du tableau des valeurs (en partant de la 3ème)
For J = 9 To 28 'boucle 2 : sur les colonne 9 à 28 (=> colonnes I à AB)
If TV(I, J) <> "" Then 'condition 1 : si la donnée ligne I colonne J de TV n'est pas vide
'définit la recherche R (Recherche la valeur exacte de la donnée ligne I colonne J de TV dans la colonne 1 de l'onglet OM)
Set R = OM.Columns(1).Find(TV(I, J), , xlValues, xlWhole)
If Not R Is Nothing Then LI = R.Row Else Exit For 'si au moins une occurrence est trouvée définit la ligne LI sinon sort de la boucle 2
Set R = Nothing 'vide la variable R
For K = 2 To 28 'boucle 3 : sur les colonne 2 à 28 (=> colonne B à AB)
If OM.Cells(LI, K).Value = "X" Then 'condition 2 : si la cellule ligne LI colonne K de l'onglet OM est égale à "X"
Set R = OS.Rows(2).Find(OM.Cells(2, K).Value, , xlValues, xlWhole) 'définit la recherche R (recherche la mention correspondante dans la ligne 2 de l'onglet OS)
'si au moins une occurrence est trouvée, écrit "X" dans la cellule ligne = I, colonne = colonne de l'occurrence trouvée de l'onglet OS, sinon sort de la boucle 2
If Not R Is Nothing Then OS.Cells(I, R.Column).Value = "X" Else Exit For
End If 'fin de la condition 2
Next K 'prochaine colonne de la boucle 3
End If 'fin de la condition 1
Next J 'prochaine colonne de la boucle 2
Next I 'prochaine ligne de la boucle 1
End SubBonjour,
voici un exemple pour les colonnes de I à N
exp plage nommée --> réf: ='Mentions danger'!$Y$3:$Y$108
mt plage nommée --> réf: ='Mentions danger'!$A$3:$A$108
=SI(SOMMEPROD((exp="x")*((mt=I3)+(mt=J3)+(mt=K3)+(mt=L3)+(mt=M3)+(mt=N3)))>0;"X";"")il reste à modifier la formule pour ajouter les conditions pour les colonne de O à AB
Un grand merci à I20100 pour votre solution. Cela fonctionne très bien. Je vais enfin pouvoir avancer !
Un grand merci aussi à ThauThème pour votre solution. Je ne suis pas très calée en VBA mais je la garde sous le coude au cas où
Bonne journée