valeur max en fonction de deux autres colonnes

Raphael35

XLDnaute Nouveau
Bonjour,

J'ai un fichier avec des nom de puits, les ages géologiques et une mesure géochimiques du TOC.

Je cherche une macro pour ne garder que la valeur maximale par age et par puits. Par exemple pour le puits 73/13-1, je voudrais la valeur maximale de toc du Lower jurassic, celle du lower cretaceous, etc pour chaque puits.

J'ai essayé de combiner des macros trouvées sur ce site mais je dois avouer que c'est un échec ...

Merci par avance pour votre aide.
 

Pièces jointes

  • Max_doublons.xlsx
    9.3 KB · Affichages: 16
Dernière édition:

excfl

XLDnaute Barbatruc
Re : valeur max en fonction de deux autres colonnes

Bonjour le forum,

G1 :
Code:
=MAX(SI((A1:A1000=E1)*(B1:B1000=F1);C1:C1000))
Formule matricielle à valider avec : CTRL MAJ ENTREE

6dv682.png
 

Raphael35

XLDnaute Nouveau
Re : valeur max en fonction de deux autres colonnes

Bonjour,

Merci pour votre réponse.

Il y a un problème, en fait dès qu'il atteint la valeur max, il reprend son calcul. Par exemple ici quand il arrive à 21.25 :

73/13-1 Unknown 0.18 73/13-1 Unknown 21.25
73/13-1 Unknown 1.25 73/13-1 Unknown 21.25
73/13-1 Unknown 0.94 73/13-1 Unknown 21.25
73/13-1 Unknown 21.25 73/13-1 Unknown 21.25
73/13-1 Unknown 9.64 73/13-1 Unknown 9.64
73/13-1 Unknown 2.17 73/13-1 Unknown 2.17
73/13-1 Unknown 0.95 73/13-1 Unknown 0.95
73/13-1 Unknown 0.13 73/13-1 Unknown 0.28
73/13-1 Unknown 0.08 73/13-1 Unknown 0.28
73/13-1 Unknown 0.23 73/13-1 Unknown 0.28
73/13-1 Unknown 0.24 73/13-1 Unknown 0.28
73/13-1 Unknown 0.28 73/13-1 Unknown 0.28


De plus il y a un message d'erreur (un point d'exclamation sur le coté de la cellule) qui me dit que "la formule omet les cellules adjacentes".
 

Paf

XLDnaute Barbatruc
Re : valeur max en fonction de deux autres colonnes

Bonjour Raphael35, excfl

un essai par macro:

Code:
Sub TriMax()
 Dim Dico1, Dico2, TabPuits, TabAge, TabFin()
 Dim DerL As Long
 Set Dico1 = CreateObject("Scripting.Dictionary")
 Set Dico2 = CreateObject("Scripting.Dictionary")

 Application.ScreenUpdating = False

 With Worksheets("Feuil1")
 DerL = .Range("A" & Rows.Count).End(xlUp).Row
 TabPuits = .Range("A2:A" & DerL)
 For i = LBound(TabPuits) To UBound(TabPuits)
    Dico1(TabPuits(i, 1)) = ""
 Next

For Each Puits In Dico1
    .Range("A1:C" & DerL).AutoFilter Field:=1, Criteria1:=Puits
    TabAge = .Range("A2:c" & DerL).SpecialCells(xlVisible)

    For i = LBound(TabAge) To UBound(TabAge)
        If Dico2.Exists(TabAge(i, 2)) Then
            If TabAge(i, 3) > Dico2(TabAge(i, 2)) Then Dico2(TabAge(i, 2)) = TabAge(i, 3)
        Else
            Dico2(TabAge(i, 2)) = TabAge(i, 3)
        End If
    Next
    
    For Each Age In Dico2
        Ind = Ind + 1
        ReDim Preserve TabFin(1 To 3, 1 To Ind)
        TabFin(1, Ind) = Puits
        TabFin(2, Ind) = Age
        TabFin(3, Ind) = Dico2(Age)
    Next
    
    Dico2.RemoveAll
    .Range("A1:C" & DerL).AutoFilter
 Next
    .Range("E2").Resize(UBound(TabFin, 2), UBound(TabFin, 1)) = Application.Transpose(TabFin)
 End With
 Application.ScreenUpdating = True
End Sub

le résultat est copié à partir de E2

NB Nécessite d'ajouter la référence : Microsoft Scripting Runtime dans Outils, Références de la Feuille VBE

A+
 

ROGER2327

XLDnaute Barbatruc
Re : valeur max en fonction de deux autres colonnes

Bonjour à tous.


À Paf :


  • Tant qu'à déclarer et typer les variables, autant les déclarer toutes :
    Code:
    Dim i&, Puits, AGE, Ind&
    Dim Dico1, Dico2, TabPuits, TabAge, TabFin()
    Dim DerL As Long
    Set Dico1 = CreateObject("Scripting.Dictionary")
    Set Dico2 = CreateObject("Scripting.Dictionary")
    L'exécution n'en sera que plus rapide.

  • Comme il est rédigé, votre code ne nécessite pas d'ajouter la référence Microsoft Scripting Runtime au projet.
    Par contre, la déclaration de cette référence est nécessaire si vous déclarez
    VB:
    Dim Dico1 As New Scripting.dictionary, Dico2 As New Scripting.dictionary
    Dans ce cas, il convient bien sûr de supprimer
    Code:
    Set Dico1 = CreateObject("Scripting.Dictionary")
    Set Dico2 = CreateObject("Scripting.Dictionary")


Bonne journée.


ℝOGER2327
#7936


Lundi 9 Gidouille 142 (Sainte Outre, psychiatre - fête Suprême Quarte)
5 Messidor An CCXXIII, 5,2992h - mulet
2015-W26-2T12:43:05Z
 

Paf

XLDnaute Barbatruc
Re : valeur max en fonction de deux autres colonnes

Re tous et bonjour ROGER2327


@ ROGER2327

merci pour tous ces conseils,

pour les déclarations j'ai omis les variables i et Ind. Quant à Puits et Age j'ai fait l'impasse, ne sachant pas quel type leur attribuer.

Comme il est rédigé, votre code ne nécessite pas d'ajouter la référence Microsoft Scripting Runtime au projet.

j'avais rencontré quelques soucis qui avaient nécessité l'ajout de cette référence . Après quelques tests cette référence n'est, effectivement, pas nécessaire

A+
(réponse tardive due à coupure ( au sens propre) de ma ligne téléphonique)
 

Discussions similaires

Statistiques des forums

Discussions
312 497
Messages
2 088 984
Membres
103 998
dernier inscrit
Gotteland