Excel Fonctions SI + OU
Je cherche à faire une formule qui soit du type:
Si cellule O4 contient mot1 ou mot2 ou mot3 alors afficher resultat1
sinon
si cellule O4 contient mot5 ou mot6 ou mot7 alors afficher resultat2
sinon
si cellule O4 contient mot9 ou mot10 ou mot11 alors afficher resultat3
sinon afficher "a vérifier"
Merci beaucoup de votre aide
J'ai cherché par moi meme mais je galère !!
(excel 2007 FRANCAIS)
30 réponses
Le problème décrit vise une formule Excel 2007 (FR) qui, dans O4, détecte si le contenu correspond à mot1/mot2/mot3 pour afficher resultat1, sinon si mot5/mot6/mot7 → resultat2, sinon si mot9/mot10/mot11 → resultat3, autrement "à vérifier". Une solution proposée prévoit une chaîne SI imbriquée avec OU pour vérifier chaque liste et renvoyer le résultat correspondant. Des alternatives plus flexibles incluent une macro VBA qui parcourt un tableau de critères sur une feuille et assigne les résultats, ou une approche par table de correspondance sur une feuille séparée avec une recherche, avec gestion éventuelle de la casse. Des conseils complémentaires recommandent d’uniformiser les textes en majuscules pour éviter les écarts et de clarifier le tableau de critères pour la maintenance.
-
Bonjour,
ta formule :
=si(Ou(O4="mot1";O4="mot2";O4="mot3")=vrai;"resultat1";si(Ou(O4="mot5";O4="mot6";O4="mot7")=vrai;"resultat1";si(ou(O4="mot9";O4="mot10";O4="mot11")=vrai;"resultat1";"a verifier"))) -
normalement, j'ai fait les modifs pour que si ta colonne A est vide, ca fonctionne.
Ce n'est pas le cas? -
Bonjour,
il manque une ligne en fait :
Sub cherche()
i = 2
Do While Cells(i, 15) <> "" 'va balayer ta colonne O
b = 2
Do While Sheets("cherche").Cells(b, 4) <> "" 'va balayer la feuille cherche, modifie cherche par ton nom de feuille si tu le modifies
If Sheets("cherche").Cells(b, 1) = "" Then
a=1
else
a = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 1) & "*")
end if
If Sheets("cherche").Cells(b, 2) = "" Then
If a >= 1 Then
Cells(i, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
Else
If Sheets("cherche").Cells(b, 3) = "" Then
c = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 2) & "*")
If a >= 1 And c >= 1 Then
Cells(a, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
end if
d = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 3) & "*")
If a >= 1 And c >= 1 And d >= 1 Then
Cells(a, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
End If
End If
b = b + 1
Loop
i = i + 1
Loop
End Sub -
Contributeurre,
ci joint
https://www.cjoint.com/?3cqsNZlmITe
pas trop de dégats à la macro avec mon système de blocs "règle de gestion" et quelques surprises à la sensibilité à la casse j'ai donc tout mis en Ucase(forcage en majuscules)
en rouge italique les discordances qui sauf erreur de ma part (ca, je sais faire)
viennent de "manques" dans la feuille dite "cherche"
a noter une faute de frappe (ligne 398) qui cause un "other": "de f" au lieu de "def" -
tu rajoutes then derière la ligne que je t'aif aite modifiée
if ... then -
pardon, erreur d'écriture,
remplace if Sheets("cherche").Cells(b, 1) & "*") =""
par if Sheets("cherche").Cells(b, 1) =""-
-
Coucou Mélanie,
J'ai fait les modifs que tu as indiqué ci dessus Mais (!) du coup, ça donne toutes les lignes avec KCI comme résultats !!
Voila la formule telle que je l'ai modifiée avec ton aide:
Sub cherche()
i = 2
Do While Cells(i, 15) <> "" 'va balayer ta colonne O
b = 2
Do While Sheets("cherche").Cells(b, 4) <> "" 'va balayer la feuille cherche, modifie cherche par ton nom de feuille si tu le modifies
If Sheets("cherche").Cells(b, 2) = "" Then
If a >= 1 Then
Cells(i, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
Else
If Sheets("cherche").Cells(b, 3) = "" Then
c = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 2) & "*")
If Sheets("cherche").Cells(b, 1) = "" Then
a = 1
End If
If a >= 1 And c >= 1 Then
Cells(a, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
Else
If Sheets("cherche").Cells(b, 1) = "" Then
a = 1
End If
d = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 3) & "*")
If a >= 1 And c >= 1 And d >= 1 Then
Cells(a, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
End If
End If
b = b + 1
Loop
i = i + 1
Loop
End Sub
Merci !!
-
-
Re,
copies et colls cette macro à la place de l'autre :
Sub cherche()
i = 2
Do While Cells(i, 15) <> "" 'va balayer ta colonne O
b = 2
Do While Sheets("cherche").Cells(b, 4) <> "" 'va balayer la feuille cherche, modifie cherche par ton nom de feuille si tu le modifies
If Sheets("cherche").Cells(b, 2) = "" Then
If a >= 1 Then
Cells(i, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
Else
If Sheets("cherche").Cells(b, 3) = "" Then
c = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 2) & "*")
if Sheets("cherche").Cells(b, 1) & "*") =""
a=1
end if
If a >= 1 And c >= 1 Then
Cells(a, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
Else
if Sheets("cherche").Cells(b, 1) & "*") =""
a=1
end if
d = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 3) & "*")
If a >= 1 And c >= 1 And d >= 1 Then
Cells(a, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
End If
End If
b = b + 1
Loop
i = i + 1
Loop
End Sub -
ContributeurMerci pour ce silence dédaigneux...
j'ai encore perdu mon temps à essayer d'aider-
Hello Michel, rien de tel !
Simplement, la pièce jointe que je télécharge via ton lien ne fournie pas un fichier excel mais un fichier zip très bizarre qui, j'ai l'impression, ne contient rien me concernant...
C'est la raison pour laquelle je n'ai pas encore relevé ton message.
Mais peut etre que ça vient de moi ...
Merci en tout cas ! -
ContributeurJe ne t'ai pas envoyé un fichier zip !!!!
mais un fichier Excel 2007 comportant une macro...
Le minimum aurait été de le signaler Le + tôt possible car peut-être est tu sous XL<2007
voici la macro:1 ou 2 modifs (dernière ligne col U au lieu de K)
et adjonction de commentaires montrant la modélisation rapide des objets à traiter , regroupement en bloc des règles de gestion...
ce pour faciliter la maintenance et/ou une évolution
Tu en fait ce que tu veux....
Option Explicit Sub apprecier() Dim derlig As Integer Dim T_model, T_in, T_out Dim c_in As Integer, c_m As Integer Dim cond1 As Boolean, cond2 As Boolean, cond3 As Boolean '-----------------MODELISATION OBJETS A TRAITER With Sheets(2) derlig = .Range("D1000").End(xlUp).Row T_model = .Range("A2:D" & derlig) End With With Sheets(1) derlig = .Range("K1000").End(xlUp).Row T_in = .Range("K2:O" & derlig) ReDim T_out(1 To derlig - 1) End With '-------ANALYSE For c_in = 1 To UBound(T_in) For c_m = 1 To UBound(T_model) ' -----gestion des conditions ' règle de gestion: si telle cellule feuille1colonne XXX est égale ou ressemble (like) à feuille2;celluleYYY ou la cellule feuille2 est vide==>VRAI cond1 = (UCase(T_in(c_in, 5)) Like "*" & UCase(T_model(c_m, 1)) & "*") Or IsEmpty(T_model(c_m, 1)) 'colonneO cond2 = (T_in(c_in, 1) = T_model(c_m, 2)) Or IsEmpty(T_model(c_m, 2)) 'colonne L cond3 = (T_in(c_in, 2) = T_model(c_m, 3)) Or IsEmpty(T_model(c_m, 3)) 'colonne K 'si les 3 sont vraies alors tableau de sortie= analysis correspondant If cond1 And cond2 And cond3 Then T_out(c_in) = T_model(c_m, 4) End If Next c_m 'cas non trouvé If IsEmpty(T_out(c_in)) Then T_out(c_in) = "OTHER" Next c_in '------RESTITUTION PROVISOIRE COL W Application.ScreenUpdating = False Range("W2").Resize(UBound(T_out), 1) = Application.Transpose(T_out) End Sub
edit: modifié colonnes dans modélisation -
-
Hello,
Plusieurs commentaires:
ligne 150 par exemple, ça devrait afficher KCI (car la cellule O contien KCI) hors ça affiche collect issue. (idem ligne 365 ça affiche Delivery issue au lieu de KCI)
Est ce que ta "formule VBA" est liée a la feuille "cherche" comme Melanie, ou bien estce que tout est à partir de ta formule ?
Merci de tes commentaires! -
-
-
HEllo Mélanie,
Je confirme que pour les lignes 27 et 28 les conditions sont uniquement colonnes K et L et quelque soit le contenue O :)
Merci beaucoup ! -
Re,
je sias pourquoi.
A la ligne 27 et 28 de la feuille cherche, tu n'as rien mis en colonne A. Ce qu'il fait que ma macro s'arrête à la 26 ème ligne.
De plus, si les lignes 27 et 28 sont vides, je dois revoir le fonctionnement de ma macro.
Peux-tu me confirmer que ces lignes de la feuille cherche doivent bien êtrevides? -
C'est génial, merci beaucoup à tous les deux !!
-
ContributeurRe à tous
A la bourre, mais d'autres occupations...
Ci joint maquette
http://www.cijoint.fr/cjlink.php?file=cj201102/cijevmL3b5.xlsm
J'ai réuni les 2 feuilles dans un seul classeur pour faciliter l'étude on pourra le faire sans grosse difficulté (utilisation de variables tableaux) si tu le désires mais...
la restitution se fait conne W pour comparer avec l'original: il y a quelques discordances que je vais regarder...
Michel -
Pour l'instant, ma macro copie les resultats dans la colonne à droite que tu as mise en jaune.
Si ca te convient :
remplaces partout :
cells(i,22) par cells(i,21).-
Coucou !!
Merci beaucoup !!
J'ai encore une question, j'ai ajouté des lignes du coté des conditions comme du côté du fichier principal mais par exemple, je n'ai aucune "Delivery issue" ni "Collecte issue" (40 réponses normalement juste pour Collecte issue).
Voila le fichier !
http://www.cijoint.fr/cjlink.php?file=cj201102/cij3oFuxPt.xls
Merci beaucoup !!
-
-
Bonjour,
J'ai posé ce fichier :
http://www.cijoint.fr/cjlink.php?file=cj201102/cijKPWNZWa.xls
Il contient une macro.
Pour marcher :
tu dois mettre une feuille chercher. tu peux modifier le nom, il faudra alors modifier la macro. Pour cela, Outils, macro, vba :
Sub cherche()
i = 2
Do While Cells(i, 15) <> "" 'va balayer ta colonne O
b = 2
Do While Sheets("cherche").Cells(b, 1) <> "" 'va balayer la feuille cherche, modifie cherche par ton nom de feuille si tu le modifies
a = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 1) & "*")
If Sheets("cherche").Cells(b, 2) = "" Then
If a >= 1 Then
Cells(i, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
Else
If Sheets("cherche").Cells(b, 3) = "" Then
c = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 2) & "*")
If a >= 1 And c >= 1 Then
Cells(a, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
Else
d = Application.WorksheetFunction.CountIf(Cells(i, 15), "*" & Sheets("cherche").Cells(b, 3) & "*")
If a >= 1 And c >= 1 And d >= 1 Then
Cells(a, 22) = Sheets("cherche").Cells(b, 4)
b = 1000
End If
End If
End If
b = b + 1
Loop
i = i + 1
Loop
End Sub -
Hello Michel et merci de t'interresser à mon problème !
Pour répondre à ta question: dans le post ou je donne les 2 liens vers pièces jointes: lorsque dans le fichier avec les conditions, si plusieurs colonnes sont remplies, (et seulement dans ce cas) il faut que s'affiche le résultat lié.
Exemple:
&SI(ET(NB.SI(O3;"*sh*")>1;K3="RCV/HOLD/REPAIRED")=VRAI;"shortage at repair Line";"")
Sauf que dans le cas de la formule ci dessous, elle ne fonctionne pas, je ne sais pas pourquoi (peut être que je ne l'ai pas insérée correctement dans la formule globale ci dessou).
Pour essaye de contrer les limites d'excel j'ai concaténé les formules au lieu de les imbriquer (mais j'ai peut etre fait des erreurs aussi, n'hésitez pas à les pointer du doigt !!)
=SI(NB.SI(O3;"*kci*");"KCI";"")&SI(NB.SI(O3;"*NTF* ");"NTF";"")&SI(NB.SI(O3;"*ano*")+NB.SI(O3;"*misma tch*")>0;"Anomaly at Repair Line";"")&SI(NB.SI(O3;"*cab*")+NB.SI(O3;"*misuse*" )+NB.SI(O3;"*quote*")+NB.SI(O3;"*trade*")+NB.SI(O3 ;"*mr*")>0;"misuse";"")&SI(NB.SI(O3;"*def*")>0;"De fective Collect";"")&SI(NB.SI(O3;"*short*")+NB.SI(O3;"*ets *")+NB.SI(O3;"*reactive*")+NB.SI(O3;"*delay*")+NB. SI(O3;"*eta*")>0;"Shortage at Repair Line";"")&SI(ET(NB.SI(O3;"*sh*")>1;K3="RCV/HOLD/REPAIRED")=VRAI;"shortage at repair Line";"")&SI(NB.SI(O3;"*complaint*")+NB.SI(O3;"*eq uivalence*")+NB.SI(O3;"*buyback*")+NB.SI(O3;"*elev ation*")+NB.SI(O3;"*compensation*")+NB.SI(O3;"*cpl t*")+NB.SI(O3;"*esca*")>0;"Complaints";"")
Par ailleurs il manque à la fin: si, rien de toutes les conditions indiquées: alors marquer "a vérifier manuellement" (par exemple).
coté VBA, je suis aussi évidemment preneur !!
Encore merci à vous !! -
Pour l'isntant, non, je n'ai pas pu travailler sur ton fichier.
Je pense que je ne pourrais pas avant demain.-
-
ContributeurBonjour,
Excusez encore 1 fois l'incruste
j'essaie du VBA pour résoudre ton pb
dans ton tableau des conditions, s'agit-il de "OU" ou de "ET"
en effet
dans le post 24
tout ce qui est en statut trans et avec la lettre H colonne L doivent mentionner Collect issue)
dans tes premiers post, tu parles de telle condition OU telle condition?
c'est important pour l'algo
petit détail traduction de "à vérifier" en anglais ?
-
-
Est ce que tu as un feedback ?
Merci d'avance :) -
http://www.cijoint.fr/cjlink.php?file=cj201102/cijMuIUDHP.xlsx
http://www.cijoint.fr/cjlink.php?file=cj201102/cijQIPlomt.xlsx
Voila les fichiers, dans l'un il ya le fichier dans lequel je dois travailler, un peu différent et plus complet que précédemment. (la formule est la pour remplir la colonne U, qui est remplie pour l'exemple)
Dans l'autre fichier, c'est les éléments a faire apparaitre avec les différentes conditions sinnéquanonnes.
Certaines cases sont vides, sous entendu aucune autre condition
(exemple ligne 27: tout ce qui est en statut trans et avec la lettre H colonne L doivent mentionner Collect issue)
Merciiii Mélanie !! -
c faisable?
-
Reprends ton fichier et dans une autre feuille, mets moi le tableau suivant:
colonne a : tes mots recherchés
colonne b : ce qu'il doit t'afficher
- 1
- 2