XL 2013 Recuperer la derniere valeur entre en fonction de criteres

MarieL91

XLDnaute Nouveau
Bonjour a tous,

Je suis face un probleme , après plusieurs tentatives aucun resultats.
Je souhaiterais recuperer la derniere valeur note dans une colonne en fonctions de 2 criteres dans un tableau excel.
J'ai mis en piece jointe un tableau + des explications, pour etre plus clair.

En esperant que quelqu'un pourra m'aider,

Je vous remercie d'avance,

Bonne journee a vous
 

Pièces jointes

  • fichier 2.xlsm
    20.3 KB · Affichages: 65

Paf

XLDnaute Barbatruc
bonjour MarieL91,

Si j'ai bien tout compris, un essai par fonction personnalisée:

en H5 : =CalculMarieL() puis tirer vers le bas

dans un module standard:

Code:
Function CalculMarieL()
Dim Tablo, Lig As Long, i As Long, D As Long, E As Long
Lig = Application.ThisCell.Row
Tablo = Range("A" & Lig & ":E" & Range("A" & Rows.Count).End(xlUp).Row)
For i = LBound(Tablo) + 1 To UBound(Tablo)
    If Tablo(i, 1) = Tablo(1, 1) And Tablo(i, 3) = Tablo(1, 3) Then
        D = Tablo(i, 4)
        E = Tablo(i, 5)
    End If
Next
If D > 0 Then
  Calcul = (D + (E / 60)) - (Tablo(1, 4) + (Tablo(1, 5) / 60))
Else
  Calcul = ""
End If
End Function

A+

Edit: Rajout test si D>0 ....
 
Dernière édition:

MarieL91

XLDnaute Nouveau
Bonjour Paf,

Merci pour ta solution, sauf que la ligne du code "Lig = Application.ThisCell.Row" ne fonctionne pas => erreur 1004 (failed)
J'ai bien mis le code dans un module , la formule en H5 , tirer la formule sur la colonne.
Peut etre le "As long"?

Merci d'avance,

Bonne journee
 

Paf

XLDnaute Barbatruc
Re,

Petite bourde, j'ai changé le nom de la fonction en la déposant ici, mais j'ai omis de modifier ce nom là où c'était nécessaire.

modifier la fonction comme ceci:

If D > 0 Then
CalculMarieL = (D + (E / 60)) - (Tablo(1, 4) + (Tablo(1, 5) / 60))
Else
CalculMarieL = ""
End If

A+
 

MarieL91

XLDnaute Nouveau
Bonjour Paf,

Merci pour ta reponse et modification.

J'ai change le code donc le code fonctionne mais les valeurs sont incohérentes.
J'ai annote le code pour pouvoir le comprendre, est ce que je l'ai bien compris?
Ci joint le fichier en H avec le code VBA en G ce qu'on devrait trouver.

En espérant encore un peu d'aide!

Merci

Bonne journee
 

Pièces jointes

  • fichier3.xlsm
    18.6 KB · Affichages: 45

Paf

XLDnaute Barbatruc
Re bonjour,

dans le premier classeur joint, la règle du jeu était définie ainsi:
Je souhaiterais: SI (la date en A est la meme & colonne C = 1 ;Alors "Aller chercher la derniere valeur de D correspondante aux 2 criteres" )De meme pour valeur = 2 en colonne C
=(11+(23/60))-(9+(12/60)) Avec les 2 conditions suivantes A=08/08/2016 & C="1"

ce qui donnerait en notant c pour la ligne courante et d pour la dernière ligne concernée:
=(Dd+(Ed/60)) - (Dc+(Ec/60))


Dans le second classeur joint on découvre par le biais de formule que la règle est modifiée et que désormais c'est:
SI(F6<>0;(D6+E6/60)-(D5+E5/60)+(F6+G6/60)-(D6+E6/60);(D6+E6/60)-(D5+E5/60))

c'est à dire que pour la ligne concernée, on fait les calculs avec les cellules D et E de la ligne précédente ( que la date soit ou non la même que le critère colonne C soit ou non le même)

Précisez une bonne fois la règle à appliquer, la correction suivra (si possible...)

A+
 

Paf

XLDnaute Barbatruc
re,

une nouvelle fonction personnalisée d'après ce que j'ai compris:

en H5 : =CalculMarieL_V2() puis tirer vers le bas

dans un module standard:
VB:
Function CalculMarieL_V2()
Dim Lig1 As Long, Lig2 As Long, D1 As Long, D2 As Long, E1 As Long, E2 As Long
Dim i As Long, F1 As Long, G1 As Long
Application.Volatile

Lig1 = Application.ThisCell.Row 'ligne de la cellule selectionnée)
If Cells(Lig1, 1) <> "" And Cells(Lig1, 3) = "" Then
        CalculMarieL_V2 = ""
        Exit Function
End If
'recherche ligne précédente
For i = Lig1 - 1 To 5 Step -1 ' de la ligne courante à la dernière ligne utile
    If Cells(i, 1) = Cells(Lig1, 1) And Cells(i, 3) = Cells(Lig1, 3) Then
        Lig2 = i
        Exit For
    End If
Next
If Lig2 < 5 Then
    CalculMarieL_V2 = ""
    Exit Function
End If
D1 = Cells(Lig1, 4)
D2 = Cells(Lig2, 4)
E1 = Cells(Lig1, 5)
E2 = Cells(Lig2, 5)
F1 = Cells(Lig1, 6)
G1 = Cells(Lig1, 7)
  
If Cells(Lig1, 6) > 0 Then
'(D6+E6/60)-(D5+E5/60)+(F6+G6/60)-(D6+E6/60)
    CalculMarieL_V2 = (F1 + G1 / 60) - (D2 + E2 / 60)
Else
    'D6+E6/60)-(D5+E5/60)
    CalculMarieL_V2 = (D1 + E1 / 60) - (D2 + E2 / 60)
End If
End Function

A+
 

MarieL91

XLDnaute Nouveau
Bonjour Paf,

Non la regle est toujours la meme, c'etait seulement pour illustrer (je l'ai fais manuellement la separation avec date et "1 et 2")
C'etait pour faire un comparatif entre ce qu'on devait trouver et le resultat avec le code que l'on obtient.

Merci pour le nouveau code je vais regarder.

Je vous remercie d'avance ,

Bonne journee
 

MarieL91

XLDnaute Nouveau
Bonjour,
Désolée pour la réponse tardive mais j'essayais de trouver un moyen avant de vous faire appel.
Donc tout est bon sauf une chose, je souhaite calculer une difference de temps et je souhaiterais donc decaler la cellule d'une ligne
Example:

Actuellement :
08/08 ... 8h ... 1 (9-8)
08/08 .... 9h ... 1 (10-9)
08/08 ... 10h ....

Ce que je souhaiterais:

08/08 ... 8h ... 0
08/08 .... 9h ... 1 (9-8)

J'ai essaye de rajouter dans le code ligne -1 mais ca ne fonctionne pas

Merci

En esperant avoir ete clair
 

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 322
Membres
102 862
dernier inscrit
Emma35400