Rechercher dernière valeur dans une matrice

Bonjour à tous

Je suis confronté à un problème qui ne doit pourtant pas être insoluble.

C'est toujours pareil: au début on calcule à la main.

Puis le fichier s'étoffe, s'épaissit, et on fait des petites formules qui tiennent la route.

Et puis ça continue de grossir, on fabrique une usine à gaz qui met 3h quand on appuie sur F9 pour recalculer...

bref

Je vous joins un exemple tout simple mais qui résume un peu ce qui m'embête.

J'ai une matrice avec des livraisons que j'effectue à des clients.

J'ai donc la date, le client, le détail, la facturation...

Et je souhaiterais ajouter la facturation accumulée pour le client (ou pour tel produit) à chaque ligne.

C'est là que cela ce complique, car je recherche donc la ligne précédente du client (ou du produit), dans une matrice qui contient plusieurs fois ce client (ou produit).

Et c'est la difficulté, car la fonction "recherchev" ne contemple pas la possibilité de rechercher la dernière apparition d'une donnée, mais juste la seule apparition d'une donnée.

Donc ma solution actuelle, c'est d'utiliser la fonction "recherchev" mais en indiquant la matrice à la main (par exemple $A$3:$V$7).

Cela fonctionne, mais quand on a 50.000 lignes dans son fichier, et que je veux créer une nouvelle statistique, il ne me reste plus qu'à tout reprendre manuellement.

Et là, je n'en ai pas trop le courage.

Et surtout, j'ai l'impression de faire l'idiot car il y a sûrement un moyen plus simple.

Merci à vous

Bonsoir elaviron,

Voici un exemple en utilisant sommeProd

Bonsoir,

Voici un exemple avec SOMMEPROD également. Florian53 a été plus rapide.

Cdt

Henri

9elaviron-test.xlsx (11.38 Ko)

Rebonsoir

un autre exemple

  • Tableau avec SOMMEPROD amélioré
  • Tableau croisé Dynamique
Les données sont également saisies dans un tableau (Tableau1). Le nom du client et le type de produit sont choisis avec des listes déroulantes dynamiques.

Cdt

Henri

Merci beaucoup pour les réponses rapides.

La fonction "sommeprod" ne m'est pas utile dans mon cas, car me donne le résultat total et non étape par étape.

Dans mon exemple, je veux pouvoir récupérer, pour chaque ligne le cumulé, comme je l'ai indiqué dans l'exemple, mais juste pour le client A dans la colonne F.

Sauf qu'au lieu de devoir le calculer à la main, ou de devoir utiliser une formule du style :

=recherchev(B16;$B$14:$F$15;5;0)+E16

qui ne me sert pas pour d'autres dates, car la matrice "B14:F15" change, je voudrais une formule que je puisse copier/coller partout.

Si la formule recherchev(B16;$B$14:$F$15;5;0) peut se traduire par "rechercher exactement la valeur en B16 dans la matrice B14:F15 et renvoyer la valeur de la 5ème colonne"

je voudrais une formule correspondant à : "rechercher exactement la valeur en B16 dans la matrice B1:F15, et renvoyer la valeur de la 5ème colonne correspondant à la dernière itération de B16 dans la matrice B1:F15 (car il y en a plusieurs dans la matrice) "

Après... il n'y a peut-être pas de solutions.

Si j'avais exactement la même distribution de produits et de clients dans le temps, cela serait facile, car les blocs seraient homogènes, comme par exemple:

Client A

Client B

Client C

Client D

Client A

Client B

Client C

Client D

Client A

Client B

Client C

Client D

Mais ce n'est malheureusement pas le cas.

J'ai trouvé une solution qui n'en est pas vraiment une, qui consisterait à contourner le problème pour rendre chaque client "unique"

Je rajoute une colonne et je dis que le client A commence par 1, le client B commence par 1.000, le client C commence par 10.000.000, etc...

Et à chaque fois j'incrémente mon compteur manuellement (ou avec une formule si quelqu'un a, mais on est dans le même cas)

Cela ferait quelque chose comme cela, et je pourrai alors sans avoir à conditionner ma matrice, rechercher l'itération N-1 dans la matrice globale

Client A 1

Client B 1.000

Client C 1.000.000

Client D 1.000.000.000

Client A 2

Client B 1.001

Client C 1.000.001

Client D 1.000.000.001

Client A 3

Client B 1.002

Client C 1.000.002

Client D 1.000.000.002

Si j'ai bien compris ta demande je pense que mon post précédent répond à tes critères mise à part que tu souhaites seulement le cumulé du client A

Voici un nouveau fichier

Bonsoir à tous,

Formule matricielle à recopier ver le bas à partir de F4

{=SOMME(SI(B4=$B4:B$4;$E$4:E4))}

klin89

Bonjour et merci à tous.

Effectivement, les solutions proposées fonctionnent et vont m'aider lorsqu'il s'agit de sommes.

Mais comme j'expliquais dans le premier message, je veux plutôt récupérer la ligne, car comme cela, je peux avoir plein d'informations, l'exemple que je vous ai proposé étant très abrégé.

Par exemple avec la ligne, je peux savoir la dernière fois que le client a passé commande, histoire de le relancer

re elaviron

Comme ceci :

Option Explicit
Sub test()
Dim dico As Object, i As Long
    Set dico = CreateObject("Scripting.Dictionary")
    dico.comparemode = 1
    With Sheets(1)
        .Columns("G").ClearContents
        For i = 4 To .Range("A" & Rows.Count).End(xlUp).Row
            If Not dico.exists(.Cells(i, 2).Value) Then
                dico(.Cells(i, 2).Value) = VBA.Array(i, .Cells(i, 5).Value)
            Else
                dico(.Cells(i, 2).Value) = VBA.Array(i, dico(.Cells(i, 2).Value)(1) + .Cells(i, 5).Value)
            End If
        Next
        For i = 0 To dico.Count - 1
            .Cells(dico.Items()(i)(0), 7).Value = dico.Items()(i)(1)
        Next
    End With
    Set dico = Nothing
End Sub

klin89

Wouaw!

Trop classe.

Mes souvenirs de programmation remontant à plus de 20 ans, si j'ai bien tout compris, l'exemple est fourni pour la facturation et renvoie la valeur demandée dans la colonne G.

Donc si je veux la dernière date, par exemple, je dois remplacer "Cells(i, 5).Value" par "Cells(i, 1).Value"

Rechercher des sujets similaires à "rechercher derniere valeur matrice"