Recherche dans tableau avec renvoi sous liste

Bonjour, Bonsoir

Tout d'abord je tiens à féliciter tout acteur de ce magnifique forum qui m'a déjà plus d'une fois répondu à mes soucis rencontrés.

Ceci dit après recherche de ma part je n'ai pas trouvé la réponse à ma demande suivante.

Un exemple avec explication vaut plus qu'un long discourt, je vous link ce fichier avec un exemple du résultat souhaité.

En vous remerciant d'avance,

13recherche.xlsx (9.88 Ko)

Bonsoir,

une solution avec une fonction personnalisée.

appel de la fonction

=critres(v,r) ou v est la valeur pour la laquelle il faut retrouver les critères et r la plage contenant le tableau où faire la recherche

sélectionner une plage de x lignes et 2 colonnes pour recevoir la réponse, introduire la formule dans la barre de formule et valider en matriciel ctrl-maj-entrée

Public Function critres(v, r As Range) As Variant
'fonction matricielle de recherche dans la plage r des critères correspondant à une valeur donnée v, sélectionner la zone de réception lors de la validation matricielle
    Application.Volatile
    Dim a As Variant
    nr = Application.Caller.Rows.Count
    nc = Application.Caller.Columns.Count
    ReDim a(1, nr)
    For k = 0 To nr
        a(1, k) = ""
        a(0, k) = ""
    Next k
    If nc <> 2 Then critres = "il faut sélectionner 2 colonnes pour le résultat": Exit Function
    k = -1
    For Each c In r
        If c.Value = v Then
            If k < nr - 1 Then
                k = k + 1
                a(0, k) = r(c.Row, 1)
                a(1, k) = r(1, c.Column)
            End If
        End If
    Next
    critres = Application.Transpose(a)
End Function
7recherche.xlsm (17.11 Ko)

Un grand Merci

Cela a répondu parfaitement à ma demande, et en un temps record , à croire que c'est un jeu d'enfant pour vous.

J'aurais encore une petite faveur ou cette fois si on effectue la même recherche mais avec deux critères connus, qui détermine la colonne de recherche, et un intervalle de recherche selon la valeur.

Ci-joint un nouveau fichier excel avec explication.

3recherche-2.xlsx (10.12 Ko)

Bonsoir,

une solution via une fonction personnalisée, à utiliser commen suit

=critresb(v;r;col;bi;bs) où v=est la valeur recherchée, r le tableau où chercher la valeur, col est la valeur du critère colonne, bi un pourcentage de v à soustraire de v pour déterminer la borne inférieure, bs un pourcentage de v à ajouter à v pour déterminer la borne supérieure.

sélectionner la zone de réception, introduire la formule dans la barre de formule et valider en matriciel (ctrl-maj-entrée)

Public Function critresb(v, r As Range, col, bi, bs) As Variant
'fonction matricielle de recherche dans la plage r, dans une colonne donnée (col), des critères d'une valeur située dans un intervalle v-bi% et v+bs%,
'sélectionner la zone de réception lors de la validation matricielle
    Application.Volatile
    Dim a As Variant
    nr = Application.Caller.Rows.Count
    nc = Application.Caller.Columns.Count
    ReDim a(nr)
    For k = 0 To nr
        a(k) = ""
    Next k
    If nc <> 1 Then critresb = "zone réception doit avoir une seule colonne": Exit Function
    k = -1
    For j = 1 To r.Columns.Count
        If r(1, j) = col Then col = j: Exit For
    Next j
    For i = 1 To r.Rows.Count
        vl = r(i, col).Value
        If vl >= v * (1 - bi) And vl <= v * (1 + bs) Then
            If k < nr - 1 Then
                k = k + 1
                a(k) = r(i, 1)
            End If
        End If
    Next i
    critresb = Application.Transpose(a)
End Function
5recherche-2.xlsm (17.63 Ko)

Merci!

Vous avez répondu à toutes mes actuelles demandes. Je passe le sujet en mode résolue.

Je ne sais pas comment ça ce programme le VBA mais voila un exemple qui me donne envie de m'y mettre. Car sans VBA je pense qu'il n'y avait pas de solution, ou bien?

En vous remerciant encore, je vous souhaite une bonne soirée

Uhm... Evidemment les volontés de mon supérieur à de nouveau changé

J'ai tenté de répondre moi-même en m'y mettant mais c'est une catastrophe pour le peut que je viens d’apprendre en VBA ce n'est pas évident.

Votre mission si toutefois vous l'accepté, sera de faire la même chose que le précédent en rajouter un intervalle aussi pour la valeur de la colonne.

Voici l'horrible code que j'ai tenté de faire ( vus que j'y comprends pas énormément cela me donne ça)

Public Function critresb(v, r As Range, col, bi, bs, bm, bp) As Variant
'fonction matricielle de recherche dans la plage r, dans une colonne donnée (col)situé dans un intervalle col-bm% et col+bp%, des critères d'un valeur situé dans un intervalle v-bi% et v+bs%,
'sélectionner la zone de réception lors de la validation matricielle
   Application.Volatile
    Dim a As Variant
    nr = Application.Caller.Rows.Count
    nc = Application.Caller.Columns.Count
    ReDim a(nc, nr)
    For k = 0 To nr
    For m = 0 To nc
        a(m, k) = ""
    Next k
    Next m
    If nc <> 1 Then critresb = "zone réception doit avoir une seule colonne": Exit Function
    k = -1
    For j = 1 To r.Columns.Count
        coln = r(i, j).Value
        If coln >= col * (1 - bm) And coln <= col * (1 + bp) Then
            If m < nc - 1 Then
                m = m + 1
                a(m, k) = r(i, j)
            End If
        End If
    Next j
    For i = 1 To r.Rows.Count
        vl = r(i, j).Value
        If vl >= v * (1 - bi) And vl <= v * (1 + bs) Then
            If k < nr - 1 Then
                k = k + 1
                a(m, k) = r(i, j)
            End If
        End If
    Next i
    critresb = Application.transpose(a)
End Function

bonsoir,

voici une proposition

Public Function critresb(v, r As Range, col, bi, bs, bm, bp) As Variant
'fonction matricielle de recherche dans la plage r, dans une colonne dont le critère col est situé dans un intervalle col-bm% et col+bp%, des critères d'une valeur située dans un intervalle v-bi% et v+bs%,
'sélectionner la zone de réception lors de la validation matricielle
    Application.Volatile
    Dim a As Variant
    nr = Application.Caller.Rows.Count
    nc = Application.Caller.Columns.Count
    ReDim a(1, nr)
    For k = 0 To nr
        a(1, k) = ""
        a(0, k) = ""
    Next k
    If nc <> 2 Then critresb = "zone réception doit avoir deux colonnes": Exit Function
    k = -1
    For j = 1 To r.Columns.Count
        coln = r(1, j).Value
        If coln >= col * (1 - bm) And coln <= col * (1 + bp) Then
            For i = 1 To r.Rows.Count
                vl = r(i, j).Value
                If vl >= v * (1 - bi) And vl <= v * (1 + bs) Then
                    If k < nr - 1 Then
                        k = k + 1
                        a(0, k) = r(i, 1)
                        a(1, k) = r(1, j)
                    End If
                End If
            Next i
        End If
    Next j
    critresb = Application.Transpose(a)
End Function
8recherche-3.xlsm (17.86 Ko)

Merci bien

piou j'ai encore du travail

Rechercher des sujets similaires à "recherche tableau renvoi liste"