Calculer l'écart successif le plus élevé d'une colonne

Mcyaofly Messages postés 7 Statut Membre -  
Mcyaofly Messages postés 7 Statut Membre -
Bonjour,

Voici mon problème :
Dans une colonne (B) j'ai des critères de tailles allant de 1,2 cm à 5,0 cm. Dans une autre colonne (C) j'ai des variables positifs ou négatifs. J'aimerais avoir une formule qui m'indique quel est la somme des variables consécutives la plus élever et qui me rapproche la tranche des critères de tailles correspondantes.

Voici le lien du fichier d'exemple :
https://www.cjoint.com/c/IHno3OLdy1I

Là, ma somme que j'arrive à atteindre la plus élevée c'est 8 de C22 à C24 pour les critères de tailles de 2,9 cm à 3,1 cm.
Comment puis-je avoir ces informations automatiquement ?

Merci pour vos réponses :)

4 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour à tous,

    Un essai.
    Tu ne dis pas comment tu veux le résultat, j'ai improvisé.
    Je suis aussi parti du principe que c'était une somme d'au moins 2 éléments. Si il faut admettre un élément isolé qui serait supérieur à toutes les sommes, il faudra ajouter un contrôle supplémentaire.
    https://www.cjoint.com/c/IHnrr4BPRhz
    eric

    PS : j'ai nommé 'donnees' ta plage B5:C39. Il suffit de modifier la définition du nom si la plage varie, pas besoin de retoucher la macro.
    PS2 : si 2 plages sont au même maxi, je retiens la plus étendue

    1
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      adapté pour prendre également un seul élément:
      Sub plMax()
          Dim datas, s As Double, maxi(1 To 3) As Single, i As Long, j As Long
          datas = [donnees].Value
          [donnees].Interior.ColorIndex = xlNone
          For i = 1 To UBound(datas)
              s = 0
              For j = i To UBound(datas)
                      s = s + datas(j, 2)
                      If s <= 0 Then Exit For
                      If s > maxi(1) Or (s = maxi(1) And j - i > maxi(3) - maxi(2)) Then
                          maxi(1) = s: maxi(2) = i: maxi(3) = j
                      End If
              Next j
          Next i
          [donnees].Offset(maxi(2) - 1).Resize(maxi(3) - maxi(2) + 1, 2).Interior.Color = vbYellow
          [E5] = maxi(1): [F5] = datas(maxi(2), 1): [G5] = datas(maxi(3), 1)
      End Sub
      0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Salut yg_be :-)

      tu es sûr de ton coup pour le
      If s <= 0 Then Exit For
      ?
      Pour l'instant on ne sait pas si il y a toujours au moins 1 valeur positive, le demandeur devra préciser.
      eric
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention  
         
        alors ainsi:
        Sub plMax()
            Dim datas, s As Double, maxi(1 To 3) As Single, i As Long, j As Long
            datas = [donnees].Value
            [donnees].Interior.ColorIndex = xlNone
            maxi(1) = -3.402823E+38
            For i = 1 To UBound(datas)
                s = 0
                For j = i To UBound(datas)
                        s = s + datas(j, 2)
                        If s > maxi(1) Or (s = maxi(1) And j - i > maxi(3) - maxi(2)) Then
                            maxi(1) = s: maxi(2) = i: maxi(3) = j
                        End If
                        If s <= 0 Then Exit For
                Next j
            Next i
            [donnees].Offset(maxi(2) - 1).Resize(maxi(3) - maxi(2) + 1, 2).Interior.Color = vbYellow
            [E5] = maxi(1): [F5] = datas(maxi(2), 1): [G5] = datas(maxi(3), 1)
        End Sub
        0
    3. Mcyaofly Messages postés 7 Statut Membre
       
      Un grand merci ! Je n'ai pas compris la macro et je vais m'y pencher dessus mais c'est parfait !
      0
    4. Mcyaofly Messages postés 7 Statut Membre
       
      Dernière petite question, car j'ai enfin réussi à mettre la macro sur l'ensemble de mes tableaux, mais j'ai un dernier petit problème qui se pose. Le tableau est amené à varier en taille et donc en quantité de valeur. Comment puis-je intégrer dans le gestionnaire de nom, qu'il me prenne en base de donnée automatiquement la première ligne jusqu'à la dernière où l'on trouve une valeur ? Comme cela, si le tableau s'agrandit, je n'ai pas besoin manuellement de devoir changer les données dans le gestionnaire de nom..
      Encore un grand merci !
      0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, quel est ton contexte, que vas-tu faire avec le résultat?
    0
    1. Mcyaofly Messages postés 7 Statut Membre
       
      Bonjour,
      Le tableau transmis est un exemple succin qui servira à une multitude de bases de données pour une multitude de données. Si j'arrive à avoir une solution pour un exemple simple comme celui-ci, je pourrais le reproduire pour l'ensemble des données.
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Mcyaofly Messages postés 7 Statut Membre
         
        je pense alors préférable de faire via VBA. il faut alors décider ce qui va déclencher l'exécution (par exemple un raccourci clavier), quelles sont les données à traiter, et où afficher les résultats.
        0
  3. Raymond PENTIER Messages postés 58229 Date d'inscription   Statut Contributeur Dernière intervention   17 494
     
    Je n'ai pas trouvé de solution par formules simples.
    Il faudra certainement passer par du VBA (hors de mes compétences) ...
    0
  4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    tu pourrais mettre cette formule en D5:
    =SI(C5>0;D4+C5;0)
    , et la recopier vers le bas. ensuite chercher la valeur la plus grande dans la colonne D.
    (mauvaise idée)
    0