Recherche dans un tableau

en regardant bien les résultats il y a des erreurs sur certains pilotes et je ne trouve pas la raison

Pour ma part, j'aurais apprécié que tu précises pour quels pilotes: ça permettrait de chercher une explication au résultat erroné.

Bonne nuit

Voilà la même chose en deux fonctions :

Function TROUVERPREM(v As String, Tb As Range) As Integer
    Dim i%
    Application.Volatile
    If Tb.Columns.Count <> 3 Then Exit Function
    With Tb
        For i = 1 To .Rows.Count
            If .Cells(i, 3) = v Then
                TROUVERPREM = .Cells(i, 1).MergeArea.Cells(1, 1)
                Exit For
            End If
        Next i
    End With
End Function

Function TROUVERDER(v As String, Tb As Range) As Integer
    Dim i%
    Application.Volatile
    If Tb.Columns.Count <> 3 Then Exit Function
    With Tb
        For i = .Rows.Count To 1 Step -1
            If .Cells(i, 3) = v Then
                TROUVERDER = .Cells(i, 1).MergeArea.Cells(1, 1)
                Exit For
            End If
        Next i
    End With
End Function

A voir si ça améliore.

Cordialement.

14julien-f1.xlsm (149.53 Ko)

MFerrand

Je viens d'essayer ta nouvelle solution mais c'est toujours très lent et les modifications que je peux faire ne sont pas toujours pris en compte ou ça bug, je ne sais pas trop. Autre soucis si je ferme le fichier et que je le ré-ouvre le temps d'ouverture est également très long!

U.Milité

Je confirme qu'il doit y avoir un soucis dans ta formule car j'ai une première erreur sur le pilote Aguri Suzuki (Début F1 en 1988 alors qu'il trouve 1989 dans ta formule. Pareil pour Alan Brown (Fin F1 en 1955 alors que c'est 1954 si on vérifie sur l'onglet F1).

Avantage de ta solution cependant, aucun ralentissement.

Bonsoir,

Avant toute chose, une précision me semble utile: je ne me place en aucun cas en position de concurrence avec la proposition de MFerrand. Si j'insiste pour connaître le fin mot de l'histoire, c'est juste parce que j'aime comprendre! En aucun cas parce qu'une solution serait "meilleure".

Ceci étant posé, je ne savais pas que les erreurs relevées l'étaient dans ton "vrai" fichier. Nous ne disposons pas, ici, des années 1988-1989 et moins encore de 1954-1955. Impossible donc de trouver la source de l'erreur!

La seule chose que j'ai pu faire est de comparer les résultats (sur ton dernier fichier transmis) des deux propositions. Sur les 208 résultats obtenus, une seule différence apparaît au niveau de l'année de fin pour Pedro De La Rosa. Cette inégalité est liée à une différence au niveau de la casse: en 2012 on a, en colonne C de la feuille F1 Pedro De LA Rosa

Si ton fichier est trop "lourd" tu pourrais en supprimer toutes les colonnes au-delà de C.

Bonsoir

Même en supprimant toutes les colonnes et en ne gardant que l'essentiel mon fichier dépasse les 500Ko.

De mon côté, en supprimant les colonnes et feuille inutiles, j'arrive à une taille de fichier acceptable, apparemment.

Je n'obtiens pas les mêmes résultats que ceux que tu indiquais!? J'ai laissé tes résultats et ajouté une MFC pour repérer les différences. Il me semble n'en avoir vu que trois; pour la première (ligne 483) et sauf erreur de ma part, il me semble que le résultat donné par la formule est correct ... à toi de vérifier!

Effectivement ça marche. .

Merci beaucoup pour votre aide.

Bonjour,

Autre proposition : abandon de fonctions au profit d'une procédure de mise à jour.

Sub MajDébutFin()
    Dim plF1 As Range, plPilotes As Range, plDébutFin As Range
    Set plF1 = Worksheets("F1").Range("A1:C1")
    Set plPilotes = Worksheets("Stats").Range("A2")
    Set plDébutFin = Worksheets("Stats").Range("B2:C2")
    MajDF plF1, plPilotes, plDébutFin
End Sub

Sub MajDF(plS As Range, plP As Range, plC As Range)
    Dim dad As Object, daf As Object, n%, i%, k%, DF()
    If plS.Columns.Count < 2 Then
        MsgBox "La zone de recherche doit comprendre au moins deux colonnes.", vbInformation, _
         "Définition de plage erronée"
        Exit Sub
    End If
    If plP.Columns.Count > 1 Then
        MsgBox "La liste des pilotes à rechercher est sur une seule colonne.", vbInformation, _
         "Définition de plage erronée"
        Exit Sub
    End If
    If plC.Columns.Count <> 2 Then
        MsgBox "La zone de résultats est nécessairement sur deux colonnes.", vbInformation, _
         "Définition de plage erronée"
    End If
    i = plS.Column + plS.Columns.Count - 1
    With plS.Worksheet
        n = .Cells(.Rows.Count, i).End(xlUp).Row
    End With
    n = n - plS.Row + 1
    Set plS = plS.Resize(n)
    i = plP.Column
    With plP.Worksheet
        n = .Cells(.Rows.Count, i).End(xlUp).Row
    End With
    n = n - plP.Row + 1
    Set plP = plP.Resize(n)
    Set plC = plC.Resize(n)
    ReDim DF(1 To n, 1 To 2)
    Set dad = CreateObject("Scripting.Dictionary")
    Set daf = CreateObject("Scripting.Dictionary")
    With plS
        k = .Columns.Count
        For i = 1 To .Rows.Count
            If Not dad.exists(.Cells(i, k).Value) Then _
             dad(.Cells(i, k).Value) = .Cells(i, 1).MergeArea.Cells(1, 1)
        Next i
        For i = .Rows.Count To 1 Step -1
            If Not daf.exists(.Cells(i, k).Value) Then _
             daf(.Cells(i, k).Value) = .Cells(i, 1).MergeArea.Cells(1, 1)
        Next i
    End With
    With plP
        For i = 1 To .Rows.Count
            If dad.exists(.Cells(i, 1).Value) Then
                DF(i, 1) = dad(.Cells(i, 1).Value)
                DF(i, 2) = daf(.Cells(i, 1).Value)
            End If
        Next i
    End With
    plC.Value = DF
End Sub

Il y a 2 procédures : la première est attachée à un bouton et définit les 3 plages nécessaires à la recherche :

  • plage de recherche, 2 col. au moins, dans la 1re on trouve les années, dans la dernière les pilotes
  • liste des pilotes, une seule colonne
  • zone de résultats, 2 colonnes.
Si des changements de positionnements interviennent, il suffira de les modifier dans cette procédure, chargé de lancer la seconde qui fait le boulot.

Seule la première ligne de chaque plage est à définir, la proc. se charge du reste !

La procédure vérifie au démarrage que le nombre de colonnes des plages qui lui sont passées est conforme et signale s'il y a une anomalie (et s'interrompt alors)...

Cela devrait enterrer les problèmes de lenteur, et il suffira d'appuyer sur un bouton pour mettre à jour.

Cordialement.

16julien-f1.xlsm (137.59 Ko)

Ouh là là, c'est encore très compliqué pour moi tout ça.

J'essayerai et merci encore

En quoi ? Ça fabrique le tableau que tu as toi-même défini !

Tu n'as plus rien à faire une fois que la formule est en place, et elle est forcément plus simple que n'importe quelle autre.

J'ai réussi mais comme j'ai beaucoup de mal, sur mon tableau les résultats sont en colonne C et D car en colonne B j'ai les nationalités des pilotes.

Sur le fichier que j'ai partagé j'ai supprimé cette colonne B donc les résultats apparaissent en colonne B et C du coup ta macro écrase la colonne B par 'Début F1'. Et évidemment je ne sais pas remédier à ce problème

Bonjour,

Je crois l'avoir expliqué dans mon dernier poste et c'est de toutes façons détaillé dans le module : commentaires qui précèdent la première macro, c'est là que tu ajustes les références de plage pour le calcul quand tu modifies leur emplacement...

Tu as 3 plages :

- Ta base, dans laquelle on recherche, une colonne comporte les années, une autres les noms des pilotes. Dans le modèle, les années sont en A, les pilotes en C, et les données commencent ligne 1 :

la plage à définir est donc : A1:C1

Si tu supprimes la colonne B, les pilotes vont se trouver en B, la plage va donc devenir : A1:B1

Supposons que tu rajoutes une colonne avant les années, celles-ci passent en B, tu intercales une autre col. supplémentaire entre années et pilotes, ceux-ci se retrouvent en E, et tu ajoutes une ligne pour les en-têtes, les données commencent alors ligne 2 ; la plage à définir est alors devenue : B2:E2

Cette plage de référence pour la recherche est à placer dans la 1re macro pour définir la variable plF1. Si le nom de la feuille a changé, il convient aussi de le modifier dans la macro.

- La 2e plage de référence est la liste des pilotes pour lesquels tu veux faire la recherche. Cette liste est sur une colonne. Dans le modèle, elle figure en colonne A et débute ligne 2. La plage à référencer est donc : A2

Pareil que précédemment, si la colonne change, la ligne de départ change, tu ajustes. Elle est en B, tu la fais démarrer ligne 3, la référence devient : B3

Tu modifies cette référence dans la macro pour la variable plPilotes. Si le nom de feuille change, il faut le modifier également.

- La 3e plage est la zone où tu attends les résultats. Cela va être une plage à 2 colonnes (début/fin). Généralement, tu vas la placer en regard de la liste des pilotes, débutant à la même ligne pour qu'on sache de qui c'est l'année de début et l'année de fin ! (rien n'empêche de faire autrement, mais cela deviendrait sans doute difficile à lire... ). Cette plage peut être immédiatement contiguë à la liste des pilotes, c'est le cas dans le modèle, où elle se référence : B2:C2

mais tu peux intercaler par exemple deux colonnes entre la liste et les années début/fin, elle devient alors : D2:E2

Cette référence concerne dans la macro la variable plDébutFin. Le nom de feuille est à ajuster également s'il y a lieu.

Le rôle de cette petite macro de lancement est de te permettre ces ajustements de références des plages concernées. On n'a à en définir que les colonnes et la première ligne (la procédure de recherche se chargera de les dimensionner). Elle affecte les références que tu fixes là-dedans à des variables plage qu'elle passe à la procédure de recherche (sur laquelle tu n'as donc jamais à intervenir).

Cordialement.

Super MFerrand ça fonctionne à merveille et aucun ralentissement

Merci beaucoup, me voilà avec 2 solutions maintenant

Tant que j'y suis j'aimerai savoir si il est possible et relativement simple de créer une colonne avec comme résultat l'évolution d'un pilote?

Par exemple un pilote classé 10ème marque 10 point de plus, se retrouve à la 8ème position. Le résultat est donc +2

Merci

Je ne sais pas... il faut voir où sont les données à prendre en compte et où doit être le résultat comme toujours...

Je laisse la main aux intervenants sur formules (si une formule, pas trop compliquée, peut répondre à la question, inutile de mobiliser VBA). Ceci dit si la situation s'avère compliquée par formules, cela ne veut pas dire qu'elle sera plus simple en VBA !

J'ai de la vaisselle en retard... !

Cordialement.

Rechercher des sujets similaires à "recherche tableau"