Remplacement d'une valeur si dépassement

Résolu
Bonjour,

J'aurai à nouveau besoin de votre aide ...
J'étudie un paramètre X auquel est associé une valeur par jour, cependant, des résultats incohérents peuvent apparaître (s'il est inférieur à 0 ou s'il est supérieur à 190, il est considéré comme étant faux).
Dans la deuxième colonne se trouvent deux paramètres X à la suite qui ne correspondent pas au critères. Dans le cas où une incohérence de ce type est constatée, je souhaiterai que la ou les valeurs soient remplacées par une approximation (moyenne entre les valeurs encadrant la ou les cellules concernées).

--> voir fichier ci-joint : https://www.cjoint.com/c/EFrmRekU280

Je vous remercie par avance pour l'aide que vous m'apporterez.

8 réponses

  1. Si, si,

    tu étais simplement passé sous mon radar.

    essaie cette formule matricielle :
    =SI(ET(B2>=0;B2<=190);B2;(INDEX(B:B;MAX(SI(($B$2:B2>=0)*($B$2:B2<=190);LIGNE($B$2:B2);0)))+INDEX(B:B;MIN(SI((B2:$B$11>=0)*(B2:$B$11<=190);LIGNE(B2:$B$11);9^9))))/2)

    à valider par CTRL+MAJ+ENTER

    cordialement
    0
    1. Merci pour ta réponse, cependant la formule me donne le résultat 123 aulieu de 136,5.
      De plus ce n'est pas exactement ce que j'attends, je voudrais que les valeurs fausses soient remplacées. Il faudrait sûrement passer par l'outil VBA, mais je ne sais pas du tout comment m'y prendre :-/ ...
      0
    2. @jenorFaut mieux expliquer ce que tu recherche, refait ton fichier avec de meilleurs explications, sinon j'abandonne. Si toi même, tu ne sais pas l'expliquer correctement, qui le pourrait ? Nous faut un fichier avec des exemples précis et concrets, où, quand, comment, quel logique ? Nous faut tout les éléments sinon pas la peine de poursuivre.

      Sur ceux, j'attends de tes nouvelles sur le remplissage du fichier. Pense aux exemples, inutile de le rédiger, un fichier vaut mieux qu'une parole.

      Cdlt
      0
    3. Bonjour,

      123, oui, mais sur la première ligne qui est cohérente et donc qui reprend la valeur en colonne B
      et 136,5 sur les lignes incohérentes du 4 et 5 janvier.

      as-tu un recalcul manuel?
      Si tu appliques cette formule sur une autre plage, il faut adapter les bornes bien entendu.

      cordialement
      0
  2. Bonjour à tous,

    @JvDO : pourquoi ne pas faire plus simple avec une formule de ce type ? :

    =SI(ET(B2>=0;B2<=190);B2;SI(ET(C2>=0;C2<=190);C2;""))

    Cdlt
    0
    1. Bonjour,

      parce que tu te sers du résultat attendu pour obtenir le résultat.

      du moins, c'est ce que j'ai compris.

      la colonne attendue est à calculer d'après moi.

      la formule est compliquée parce qu'elle doit gérer les séquences multiples de valeurs incohérentes.

      cordialement
      0
  3. Salut le fil,

    Pour ma part hier je me suis pris la tête sur cette demande, s'il n'y a qu'une plage hors critère plusieurs possibilités effectivement, mais si on pousse le raisonnement plus loin en allongeant la matrice de quelques lignes en intégrant deux valeurs hors critères exemple B12:B13
    les résultats sur cette deuxième plage sont erronées.
    j'y arrive mais en ajoutant deux colonnes
    0
    1. Bonjour,

      il suffit de rajouter un SIERREUR() à ma formule pour gérer les bornes incohérentes.

      pour la partie "allonger la matrice", je ne comprends pas.
      j'ai allongé la matrice, j'ai mis des séquences incohérentes et j'obtiens le résultat.

      si tu peux expliquer ce qui ne va pas...

      cordialement
      0
  4. Salt Jvdo,

    j'ai allongé la liste pour le mois et en B11 correspondant au 10 janvier j'ai mis 126, en B12 -200 en B13 200 (même critère que sur la première plage)
    et en B14 100
    en suivant la logique de Jenor il faut retenir 126+100/2 soit 113
    et encore en imaginant que le nombre de critère hors champ est limité à 2
    A+
    Mike-31

    Une période d'échec est un moment rêvé pour semer les graines du savoir.
    0
    1. Bonjour Mike-31

      d'accord avec toi, mais, 113, c'est le résultat que j'obtiens.

      je vais finir par envoyer le fichier.

      cordialement
      0
      1. Exact Jvdo, erreur de ma part, je n'avais pas modifié les bornes de ta formule, reste à savoir si le nombre de valeur hors critère du demandeur peuvent être supérieur à 2 consécutivement.
        Il serait bien que Jenor le précise
        Cordialement
        0
      2. Ça fonctionne quel que soit le nombre de valeurs incohérentes successives puisque j'utilise le MAX et le MIN des lignes cohérentes pour repérer les valeurs cohérentes respectivement du dessus et du dessous.

        cdlt
        0
      3. Tout à fait, mais ce que je voulais dire, si dans la liste il pouvait y avoir exemple 3 critères consécutifs, exemple B5, B6 et B7 d'après le demandeur Jenor, veut prendre les valeurs B4 et B8 exemple 138 et 140 soit 278 dans ce cas faut il que cette valeur soit divisée par 2 ou par 3 voir plus, mais bon ce n'est pas mon problème je poussais simplement la logique ce qui n'enlève rien à ta merveilleuse formule
        cordialement
        0
    2. Bonjour,

      voilà une solution en VBA.
      tu sélectionnes la zone de tes données avant de lancer la macro.
      les résultats sont affichés en colonne C pour ne pas effacer les données dans un premier temps.
      il suffit de remplacer C2 par B2 pour écraser les données.

      Option Base 1
      
      Sub rendre_cohérent()
      Dim vTab()
      Set vZone = Selection()
      nb = vZone.Rows.Count
      ReDim vTab(nb)
      
      pred = 0: succ = 0
      For i = 1 To nb
          If vZone(i) >= 0 And vZone(i) <= 190 Then
              vTab(i) = vZone(i)
              pred = i
          Else
              While (vZone(i) < 0 Or vZone(i) > 190) And i <= nb
                  i = i + 1
              Wend
              i = i - 1
              succ = i
              
              If pred = 0 Or succ = nb Then vMoy = "" Else vMoy = (vZone(pred) + vZone(succ + 1)) / 2
              pred = WorksheetFunction.Max(1, pred)
              For j = pred + 1 To succ
                  vTab(j) = vMoy
              Next j
              
              pred = i
          End If
      Next i
      
      Range("c2").Resize(nb, 1) = WorksheetFunction.Transpose(vTab)
      End Sub

      je n'ai pas fait dans la dentelle, mais ça semble fonctionner.

      Cordialement
      0
      1. Je vous remercie vraiment beaucoup pour votre aide !!!
        Merci pour le temps que vous m'avez accordé.
        A bientôt
        0