Fonction

ced5757 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   -  
ccm81 Messages postés 11033 Statut Membre -
Bonjour,

J'ai créé une fonction ci dessous: mais elle ne fonctionne pas comme je le désire.

Function Ty(x As Double) As Double

If ([$e$16] = 0 And [$e$20] = [$d$9]) Then
Ty = [$p$13] - [$d$10] * x

ElseIf (0 <= [$e$16] And [$e$16] < [$e$20] And [$e$20] = [$d$9]) Then

ElseIf (0 <= x And x <= [$e$16]) Then
Ty = (-[$d$10] * x)

ElseIf ([$e$16] <= x And x <= [$e$20]) Then
Ty = [$d$10] * ([$d$9] - x) - [$p$14]

ElseIf ([$e$20] = 0 And 0 < [$e$20] And [$e$20] < [$d$9]) Then
ElseIf ([$e$16] <= [p33] And [p33] <= [$e$20]) Then
Ty = -[$d$10] * x + [$p$13]
ElseIf ([$e$20] <= x And x <= [$d$9]) Then
Ty = [$d$10] * ([$d$9] - x)

ElseIf (0 <= [$e$16] And [$e$16] < [$d$9] And 0 <= [$e$20] And [$e$20] <= [$d$9]) Then
ElseIf (0 <= x And x <= [$e$16]) Then
Ty = -[$d$10] * x
ElseIf ([$e$16] <= x And x <= [$e$20]) Then
Ty = [$p$13] - [$d$10] * x
ElseIf ([$e$20] <= x And x <= [$d$9]) Then Ty = [$d$10] * ([$d$9] - x)

End If

End Function

En effet, dans le premier cas [$e$16] = 0 And [$e$20] = [$d$9] elle fonctionne et applique bien Ty = [$p$13] - [$d$10] * x dans les autres cas elle ne m'affiche pas ce que je désire. En effet lorsque je suis dans le cas 0 <= [$e$16] And [$e$16] < [$e$20] And [$e$20] = [$d$9] et à l'intérieur de ce cas je suis dans le cas (0 <= x And x <= [$e$16]) ça ne m'affiche pas le résutat désiré soit Ty = (-[$d$10] * x). Je me doute qu'il y a un probleme de programmation mais étant débutante je ne gère pas trop Excel...

Merci beaucoup de votre aide.

5 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Pour le cas que vous avez explique:

    Function Ty(x As Double) As Double
    
        If ([$e$16] = 0 And [$e$20] = [$d$9]) Then
            Ty = [$p$13] - [$d$10] * x
    
        ElseIf ([$e$16] >= 0 And [$e$16] < [$e$20] And [$e$20] = [$d$9]) Then
            'correction 1
            If (x >= 0 And x <= [$e$16]) Then
                Ty = (-[$d$10] * x)
            End If
    
        ElseIf ([$e$16] <= x And x <= [$e$20]) Then
            Ty = [$d$10] * ([$d$9] - x) - [$p$14]
    
        ElseIf ([$e$20] >= 0 And [$e$20] < [$d$9]) Then
        ElseIf ([$e$16] <= [p33] And [p33] <= [$e$20]) Then
            Ty = -[$d$10] * x + [$p$13]
        ElseIf ([$e$20] <= x And x <= [$d$9]) Then
            Ty = [$d$10] * ([$d$9] - x)
    
        ElseIf (0 <= [$e$16] And [$e$16] < [$d$9] And 0 <= [$e$20] And [$e$20] <= [$d$9]) Then
        ElseIf (0 <= x And x <= [$e$16]) Then
            Ty = -[$d$10] * x
        ElseIf ([$e$16] <= x And x <= [$e$20]) Then
            Ty = [$p$13] - [$d$10] * x
        ElseIf ([$e$20] <= x And x <= [$d$9]) Then Ty = [$d$10] * ([$d$9] - x)
    
        End If
    End Function


    A vous de voir pour les autres cas, car vous seule, savez ce que vous avez ecrit!!!
    0
    1. ced5757 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   1
       
      Merci beaucoup;. Mais il est vrai que j'ai des cas puis des sous cas ...c'est pas simple.
      0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour

    Il va falloir mettre de l'ordre dans tes conditionnelles
    Ici, il y a un pb!
    ElseIf (0 <= [$e$16] And [$e$16] < [$e$20] And [$e$20] = [$d$9]) Then
    quoi ?
    ElseIf (0 <= x And x <= [$e$16]) Then
    est ce que ce dernier elseif ne serait pas un sous cas du 1° , dans ce cas, ce serait un if ...?

    Un début, du moins avec ce que j'ai compris

    Function Ty(x As Double) As Double
    If ([$e$16] = 0 And [$e$20] = [$d$9]) Then
      Ty = [$p$13] - [$d$10] * x
    ElseIf (0 <= [$e$16] And [$e$16] < [$e$20] And [$e$20] = [$d$9]) Then
      If (0 <= x And x <= [$e$16]) Then
        Ty = (-[$d$10] * x)
        ' après je ne sais pas comment se distinguent les cas/sou cas
        ' s'il n'y a pas de else au cas (0 <= x And x <= [$e$16]) > end if
        ' sinon > elseif
        
        
        
        ' mais il faudra clore avec un End if
      End If

    Et vu la complexité de ton code, tu as intérêt à indenter scrupuleusement tes instructions

    Bonne suite
    0
    1. ced5757 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   1
       
      Oui en faite j'ai plein de sous cas ! C'est ça qui m'embête ...
      0
    2. ced5757 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   1
       
      dans le cas où j'ai trois sous cas dois je l'écrire comme ça ?


      If (0 <= x And x <= [$e$16]) Then
      Ty = -[$d$10] * x
      ElseIf ([$e$16] <= x And x <= [$e$20]) Then
      Ty = [$p$13] - [$d$10] * x
      ElseIf ([$e$20] <= x And x <= [$d$9]) Then Ty = [$d$10] * ([$d$9] - x)

      End If
      0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Ton dernier code ne distingue pas des sous-cas mais des cas (de même niveau) s'excluant mutuellement (elseif =sinon si )
    Donc difficile de te répondre efficacement

    Tu devrais commencer par écrire tout ça en bon français
    Les cas de même niveau seront indentés (physiquement sur la même verticale)
    Les cas de même niveau (Cas 1, Cas 2, Cas 3 par exemple - ou bien Cas1.1, Cas1.2, Cas 1.3 s'excluant mutuellement)

    Cas 1. tu mets ta/tes conditions
      Cas 1.1. (sous cas 1 du cas 1) tu mets ta/tes conditions
      Cas 1.2. (sous cas 2 du cas 1) ...
        Cas 1.2.1.
        Cas 1.2.2.
      Cas 1.3.
        Cas 1.3.1.
        Cas 1.3.2.
    Cas 2.
      Cas 2.1.
      Cas 2.2.
    Cas 3.
      etc...

    Le passage au code se fera alors plus efficacement. Si tu n'arrives pas à coder ton texte envoies le nous

    RQ. Pour indenter ton code sur CCM (une fois les espaces de début de ligne posés) tu sélectionnes et tu cliques sur l'icône "Code" <> en haut à droite

    Bon courage
    0
  4. ced5757 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   1
     
    J'ai mis un peu d'ordre. Mais ça ne fonctionne toujours pas. En effet dans le deuxieme cas, déjà il faut que je tire la cellule pour que la valeur change. De plus j'obtiens un ty=0 partout... Je ne comprends vraiment pas.

    Function Ty(x As Double, Ya As Double, Yb As Double, Xa As Double, Xb As Double) As Double

    If (Xa = 0 And Xb = [$d$9]) Then
    Ty = Ya - [$d$10] * x

    ElseIf (0 <= Xa And Xa < Xb And Xb = [$d$9]) Then

    If (0 <= x And x <= Xa) Then
    Ty = (-[$d$10] * x)

    ElseIf (Xa <= x And x <= Xb) Then
    Ty = [$d$10] * ([$d$9] - x) - Yb

    ElseIf (Xa = 0 And 0 < Xb And Xb < [$d$9]) Then
    If (Xa <= [p33] And [p33] <= Xb) Then
    Ty = -[$d$10] * x + Ya
    ElseIf (Xb <= x And x <= [$d$9]) Then
    Ty = [$d$10] * ([$d$9] - x)

    ElseIf (0 <= Xa And Xa < [$d$9] And 0 <= Xb And Xb <= [$d$9]) Then

    If (0 <= x And x <= Xa) Then
    Ty = -[$d$10] * x
    ElseIf (Xa <= x And x <= Xb) Then
    Ty = Ya - [$d$10] * x
    ElseIf (Xb <= x And x <= [$d$9]) Then Ty = [$d$10] * ([$d$9] - x)

    End If
    End If
    End If
    End If
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    En indentant proprement ton code tel qu'il est écrit pour y voir plus clair

    Function Ty(x As Double, Ya As Double, Yb As Double, Xa As Double, Xb As Double) As Double
    If (Xa = 0 And Xb = [$d$9]) Then
      Ty = Ya - [$d$10] * x
    ElseIf (0 <= Xa And Xa < Xb And Xb = [$d$9]) Then
      If (0 <= x And x <= Xa) Then
        Ty = (-[$d$10] * x)
      ElseIf (Xa <= x And x <= Xb) Then
        Ty = [$d$10] * ([$d$9] - x) - Yb
      ElseIf (Xa = 0 And 0 < Xb And Xb < [$d$9]) Then
        If (Xa <= [p33] And [p33] <= Xb) Then
          Ty = -[$d$10] * x + Ya
        ElseIf (Xb <= x And x <= [$d$9]) Then
          Ty = [$d$10] * ([$d$9] - x)
        ElseIf (0 <= Xa And Xa < [$d$9] And 0 <= Xb And Xb <= [$d$9]) Then
          If (0 <= x And x <= Xa) Then
            Ty = -[$d$10] * x
          ElseIf (Xa <= x And x <= Xb) Then
            Ty = Ya - [$d$10] * x
          ElseIf (Xb <= x And x <= [$d$9]) Then
            Ty = [$d$10] * ([$d$9] - x)
          End If
        End If
      End If
    End If
    End Function


    RQ1. D'après les 3 premières lignes, la fonction n'est "calculée" que si Xb =[$d$9]
    - est ce normal
    - si oui les And Xb <= [$d$9] ultérieurs sont inutiles et on peut commencer par distinguer les deux cas
    Si Xb <> [$d$9] alors
    'message d'erreur'
    Sinon
    ' on y va

    - si non il te faut repenser ton approche

    Mais le mieux est de procéder comme je t'ai conseillé dans mon message précédent
    0