Probleme formule

Résolu
Bonjour,

J'ai un problème , bon je sais pas trop comment expliquer mais dans mon fichier aujourd huit j'ai un tableau ou sont marqué les données d'une pompes centrifuge ( courant, puissance, debit ...) et pour chacun de ces données on les modélise par une équation de degré 6 avec coéfficient devant ( a0, a1 ... a6) ce qui donne y=a0+a1*Q+a2*Q^2 ... +a6*Q^6.

Mon probleme c'est que ces coefficient je l'es ai eu ( droitereg) dans un tableau à part, et quand je rentre ma formule dans la cellule j'ai que l'emplacement de chaque coeff, alors que moi je veu que sur la formule apparaisse la valeur brut du coeff!!
c'est a dire par exemple , pour le coeff a0 supposon il est dans B3 dans la formule j'aurai = B3+B4*... alors que moi je veu sa valeur qui apparai dans la formule par exemple 1.2365 + 0.12364*Q+...

Pourrai-je avoir de l'aide??

Je vous remerci

4 réponses

  1. Bonjour,

    alors tu as écrit :
    = B3+B4*...
    Pour avoir :
    1.2365 + 0.12364*Q+...

    écrit ca :
    =gauche(B3;nbcar(B3)+gauche(B4;nbcar(B4)*Q+....
    0
    1. Merci pour votre réponse rapide , mais je pense pour moi ça sera le meme probleme car je souhaite que dans ma formule les valeur brut apparaissent sans que je sois amener à les taper manuellement, alors que dans ta solution dans la formule j'aurai pas les valeur brut.

      ce que je veux c'est avoir 1.2365 + 0.12364*Q... dans ma formule pas le résultat de la formule, je dois mal m'exprimer !

      je sais pas si ca existe une fonction ou faut il peut etre faire une macro...
      0
      1. Oui votre formule marche bien mais le probleme c'est qu'elle donne le resultat que je veut mais dans la cellule pas dans la formule de la cellule. je dois mal m'exprimer.
        Voici un exemple c'est marquer en rouge ce que je veut et en jaune la cellule en question.

        http://cjoint.com/13sp/CIclq0JiVvT.htm

        merci
        0
      2. Re,

        je ne sais pas faire et je ne crois pas que ce soit possible.
        soit tu écris en dur tes coefficients
        soit tu laisses ta formule comme ca.

        je laisse la place à quelqu'un d'autre.
        0
      3. Merci en tout cas c'est gentille d'avoir voulu m'aider :)

        Youssef
        0
    2. Contributeur
      Bonjour,

      Sans détruire ta formule, une fonction personnalisée qui affiche (dans une autre cellule donc) les paramètres évalués.
      Les références à évaluer doivent être dans des plages nommées qui commence par "ev_" :
      Function evalParamFormule(formule As Range)
          Dim f2 As String, fEval As String, param As Variant, f
          Dim pl As Range, pl2 As Range, nom As Name, i As Long
          fEval = formule.Formula
          f2 = formule.Formula
          If Left(f2, 1) <> "=" Then
              evalParamFormule = CVErr(xlErrValue)
              Exit Function
          End If
          f2 = Mid(f2, 2)
          f2 = Replace(Replace(Replace(Replace(Replace(Replace(f2, "+", "µ"), "-", "µ"), "*", "µ"), "/", "µ"), "(", "µ"), ")", "µ")
          ' découpage de la formule sur +, -, *, /, (, et ) pour récup des paramètres
          param = Split(f2, "µ")
          For i = 0 To UBound(param)
              'pour chaque paramètre
              Set pl = Nothing
              On Error Resume Next
              Set pl = Range(param(i))
              On Error GoTo 0
              If Not pl Is Nothing Then
                  ' si le paramètre est une référence
                  For Each nom In Names
                      'pour chaque nom
                      If Left(nom.Name, 3) = "ev_" Then
                          ' si le nom commence par ev_
                          Set pl2 = Intersect(Range(nom), pl)
                          If Not pl2 Is Nothing Then
                              If Intersect(Range(nom), pl).Count = pl.Count Then
                                  'et que le paramètre intégralement est inclus dans le nom
                                  fEval = Replace(fEval, param(i), Range(param(i)).Value)
                              End If
                          End If
                      End If
                  Next nom
              End If
          Next i
          evalParamFormule = fEval
      End Function

      Le découpage de la formule se limite aux opérateurs simples, et les références à évaluer doivent avoir une seule lettre. Suffisant pour ta demande, et beaucoup de travail en plus pour des références sur 2 lettres et plus.
      https://www.cjoint.com/c/CIcmNeWLTjh

      eric

      Jamais tu ne répondras à un mp non sollicité...
      Bon, ça c'est fait.
      0
      1. bonjour Eric,

        J'ai essayé ta méthode Eric j'y arrive pas a avoir le resultat voulu vu que les coefficient n'apparaissent pas en brut ça doit être un probleme dans la macro quand je l'ai appliqué sur ma feuille excel... ( je maitrise pas encore le language VBA ^^) .
        Voici le lien de ma feuille ou j'ai essayé d'appliquer la fonction :)

        http://cjoint.com/13sp/CIcoPVQIRdg.htm

        Merci Pour ta reponse

        Youssef
        0
      2. Contributeur
        Re,

        Les références à évaluer doivent être dans des plages nommées qui commence par "ev_"
        Il ne manque que ça.
        Je me base dessus pour savoir s'il faut évaluer la référence ou non. Elle doit appartenir intégralement à une plage dont le nom commence par ev_
        Sélectionne B19:H19 et nomme la plage ev_1 (ou ev_ce_qu_tu_veux)

        eric
        0
      3. Merci Eric ca marche en fait je savais pas comment nommer une plage...
        Merci beaucoup pour ton aide :)
        0
      4. Bonjour messin57000,

        J'aurais plutôt pensé à la fonction CONCATENER... qui devrait éviter de nommer une plage et l'usage de VBA...

        A+
        0
      5. Bonjour Zoul67,

        oui effectivement j'avais pensé à ca aussi mais c'est quand même plus propre quand on maitrise le language vba mais sinon oui ta raison concatener c'était le seul recours :)

        A plus
        0
    3. Contributeur
      J'ai fait évoluer un peu la fonction.
      Ajout de 2 paramètres optionnels :
      - nbSignificatifs : nombre de chiffres significatifs conservés (6 par défaut)
      - ing : notation ingénieur, puissances de 10 multiples de 3 (FAUX par défaut)

      https://www.cjoint.com/?CIcrmgjRS5S

      eric

      edit: je crois qu'il y a une erreur dans l'exposant mais pas le temps de corriger. Ce soir sans doute...

      Jamais tu ne répondras à un mp non sollicité...
      Bon, ça c'est fait.
      0
      1. Contributeur
        Fonction corrigée :
        Function evalParamFormule(formule As Range, Optional nbSignificatifs As Long = 6, Optional ing As Boolean = False)
            ' évalue certains paramètres de la formule
            ' ceux dont la référence appartient à une plage dont le nom commence par ev_ sont évalués
            ' ces plages doivent être limitées aux colonnes A:Z
            ' Paramètres optionnels
            ' nbSignificatifs: nombre de chiffres significatifs à afficher
            ' ing: affichage au format ingénieur (exposant multiple de 3)
        
            Dim a19 As String, fEval As String, param As Variant, a
            Dim pl As Range, pl2 As Range, nom As Name, i As Long
            Dim Exposant As Long, Parts() As String, valeur As String
        
            fEval = formule.Formula
            a19 = formule.Formula
            If Left(a19, 1) <> "=" Then
                evalParamFormule = CVErr(xlErrValue)
                Exit Function
            End If
            a19 = Mid(a19, 2)
            a19 = Replace(Replace(Replace(Replace(Replace(Replace(a19, "+", "µ"), "-", "µ"), "*", "µ"), "/", "µ"), "(", "µ"), ")", "µ")
            ' découpage de la formule sur +, -, *, /, (, et ) pour récup des paramètres
            param = Split(a19, "µ")
            For i = 0 To UBound(param)
                'pour chaque paramètre
                Set pl = Nothing
                On Error Resume Next
                Set pl = Range(param(i))
                On Error GoTo 0
                If Not pl Is Nothing Then
                    ' si le paramètre est une référence
                    For Each nom In Names
                        'pour chaque nom
                        If Left(nom.Name, 3) = "ev_" Then
                            ' si le nom commence par ev_
                            Set pl2 = Intersect(Range(nom), pl)
                            If Not pl2 Is Nothing Then
                                If Intersect(Range(nom), pl).Count = pl.Count Then
                                    'et que le paramètre intégralement est inclus dans le nom
                                    Parts = Split(Format(Range(param(i)).Value, "0.0#############E+0"), "E")
                                    Exposant = 3 * Int(Parts(1) / 3)
                                    valeur = Round(Parts(0), nbSignificatifs - 1) * 10 ^ (Parts(1) - Exposant)
                                    If ing Then
                                        valeur = valeur & IIf(Exposant, "E" & Exposant, "")
                                    Else
                                        valeur = CDbl(valeur & "E" & Exposant)
                                    End If
                                    fEval = Replace(fEval, param(i), valeur)
                                End If
                            End If
                        End If
                    Next nom
                End If
            Next i
            evalParamFormule = Replace(fEval, "+-", "-")
        End Function
        

        https://www.cjoint.com/?CIct3wJ3l6d

        eric
        0
      2. Merci Eric pour ta réponse :)
        0