Probleme formule

Résolu
messin57000 Messages postés 72 Statut Membre -  
messin57000 Messages postés 72 Statut Membre -
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. melanie1324 Messages postés 1561 Statut Membre 156
     
    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
  2. messin57000 Messages postés 72 Statut Membre
     
    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. messin57000 Messages postés 72 Statut Membre
       
      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. melanie1324 Messages postés 1561 Statut Membre 156
       
      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. messin57000 Messages postés 72 Statut Membre
       
      Merci en tout cas c'est gentille d'avoir voulu m'aider :)

      Youssef
      0
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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. messin57000 Messages postés 72 Statut Membre
       
      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. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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. messin57000 Messages postés 72 Statut Membre
       
      Merci Eric ca marche en fait je savais pas comment nommer une plage...
      Merci beaucoup pour ton aide :)
      0
    4. Zoul67 Messages postés 2001 Statut Membre 149
       
      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. messin57000 Messages postés 72 Statut Membre
       
      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
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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. messin57000 Messages postés 72 Statut Membre
       
      Merci Eric pour ta réponse :)
      0