Fonction si.multiple ou autre
Bonjour,
avec qq commentaires pour t'aider :
Function noteStandard(tranche As String, item As String, note, Optional percentile As Boolean = False)
Dim c As Range, datas, percent, lig As Long, tmp, sepDec As String, dercol As Range
sepDec = Application.International(xlDecimalSeparator)
'contrôles paramètres
If tranche = "" Or item = "" Or IsEmpty(note) Then noteStandard = "": Exit Function
If Not IsNumeric(note) Then noteStandard = "": Exit Function
note = Val(note)
If note < 0 Or note > 99 Then noteStandard = "": Exit Function
' modif item, si "(" trouvé on prend ce qui est à gauche
tmp = InStr(item, "(")
If tmp > 0 Then item = Left(item, tmp - 2)
' recherche tranche (nom du tableau) en A
Set c = Sheets("Note standard").Columns(1).Find(tranche, , xlValues, xlWhole)
' recup percentiles dans tableau
percent = c.End(xlToRight).Offset(1).Resize(19).Value
' recherche item dans ligne tranche (nom du tableau), c'est dans cette colonne qu'il faudra rechercher la note
Set c = c.EntireRow.Find(item, , xlValues, xlWhole)
If c Is Nothing Then noteStandard = "ano.": Exit Function
' recup notes brutes dans tableau datas
datas = c.Offset(1).Resize(19).Value
If tmp = 0 Then
' on raccourci l'item si les 2 caractères de gauche correspondent
' pour limiter le nombre de cas
Select Case LCase(Left(item, 2))
Case "dm", "va", "eq"
item = LCase(Left(item, 2))
End Select
End If
Select Case item
' selon l'item
'cas 1 : recherche ligne note dans notes croissantes
Case "dm"
For lig = 1 To UBound(datas)
If note = Val(datas(lig, 1)) Then
noteStandard = 20 - lig
ElseIf InStr(datas(lig, 1), "-") > 0 And datas(lig, 1) <> "-" Then
' découpe tranche de notes x-y
tmp = Split(datas(lig, 1), "-")
If note <= CLng(tmp(1)) Then noteStandard = 20 - lig
End If
If Not IsEmpty(noteStandard) Then Exit Function ' la note a été trouvée, on sort
Next lig
If IsEmpty(noteStandard) Then noteStandard = 1
' cas 2 : recherche ligne note dans notes décroissantes
Case "va", "eq", "Dextérité manuelle", "Viser et attraper", "Equilibre", "Percentile"
For lig = 1 To UBound(datas)
If note = Val(datas(lig, 1)) Then
If percentile Then
noteStandard = CDbl(Replace(percent(lig, 1), ",", "."))
Else
noteStandard = 20 - lig
End If
ElseIf InStr(datas(lig, 1), "-") > 0 And datas(lig, 1) <> "-" Then
' découpe tranche de notes x-y
tmp = Split(datas(lig, 1), "-")
If note >= CLng(tmp(0)) Then
If percentile Then
noteStandard = CDbl(Replace(percent(lig, 1), ",", "."))
Else
noteStandard = 20 - lig
End If
End If
End If
If Not IsEmpty(noteStandard) Then Exit Function ' la note a été trouvée, on sort
Next lig
Case Else
noteStandard = ""
End Select
End Functioneric
Bonjour Eric,
Merci pour toutes ces explications, j’y vois un peu plus clair mais je crois que je vais quand même devoir apprendre un peu plus ce language.. Je sais pas trop dans quoi je me suis lancé, je connais un peu le code en automatique mais me sent un peu larguer la
J’ai rempli tous les tableaux, fait quelques test et encore fais quelques motifs (légère il me semble, cependant ça ne fonctionne pas comme je le pensais..).
Le fichier sera joint en pièce jointe de ce message.
Motif faites :
-j’ai séparer les tableau en trois groupes (3 à 6, 7 à 10 et 11 à 16), ils sont en couleurs différentes dans l’onglet « note standard »
-certain code d’item changent un peu, j’ai essayé de reprendre les même formule que toi mais en vainc.. le principe reste le même, cependant dans l’onglet 7 à 10 et 11 à 16 il y a une colonne de plus à prendre en compte.. Peut tu m’éclairer sur ce point?
Motif à venir :
-un fois les tableaux finis et fonctionnel, je vais modifier toutes les notations « dm1.1, dm1,2, … », cela va t il poser problème?
Motifs optionnels à venir :
-(valable pour les trois tableaux)
-pour DM1, si d5 ou d6 est égal à « E », alors en e5 seule la note présente sera reporté. Si d5 et d6 ont les deux « E », alors en e5 sera marqué « 1 »
-même principe pour DM2 et DM3, si « E » marqué en colonne C, alors la note standard en colonne D sera « 1 »
-pour la note finale du test, en bas des collines D, mettre un fond de couleur de cellules, de 0 à 61 inclus, afficher en rouge, de 62 à 71 inclus afficher en orange, et au dessus de 71 en vert
Problème actuel :
-J’ai rentré dans les 3 tableaux de notation (colonne C) des valeurs qui sont cohérentes et qui devrait donner des résultats correspondant à ceux des tableaux. J’ai fait un petit test et par exemple pour le tableau 3 à 6 ans, si D16 est à 100 rien ne s’affiche en H et I 16, cependant si par exemple il est à 99 cela fonctionne.. (j’ai cru lire dans ta macro des <0 et >99, cela pourrait venir de ça?)
-Au niveaux des percentiles, les valeurs décimales ne s’affiches pas comme tu me l’avait expliqué, cependant plutôt que de le calculé vis à vis des notes des items, ne peut on pas affiché ce numéro en mode texte, comme quoi si la note standard est de 18, alors le texte « 99,9 » s’affiche? Cela m'éviterais les erreurs de type "#valeurs"
Merci d’avance à toi pour ton aide,
Bien à toi,
Damien
Bonjour,
Une macro est très rigide. Si elle doit trouver "toto" en D5 et que tu lui passes "tata" ou que tu as déplacé la cellule ça ne fonctionne plus. Il faut l'adapter.
-j’ai séparer les tableau en trois groupes (3 à 6, 7 à 10 et 11 à 16), ils sont en couleurs différentes dans l’onglet « note standard »
tu peux mettre autant de tableaux que tu veux, le tout est de bien respecter les libellés : identique dans le paramètre passé à la fonction que dans la colonne A qu'elle puisse le retrouver.
Motif à venir :
-un fois les tableaux finis et fonctionnel, je vais modifier toutes les notations « dm1.1, dm1,2, … », cela va t il poser problème?
La macro s'attend à trouver soit une note unique 12, soit une tranche notée ainsi 13-15.
Tout autre chose la plantera.
Si tu parlais des libellés, même principe, ils doivent être strictement identiques da part et d'autres. Tu peux en mettre autant que tu veux.
d5 ou d6 = E ??? rien comprisMotifs optionnels à venir :
- (valable pour les trois tableaux)
- pour DM1, si d5 ou d6 est égal à « E », alors en e5 seule la note présente sera reporté. Si d5 et d6 ont les deux « E », alors en e5 sera marqué « 1 »
- même principe pour DM2 et DM3, si « E » marqué en colonne C, alors la note standard en colonne D sera « 1 »
-pour la note finale du test, en bas des collines D, mettre un fond de couleur de cellules, de 0 à 61 inclus, afficher en rouge, de 62 à 71 inclus afficher en orange, et au dessus de 71 en vert
une fonction retourne une valeur et c'est tout. En aucun cas elle change son environnement.
Mettre une MFC (mise en forme conditionnelle).
j’ai cru lire dans ta macro des <0 et >99, cela pourrait venir de ça?
C'est ça. Au début c'était la limite de tes notes. Oublié lorsque tu as ajoutés les nouveaux tableaux.
Quand tu as un doute tu peux mettre la ligne de code en commentaire en mettant une apostrophe ' en début de ligne.
Tu testes, et au bout d'un moment quand tu es bien sûr, tu peux supprimer la ligne.
J'ai écris la fonction qu'elle soit plus simple et un peu plus courte.
Peut-être plus facile à comprendre :
Function noteStandard(tranche As String, item As String, note, Optional percentile As Boolean = False)
Dim c As Range, datas, percent, lig As Long, tmp, sepDec As String, dercol As Range
Dim debut As Long, fin As Long, pas As Long, v As Long
sepDec = Application.International(xlDecimalSeparator)
If tranche = "" Or item = "" Or IsEmpty(note) Then noteStandard = "": Exit Function
If Not IsNumeric(note) Then noteStandard = "": Exit Function
note = Val(note)
' If note < 0 Or note > 99 Then noteStandard = "": Exit Function
tmp = InStr(item, "(")
If tmp > 0 Then item = Left(item, tmp - 2)
Set c = Sheets("Note standard").Columns(1).Find(tranche, , xlValues, xlWhole)
percent = c.End(xlToRight).Offset(1).Resize(19).Value
Set c = c.EntireRow.Find(item, , xlValues, xlWhole)
If c Is Nothing Then noteStandard = "ano.": Exit Function
datas = c.Offset(1).Resize(19).Value
If tmp = 0 Then
Select Case LCase(Left(item, 2))
Case "dm", "va", "eq"
item = LCase(Left(item, 2))
End Select
End If
Select Case item
Case "dm"
' notes croissantes
debut = 1: fin = UBound(datas): pas = 1
Case "va", "eq", "Dextérité manuelle", "Viser et attraper", "Equilibre", "Percentile" ' notes dŽcroissantes
' notes décroissantes
debut = UBound(datas): fin = 1: pas = -1
End Select
For lig = debut To fin Step pas
If datas(lig, 1) <> "-" Then
If InStr(datas(lig, 1), "-") > 0 Then ' tranche
v = Val(Split(datas(lig, 1), "-")(1)) ' borne supérieure tranche
Else
v = Val(datas(lig, 1))
End If
If lig = fin Then note = v ' note = note maxi
If note <= v Then
If percentile Then
noteStandard = CDbl(Replace(percent(lig, 1), ",", "."))
Else
noteStandard = 20 - lig
End If
Exit Function
End If
End If
Next lig
If IsEmpty(noteStandard) Then noteStandard = "?"
End Functioneric
Bonjour Eric,
Je me répète, mais merci beaucoup pour ton nouveau code et tes explications, j'ai pu me plonger dedans et comprendre de quoi il en était. Je t'avoue que ça m'a donné envie de plus me plonger dedans et apprendre ce nouveau langage
Ducoup j'ai renommer tout mes libellés, dsl de ne pas avoir employé le bon terme. Et cela fonctionne parfaitement!
J'ai fait une modification dans ta ligne en rajoutant un "E"
If Not IsNumeric(note) Then noteStandard = "E": Exit Function
Cela correspond sur mon test à un échec
La ou je bloque, c'est que concrètement dans la parti DM1, si les deux ont un résultats, alors la note sera la somme des deux divisé par deux. Si il y à un échec noté "E"(en colonne C), "E" sera reporté en colonne D et alors la note standard en colonne "E" sera égal à la seule note qui sera noté sur les deux. Si les deux ont E, alors la note standard en colonne E sera de 1.
Si tu as une piste je suis preneur (en macro ou fonction).
Pour les percentiles en colonne I, j'y suis allé à la "bourrin", avec une formule si multiple :
"=SI.MULTIPLE(H6;1;0,1;2;0,5;3;1;4;2;5;5;6;9;7;16;8;25;9;37;10;50;11;63;12;75;13;84;14;91;15;95;16;98;17;99;18;99,5;19;99,9)"
Au moins je suis sur d'avoir les bons résultats avec la décimale.
J'ai aussi fait la mise en forme conditionnel pour la couleur, un peu différemment mais cela fonctionne bien.
Je touche enfin au but, et ce grâce à toi, encore merci !
Damien
Toujours pas bien compris ton histoire de E.
Si pour avoir "E" en D6 il faut avoir "E" en C6 et bien tu le reportes.
Ta formule en D devient =SI(C6="E";"E";noteStandard($B$1;B6;C6))
Et comme somme() ne tient pas compte des chaine tu auras bien ta note restante /2 en E5
Regarde le menu en haut du site, tu as un cours VBA pour débutants
eric
Pour mètre le "E" en D il n'y a pas de souci, ce que je cherche c'est une formule pour la colonne E. Je voudrais que si D1="E" et D2=un nombre, alors le résultat en colonne E sera le nombre de D2. Si D1=un nombre et D2="E", alors le résultat en colonne E sera le nombre de D1. Si D1 et D2 sont égal à "E", alors le résultat en colonne E sera "E". Et si D1=un nombre et D2=un nombre, alors le résultat en colonne E sera la somme de D1+D2/2.
J'espère avoir été "assez clair", même si cela reste difficile à expliquer.
Merci à toi,
damien
Bonjour,
Heuuu, tu ne sais pas faire 2-3 si() imbriqués ?
Ca fait partie des bases à connaitre
eric
Merci Erie pour ta réponse, tu as mis mon égo à mal
J'ai passé un peu de temps a essayé de formuler ça au mieux mais j'ai rarement utilisé autant d'imbriquer de formules que la..
En code automate j'aurais fais ça les deux doigts dans le
Au mieux j'ai une formule dans ce genre la mais qui ne mène à rien
=SI(SI(D5="E";N5=D6)*OU(SI(D6="E";N5=D5))*OU(SI(ET(D5;D6)="E";N5="E"));;N5=SOMME((D5:D6)/2))
(Sachant que je suis en cellule N5 à la place de la E5 pour faire mes tests dans trop bidouiller la formule originale)
Je chauffe ou bien je suis vraiment loin du but final?
Merci d'avance
Edit :
En moins capharnaüm j'ai aussi cette formule mais qui ne marche pas non plus :/
=SI(D5="E";E5=D6;SI(D6="E";E5=D5;SI(ET(D5:D6)="E";E5="E";E5=(SOMME(D5;D6)/2))))
Edit 2 :
J'ai trouvé!
Cependant cette formule ne marche pas dans une cellule fusionné, aurait tu une explication à ce sujet?
=SI(D5="E";D6;SI(D6="E";D5;SI(D5:D6="E";"E";SOMME(D5:D6)/2)))
Bonjour,
si j'ai bien compris tes explications je mettrai :
=SI(D5&D6="EE";"E";SOMME(D5;D6)/NB(D5:D6))"E" ou 1 car tes explications fluctues...
eric
Bonjour Eric,
Désoler je n'ai pas eu beaucoup de temps libre ces derniers temps.. Mais promis je ne t'avais pas oublié
Merci pour ta formule, elle s'intégrèrent parfaitement, et j'ai pour ainsi dire pu finir mon fichier et le rendre opérationnel, chose que je n'aurait jamais pu faire sans ton aide!
Je peut donc passé à autre chose et commencé mes cours vba tranquillement!
Encore un GRAND MERCI à toi pour ta réactivité et ton aide précieuse!
Bonne continuation,
bien à toi.
Damien