Créer une rechercheV avec correspondances multiples

Bonjour à tous,

Je travaille dans la comptabilité et suis souvent amené à faire des rapprochements entre deux bases de données.

Pour gérer les correspondances multiples, ma méthode actuelle est de faire une recherchev et à côté un nb.si qui m'indique s'il y a plusieurs correspondances ou non. S'il y en a plusieurs, je vais les chercher manuellement.

Je voudrais m'épargner ce travail car lorsqu'on travaille sur des bases avec quelques milliers de lignes, ça prend la journée !

J'aimerais donc créer une fonction "RechercheVMultiple" qui me permettrait de faire sortir toutes les correspondances d'un coup !

En colonne E il y a la recherche V normale (=RECHERCHEV(D2;A:B;2;0) pour la cellule E2), en colonne F le résultat obtenu avec ma fonction :

Function recherchevmultiple(c)
If Application.CountIf([A:A], c.Value) = 0 Then Resultat = "aucune correspondance"
If Application.CountIf([A:A], c.Value) = 1 Then Resultat = Application.VLookup(c.Value, [A1:B10], 2, 0)
If Application.CountIf([A:A], c.Value) > 1 Then Resultat = "plusieurs correspondances"
recherchevmultiple = Resultat
End Function

Comme vous pouvez le constater, je ne sais pas comment faire pour que ma fonction ait les mêmes arguments qu'une recherchev normale du coup je suis obligé de les rentrer en VBA. Idéalement, il faudrait que RechercheVMultiple demande le critère, la plage, le numéro de colonne à renvoyer avec toujours une correspondance exacte.

Enfin, en colonne G vous trouverez le résultat que je souhaite obtenir avec cette fonction.

Pouvez-vous m'aider ? Ce serait merveilleux !

Merci d'avance.

J'y suis presque !

Function RECHERCHEVMULTIPLE(C As Variant, Plage As Range, Colonne As Integer) As Variant
If Application.CountIf(Plage.Columns(1), C.Value) > 0 Then
    Dim Resultat As String
    Dim Boucle As Integer
        For Boucle = 1 To [b]N[/b]
                If Plage(Boucle, 1) = C Then
                    Resultat = Resultat & "/" & Plage(Boucle, Colonne)
                End If
    Next Boucle
Else
Resultat = "x"
End If
RECHERCHEVMULTIPLE = Right(Resultat, Len(Resultat) - 1)
End Function

La dernière chose : Je voudrais que N soit le rang de la dernière cellule non vide de la première colonne de la plage. Comment faire ?

Merci !

Comment faire ?

code qui determine la derniere ligne d'un tableau:

N= cells(rows.count, "A").end(xlup).row

a placé avant "For Boucle = 1 To N".

Merci, mais avec ça, ça ne me donne que le rang de la dernière cellule non vide de la colonne A, non ? Mais la plage que je sélectionne ne contient pas forcément la colonne A...

ça ne me donne que le rang de la dernière cellule non vide de la colonne A, non ?

c'est ca mais tu peut modifier la colonne, si la A est vide.

Mais la plage que je sélectionne ne contient pas forcément la colonne A...

Mais la derniere ligne du tableau varie en fonction de la colonne?

ça peut ^^

C'est vrai qu'il y a peu de chances mais on ne sait jamais... En fait si je le sais ça ne pose pas problème mais il faudrait que toutes les personnes de ma boîte, y compris ceux qui ne savent pas faire une macro, puissent l'utiliser sans risque.

ce n'est qu'un compteur de ligne, il ne fait aucune modification.Donc la pire chose qu'il puisse faire c'est ...compter des lignes, precise le classeur et la feuille si tu as des doutes.

Finalement j'ai laissé de 1 à 10 000 ça va bien aussi, il faudra juste que je me méfie des bases un peu plus grosses, ce qui est rare.

J'ai ajouté un argument à ma fonction qui permet de rechercher également des chaînes de caractères. J'en suis très content

Function OPTIONCELLULE(Cellule1 As Variant, Plage1 As Range, Colonne1 As Integer) As Variant
If Application.CountIf(Plage1.Columns(1), Cellule1.Value) > 0 Then
Dim Resultat1 As String
Dim Boucle1 As Integer
For Boucle1 = 1 To 10000
If Plage1(Boucle1, 1) = Cellule1 Then
Resultat1 = Resultat1 & "/" & Plage1(Boucle1, Colonne1)
End If
Next Boucle1
Else
Resultat1 = "xAucune correspondance"
End If
OPTIONCELLULE = Right(Resultat1, Len(Resultat1) - 1)
End Function

Function OPTIONCHAINE(Cellule2 As Variant, Plage2 As Range, Colonne2 As Integer) As Variant
If Application.CountIf(Plage2.Columns(1), "*" & Cellule2.Value & "*") > 0 Then
Dim Resultat2 As String
Dim Boucle2 As Integer
For Boucle2 = 1 To 10000
Chaine = "*" & Cellule2.Value & "*"
If Plage2(Boucle2, 1) Like Chaine Then
Resultat2 = Resultat2 & "/" & Plage2(Boucle2, Colonne2)
End If
Next Boucle2
Else
Resultat2 = "xAucune correspondance"
End If
OPTIONCHAINE = Right(Resultat2, Len(Resultat2) - 1)
End Function

Function RECHERCHE1POURN(Cellule3 As Variant, Plage3 As Range, Colonne3 As Integer, I As Integer) As Variant
Dim Resultat3 As String
If I = 1 Then
Resultat3 = OPTIONCHAINE(Cellule3, Plage3, Colonne3)
ElseIf I = 0 Then
Resultat3 = OPTIONCELLULE(Cellule3, Plage3, Colonne3)
Else
Resultat3 = "Erreur argument"
End If
RECHERCHE1POURN = Resultat3
End Function

Merci beaucoup pour votre aide !

Rechercher des sujets similaires à "creer recherchev correspondances multiples"