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 Function

eric

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.

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 »
d5 ou d6 = E ??? rien compris

-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 Function

eric

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 mais la je sèche..

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

Rechercher des sujets similaires à "fonction multiple"