Probleme de recherche

Résolu
Bonjour,

J’ai créé un fichier contenant plusieurs milliers de lignes. (Ci-joint un extrait). Je souhaiterais parvenir à faire ressortir dans un tableau de synthèse le dernier prix enregistré.
Je ne sais pas s’il faut faire une macro ou une formule matricielle (les simples formules semblent ne pas marcher)?
Pouvez-vous m’aider ?

D’avance merci

http://www.cijoint.fr/cjlink.php?file=cj200904/cij9N1iUcD.xls
Configuration: Windows XP
Internet Explorer 6.0

7 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    bonjour,

    30 000lignes ==> matricielles à éviter car très lentes... donc VBA

    Tes codes sont ils toujours groupés et triés ?

    Réponse en fin de matinée ou d'apremidi (RV debtiste!!!)
    1. Merci Michel_m de regarder mon probleme.
      oui mon fichier est trié par reference puis par date.
  2. Contributeur
    Bonjour Alessia, Michel

    voici une formule avec les plages à adapter
    Formule matricielle, à valider as Ctrl + Maj + Entrée
    =INDEX($D$2:$D$15;MAX(SI($A$2:$A$15=E21;LIGNE($A$2:$A$15)-1;0)))

    si la validation est correcte, des {} encadreront automatiquement la formule

    je vois que dans ton exemple les ligne sont triées par code, est-ce toujours le cas si oui, on peut faire autrement, plus rapide avec une plage nommée glissante

    @ te lire
    1. Merci Wilfried, la formule marche. Je vais essayer de l'adapter à mon fichier.
  3. Contributeur
    re alessia, bonjour Wilfried

    tiens! ce sera intéressant de voir le temps sur 30000 lignes par les 2 méthodes: matricielle et VBA

    je passes par un dictionnary et j'attend aussi les ref groupées ou pas...

    Sub extraire_dernierprix()
    Dim dico_ref As Object
    Dim cptr As Long, derlig As Long

    Set dico_ref = CreateObject("Scripting.Dictionary")
    derlig = Range("A65536").End(xlUp).Row
    '----------collecte
    For cptr = 1 To derlig
    ref = Cells(cptr + 1, 1).Value
    If Not dico_ref.Exists(ref) Then
    dico_ref.Add ref, ref
    nbreref = Application.CountIf(Range("A2:A" & derlig), ref)

    '??? EN ATTENTE ALESSIA

    End If
    Next cptr

    Set dico_px = Nothing
    End Sub
    1. michel_m j'essaye et je vous tiens au courant pour votre macro.
      Merci
  4. Contributeur
    re:

    michel : c'est pour cela que j'ai posté, sur les exemples qui sont concis les temps passé aux calcul n'indique rien. La méthode Find et FindNext ne serait elle pas plus rapide ? on garde la derniere trouvée dans une boucle While Wend
    Allessia : la deuxième solution si ta table est triée, pas de formule matricielle mais d'autres possibilités
    ton fichier en retour avec les 2 méthodes
    https://www.cjoint.com/?efkpepPJ2T
    1. Re, c'est sensationnel!!

      Ne connaissant pas grand chose aux macros, je vais privilégier la solution de liste glissante mais je vais suivre avec attention vos echanges sur une macro possible.

      Merci infiniment à vous deux.
  5. Contributeur
    re:

    voici une fonction personnalisée : à intégrer dans un module
    Public Function C_dernier(Maplage As Range, Valeur As Range)
        C_dernier = Maplage.Find(What:=Valeur.Value, SearchDirection:=xlPrevious).Row
    End Function
    

    utilisation :
    en F1 : la formule suivante
    =INDEX(D:D;c_dernier(A:A;E21))

    Tirer vers le bas
    ça devient instantané
    1. ca aussi c'est enorme
      lool
      Comment vous savez faire tout ca?
    2. Contributeur
      @Alessiare:

      en hantant inlassablement les forums et en trouvant au début des intervenants comme Michel, Michel, Pierre, Monique, Tibo, Jocelyn et j'en passe et des meilleurs... mais tous aussi agréables que disponibles..
  6. Contributeur
    SPLEN-DI-DE cher Wilfried !
    j'arrivais avec mon truc avec les résultats dans un tableau mais...
    Bon WE et merci pour cette solution ingénieuse
    (Wilfried : tu as oublié notre ami @+thierry-rollingstones ?)
    Cordialement, Michel
    1. Contributeur
      re: michel

      je m'en voudrai longtemps, je l'ai rencontré, c'est un type génial....