XL 2013 Récupérer la valeur de la première cellule non vide juste au-dessus d'une cellule

Mooga

XLDnaute Nouveau
Bonjour à toutes et à tous,

Je suis bien embêté sur un petit problème Excel. Je cherche à réaliser une opération simple : une soustraction entre deux valeurs.
Le problème est que l'endroit d'une de ces valeurs à soustraire est variable.

J'ai trouvé une formule matricielle qui permet de récupérer la première cellule non vide d'une colonne :
=INDEX($C$4:$C$14;EQUIV(VRAI;$C$4:$C$14<>"";0))

mais je ne souhaite pas piocher la cette valeur située tout en haut de ma colonne mais plutôt celle située juste au-dessus de ma ligne du moment.
Le tableur en PJ sera beaucoup plus clair.

Merci beaucoup beaucoup à celles et ceux qui auront le temps de se pencher sur la question.
Patrick.
 

Pièces jointes

  • Pb recherche valeur non vide juste au-dessus.xlsx
    11.3 KB · Affichages: 17

soan

XLDnaute Barbatruc
Inactif
Bonjour Mooga, Jocelyn,

ton fichier en retour. :)

* tu peux voir que C4: D14 est vide (en D4: D14, y'a aucune formule)

* en C4, saisis 82 ➯ en D4 : 0,0 cm

* en C6, saisis 70 ➯ en D6 : 12,0 cm

* en C10, saisis 45 ➯ en D10 : 25,0 cm

* en C12, saisis 10 ➯ en D12 : 35,0 cm

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim lig&, v1%, v2%
  With Target
    If .CountLarge > 1 Then Exit Sub
    If .Column <> 3 Then Exit Sub
    lig = .Row: If lig < 4 Then Exit Sub
    v2 = .Value
    If lig = 4 Then v1 = v2 Else v1 = Val(Replace$(.End(3), ",", "."))
    If v2 = 0 Then .Offset(, 1).ClearContents Else .Offset(, 1) = v1 - v2
  End With
End Sub



edit : il y a un bug dans mon code VBA ; ne pas utiliser le fichier joint ; j'ai corrigé le bug, et le bon fichier est dans mon post #15 (avec les explications sur la cause du bug).​

soan
 

Pièces jointes

  • Pb recherche valeur non vide juste au-dessus.xlsm
    17.6 KB · Affichages: 5
Dernière édition:

Mooga

XLDnaute Nouveau
C'est formidable merci à tous les deux pour votre réactivité.

Je vais garder celle de Jocelyn car pas de vba et dans le fichier de Soan, il y a des cas où le calcul est incorrect malheureusement. Par exemple :

Niveau d'eau
(en cm)
Marnage
(en cm)
80,000,0 cm
75,005,0 cm
70,0010,0 cm

Ce n'est pas un besoin Jocelyn mais lorsque je tire toutes les colonnes vers la bas pour augmenter le nombre d'incrémentation, la formule de fonctionne mais c'est un pur détail subsidiaire. Pas besoin de se prendre la tête dessus.

Un grand merci encore à vous deux. C'est formidable.
 

Mooga

XLDnaute Nouveau
Rhaa zut désolé de déranger encore mais sur le fichier de Jocelyn, tout fonctionne sauf la dernière ligne du tableau. Si je rentre 8 et 1 cm pour 135 et 150s, j'obtiens ceci : 9 cm calculé au lieu de 7 cm.

Temps
(en s)
Temps (en min)Niveau d'eau (en cm)Marnage (en cm)
Increment.
15 s
000:0082,000,0 cm
1500:15
3000:3070,0012,0 cm
4500:45
6001:00
7501:15
9001:3045,0025,0 cm
10501:45
12002:0010,0035,0 cm
13502:158,002,0 cm
15002:301,009,0 cm
 

soan

XLDnaute Barbatruc
Inactif
@Mooga

pour ton post #4 :

80 ; 80 - 80 = 0 : ok

75 ; 80 - 75 = 5 ; ok

70 ; 75 -70 = 5 de nouveau, pas 10 !

exemple :

Image.jpg


soan
 

Mooga

XLDnaute Nouveau
j'comprends pas : regarde l'image de mon post #6 précédent ;
en D10, j'ai bien 5,0 cm et pas 10,0 cm.

j'vois pas c'que t'as pu faire pour avoir 10 cm au lieu de 5 cm.

soan
J'ai simplement commencé à saisir des valeurs au hasard à partir du haut du tableau pour 0s puis 15s puis 30s, etc.
Dans la colonne "niveau d'eau" et le calcul qui se fait est le suivant :
1620824032863.png
 

Mooga

XLDnaute Nouveau
Sinon @Jocelyn, un mystère que je ne parviens pas à résoudre est qu'il m'est impossible d'appliquer votre formule dans mon vrai fichier que je mets en PJ (cf. colonnes en jaune). Alors ça c'est curieux dis donc.
 

Pièces jointes

  • Tarage PR Rte Quimper_PdB_22-02-2021.xlsm
    632.9 KB · Affichages: 4

Jocelyn

XLDnaute Barbatruc
re,
Bonjour soan,

concernant mon fichier c'est juste un soucis de $

j'avais écrit en D4

VB:
=SI(C4="";"";INDEX($C$4:C4;MAX(SI((ESTNUM($C$4:$C$12))*(LIGNE($C$4:C$12)<LIGNE());LIGNE($C$4:C$12)-3)))-C4)

en Bloquant la $C$12 car j'avais commencé a modifier en ligne12

donc en D4 après modif il faut

Code:
=SI(C4="";"";INDEX($C$4:C4;MAX(SI((ESTNUM($C$4:$C4))*(LIGNE($C$4:C4)<LIGNE());LIGNE($C$4:C4)-3)))-C4)

voir fichier
 

Pièces jointes

  • Pb recherche valeur non vide juste au-dessus.xlsx
    17.1 KB · Affichages: 8

Mooga

XLDnaute Nouveau
re,
Bonjour soan,

concernant mon fichier c'est juste un soucis de $

j'avais écrit en D4

VB:
=SI(C4="";"";INDEX($C$4:C4;MAX(SI((ESTNUM($C$4:$C$12))*(LIGNE($C$4:C$12)<LIGNE());LIGNE($C$4:C$12)-3)))-C4)

en Bloquant la $C$12 car j'avais commencé a modifier en ligne12

donc en D4 après modif il faut

Code:
=SI(C4="";"";INDEX($C$4:C4;MAX(SI((ESTNUM($C$4:$C4))*(LIGNE($C$4:C4)<LIGNE());LIGNE($C$4:C4)-3)))-C4)

voir fichier
Merci beaucoup Jocelyn, je me suis perdu également dans les $,
Mes excuses mais serait-il possible de m'aider à comprendre pourquoi je n'arrive pas intégrer votre formule dans mon fichier en PJ s'il-vous-plait ?
 

Pièces jointes

  • Tarage test.xlsm
    633.1 KB · Affichages: 3

Jocelyn

XLDnaute Barbatruc
re,

re voila le fichier corrigé l'erreur venait de cette partie de la formule LIGNE(G$31:G31)-30

la fonction max renvoie un numéro de ligne pour l'index or si nous avons besoin de la ligne 31 elle correspond au numéro 1 de l'index G$31:G31 donc pour avoir ce numéro 1 on recherche les numéro de ligne en on enleve 30

dans le fichier exemple on avait LIGNE(G$31:G31)-1 puisque l'index commencait sur la ligne 2 et tu avais laisser le -1
 

Pièces jointes

  • Tarage PR Rte Quimper_PdB_22-02-2021.xlsm
    645.5 KB · Affichages: 7

soan

XLDnaute Barbatruc
Inactif
@Mooga, Jocelyn,

j'ai été occupé sur d'autres exos, c'est pourquoi je reviens seulement maint'nant sur celui-ci.

ton post #9 m'a aidé à comprendre le bug de mon code VBA : ça se produit quand il n'y a pas au moins une cellule vide au-dessus du nombre que tu saisis : c'est le .End(3) = .End(xlUp) qui fait que ça ne marche plus quand on saisi un nombre juste en dessous du précédent ; ça faisait 80 (de C4) - 70 (de C6) = 10 ; j'ai donc utilisé une autre méthode qui est sans .End(xlUp) ; cette fois c'est ok :​

Image.jpg


VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim lg1&, lg2&, v1%, v2%
  With Target
    If .CountLarge > 1 Then Exit Sub
    If .Column <> 3 Then Exit Sub
    lg2 = .Row: If lg2 < 4 Then Exit Sub
    v2 = .Value: If v2 = 0 Then .Offset(, 1).ClearContents: Exit Sub
    If lg2 = 4 Then
      v1 = v2
    Else
      lg1 = lg2: Do While Cells(lg1 - 1, 3) = 0: lg1 = lg1 - 1: Loop
      v1 = Val(Replace$(Cells(lg1 - 1, 3), ",", "."))
    End If
    If v2 = 0 Then .Offset(, 1) = "" Else .Offset(, 1) = v1 - v2
  End With
End Sub

soan
 

Pièces jointes

  • Pb recherche valeur non vide juste au-dessus.xlsm
    17.8 KB · Affichages: 9

Discussions similaires