Index Equiv + grande.valeur avec double conditions

JMDBOULE78

XLDnaute Junior
Bonjour @ tous,

Je cherche a faire remonter le dernier statut d'une analyse selon une double condition. J'ai tenté avec ligne mais n'y suis pas parvenu.
Idealement sans formules matricielles car la base de données est importante et peut etre que cela va ralentir, enfin je ne sais pas.

Merci pour votre soutien, j'aimerai comprendre la solution pour l'appliquer a d'autres tableaux !

Bonne soirée
 

Pièces jointes

  • test large.xlsx
    15.3 KB · Affichages: 45
  • test large.xlsx
    15.3 KB · Affichages: 44
  • test large.xlsx
    15.3 KB · Affichages: 50

JMDBOULE78

XLDnaute Junior
Re : Index Equiv + grande.valeur avec double conditions

Bonsoir Gosselien,

Bien vu c'est une notion que je n'avais pas intégré. J'ai refais le fichier avec ma demande initiale, parce que je vais avoir ce cas, et puis le meme avec les dates, la gestion des dates pour moi est difficile dans Excel....

Merci beaucoup
 

Pièces jointes

  • test large.xlsx
    15.8 KB · Affichages: 43
  • test large.xlsx
    15.8 KB · Affichages: 46
  • test large.xlsx
    15.8 KB · Affichages: 53

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Index Equiv + grande.valeur avec double conditions

Bonsoir JMDBOULE78, gosselien :),

Un essai avec une feuille auxiliaire qu'on peut masquer sans aucune formule matricielle (et sans date :p). Pour l'adapter à la taille de votre fichier, il faut suffisamment recopier les formules de la feuille auxiliaire vers la droite et vers le bas.
 

Pièces jointes

  • JMDBOULE78-test large v1.xlsx
    74.1 KB · Affichages: 75
Dernière édition:

CISCO

XLDnaute Barbatruc
Re : Index Equiv + grande.valeur avec double conditions

Bonsoir

Cf. en pièce jointe, avec une formule... matricielle. Si ça rame trop, ça doit être faisable avec une colonne intermédiaire.

@ plus
 

Pièces jointes

  • test large.xlsx
    11.3 KB · Affichages: 68
  • test large.xlsx
    11.3 KB · Affichages: 64
  • test large.xlsx
    11.3 KB · Affichages: 60

JMDBOULE78

XLDnaute Junior
Re : Index Equiv + grande.valeur avec double conditions

Bonjour Merci Mapomme de votre réponse. J'ai appliqué votre méthode elle fonctionne, la limite de la feuille auxiliaire est que j'ai beaucoup de combinaison possible dans le vrai fichier et que je vais aller au bout des colonnes.
Merci de cette option. Bon weekend de Pâques
 

JMDBOULE78

XLDnaute Junior
Re : Index Equiv + grande.valeur avec double conditions

Bonjour Cisco, merci de la solution. Je l'ai mise en place dans un premier fichier, tout fonctionne. Sur le "gros" fichier cela ne fonctionne plus. J'ai bien pris soin de trier les données (dates plus anciennes à plus récentes) puis par mon deuxième critère, les formules matricielles sont bien recopiés et activées par CTR MAJ ENTREE. Je n'arrive pas à comprendre d'ou vient l'erreur.
Merci bon weekend de PAques
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Index Equiv + grande.valeur avec double conditions

Bonjour à tous,

Une autre proposition par VBA sans colonne Date. Pour un couple (article, magasin), on stocke le dernier état en parcourant le tableau du bas vers le haut En fait on ne sert que des colonnes C à E du tableau initial. J'ai utilisé la feuille Pour jeu de test pour la procédure de création du jeu de test.

Le code est dans le module de code de la feuille Sheet1 :
VB:
Sub DansQuelEtatJerre()
Dim tablo, i&, k&, premLig&, nLig&, derLig&, clef, kis, nbr&
Dim dico, res()

  Set dico = CreateObject("scripting.dictionary")
  dico.CompareMode = vbTextCompare
  nLig = Cells(Rows.Count, "c").End(xlUp).Row
  
  ' En partant du bas du tableau source, par bloc de 20000 lignes
  ' on stocke les couples (articles,magasin) avec leur état dans dico.
  ' On stocke le premier couple rencontré (du bas vers le haut).
  ' Si un couple est déjà dans dico, on abandonne le couple en cours
  ' puisque son dernier état est déjà dans le dico
  For i = nLig To 3 Step -20000
    derLig = i: premLig = i - 20000 + 1: If premLig < 3 Then premLig = 3
    tablo = Range(Cells(premLig, "c"), Cells(derLig, "e"))
    For k = UBound(tablo) To 1 Step -1
      clef = tablo(k, 1) & "\" & tablo(k, 2)
      If Not dico.Exists(clef) Then dico.Add clef, tablo(k, 3)
    Next k
  Next i
  
  ' on efface la précedente zone de résultat
  Range("h2:j" & Rows.Count).Clear: Range("h2:j2") = Range("c2:e2").Value
  nbr = dico.Count - 1
  If nbr < 0 Then
    MsgBox "Aucune donnée en résultat -> Echec"
    Exit Sub
  End If
  
  ' construire le tableau des résultats et l'afficher
  ReDim res(0 To nbr, 0 To 2): i = 0
  For Each kis In dico.Keys
    k = InStr(kis, "\"): res(i, 0) = Left(kis, k - 1)
    res(i, 1) = Mid(kis, k + 1): res(i, 2) = dico(kis)
    i = i + 1
  Next kis
  Range("h3").Resize(nbr + 1, 3) = res
  
  'formatage et tri du résultat
  Set dico = Nothing
  Range("h2").Resize(nbr + 2, 3).Borders.LineStyle = msoLineSingle
  Range("h2").Resize(, 3).Interior.Color = RGB(200, 200, 200)
  Range("h2").Resize(, 3).Font.Bold = True
  Range("h2").Resize(nbr + 2, 3).Sort _
      key1:=Range("h2"), key2:=Range("i2"), Header:=xlYes, _
      order1:=xlAscending, order2:=xlAscending
  Range("h2").Resize(, 3).EntireColumn.AutoFit
  MsgBox "Traitement terminé"
  Application.Goto [a1], True
End Sub

edit : Pour tenter de résoudre un PB quand on ouvre le fichier en avec Excel 2003, et pour tenir compte du fait que le tableau d'entrée n'est peut-être pas trié par valeur de CONTROL, voir la version v2 ICI.
 

Pièces jointes

  • JMDBOULE78-sans date via macro-v1.xlsm
    26.4 KB · Affichages: 47
Dernière édition:

klin89

XLDnaute Accro
Re : Index Equiv + grande.valeur avec double conditions

Bonjour à tous, :)

Si j'ai bien compris, parmi tous les doublons, on retient le dernier en date.
Ici, il n'est pas nécessaire de trier les données.
VB:
Option Explicit

Sub Doublon_Dernier_En_Date()
Dim a, i As Long, j As Long, txt As String, n As Long
    Application.ScreenUpdating = False
    With Sheets("Sheet1").Range("a1").CurrentRegion
        a = .Value
        With CreateObject("Scripting.Dictionary")
            .CompareMode = 1
            For i = 1 To UBound(a, 1)
                txt = Join$(Array(a(i, 2), a(i, 3)))
                If Not .exists(txt) Then
                    n = n + 1
                    .Item(txt) = n
                    For j = 1 To UBound(a, 2)
                        a(n, j) = a(i, j)
                    Next
                Else
                    If a(.Item(txt), 1) < a(i, 1) Then
                        For j = 1 To UBound(a, 2)
                            a(.Item(txt), j) = a(i, j)
                        Next
                    End If
                End If
            Next
        End With
        With .Offset(, .Columns.Count + 1)
            .CurrentRegion.Clear
            .Cells(1).Resize(n, UBound(a, 2)).Value = a
            With .CurrentRegion
                .Font.Name = "calibri"
                .Font.Size = 10
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .Borders(xlInsideVertical).Weight = xlThin
                .BorderAround Weight:=xlThin
                With .Rows(1)
                    .Font.Size = 11
                    .Interior.ColorIndex = 38
                    .BorderAround Weight:=xlThin
                End With
                .Columns.AutoFit
                .Sort key1:=.Cells(1), order1:=1, Header:=1
            End With
        End With
    End With
    Application.ScreenUpdating = True
End Sub
Edit : il faut remplacer cette ligne :
VB:
If a(.Item(txt), 1) < a(i, 1) Then
par celle ci :
VB:
If a(.Item(txt), 1) <= a(i, 1) Then
J'ai aussi rajouté cette ligne de tri :
VB:
.Sort key1:=.Cells(1), order1:=1, Header:=1
mapomme, avec le convertisseur, je n'arrive pas à ouvrir le fichier du post #10, mon excel plante :p
C'est tout bon, mapomme :)

klin89
 

Pièces jointes

  • JMDBOULE78.xls
    45.5 KB · Affichages: 48
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Index Equiv + grande.valeur avec double conditions

Bonsoir klin89 :),

(...) mapomme, avec le convertisseur, je n'arrive pas à ouvrir le fichier du post #10, mon Excel plante :p
(...)

Bon j'ai refait une version Excel 2003. J'en ai profité pour partir d'un tableau source qui n'est pas forcément trié. La clef est le numéro de CONTROL . On prend l'état du couple (produit-n,Magasin-m) qui a le CONTROL le plus élevé.

C'est une version 2003 enregistrée sur un Excel 2010. Excel ne me signale aucune incompatibilité. J'espère que tu pourras l'ouvrir.
 

Pièces jointes

  • JMDBOULE78-sans date via macro-v2.xls
    58.5 KB · Affichages: 53
Dernière édition:

JMDBOULE78

XLDnaute Junior
Re : Index Equiv + grande.valeur avec double conditions

Bonjour a tous,

Apres différents essais, des différentes propositions dont je vous remercie vivement, j'ai essayé cette solution avec la formule matricielle, mais le resultat ne semble pas prendre en compte la date. Y aurait il quelquechose que j'aurais omis. Faut il trier pour les formules matricielles ?
Merci @ tous et bonne journée
 

Pièces jointes

  • TEST 2.xlsx
    13.4 KB · Affichages: 44
  • TEST 2.xlsx
    13.4 KB · Affichages: 53
  • TEST 2.xlsx
    13.4 KB · Affichages: 59

Dugenou

XLDnaute Barbatruc
Re : Index Equiv + grande.valeur avec double conditions

Bonjour,
La formule suivante (validée en matriciel sur 1 seule cellule puis recopiée vers le bas) semble fonctionner dans le fichier test.
Code:
=INDEX(F$1:F$21;MAX(SI(A$2:A$21&B$2:B$21&D$2:D$21=H3&I3&J3;LIGNE(A$2:A$21);0)))

Cordialement
 

CISCO

XLDnaute Barbatruc
Re : Index Equiv + grande.valeur avec double conditions

Bonjour à tous

Et oui, Jmdboule78, comme tu as plusieurs fois les mêmes dates dans la colonne E, le EQUIV utilisé dans ma précédente proposition renvoie la donnée correspondant à la première ligne contenant la date max considérée, et pas la dernière. Pour corriger cela, il faut différencier ces dates identiques, par exemple en les pondérant avec un +LIGNE(E$2:E$21)/1000, ou, comme le propose Dugenou, et bien plus simplement, en renvoyant le n° de la ligne avec LIGNE($2:$21) (pas besoin du 0 final de la proposition de Dugenou) , plutôt que la date.

Code:
=INDEX(F$1:F$21;MAX(SI(A$2:A$21&B$2:B$21&D$2:D$21=H3&I3&J3;LIGNE($2:$21))))
toujours en matriciel

@ plus
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa