Créer une rechercheV avec correspondances multiples

Waldstein

XLDnaute Nouveau
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 !

Pour l'instant j'ai réussi à avoir ça :

Sans titre.jpg

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.
 

Pièces jointes

  • Sans titre.jpg
    Sans titre.jpg
    45.5 KB · Affichages: 56
  • Sans titre.jpg
    Sans titre.jpg
    45.5 KB · Affichages: 59

pierrejean

XLDnaute Barbatruc
Re : Créer une rechercheV avec correspondances multiples

Bonjour Waldstein

Bienvenue sur XLD

Nous avons énormément de difficulté à travailler sur des images
Avec un petit fichier exemple (sans données confidentielles ) je te promets que tu auras des réponses
 

Waldstein

XLDnaute Nouveau
Re : Créer une rechercheV avec correspondances multiples

Bonjour pierrejean,

Voici un fichier avec ma macro et l'âge de plusieurs personnes.
Maintenant, devant chaque âge, j'arrive à faire la liste des personnes correspondantes avec ceci :

Function RECHERCHEVMULTIPLE(Cellule As Variant, Plage As Range, colonne As Integer) As Variant
If Application.CountIf(Plage.Columns(1), Cellule.Value) > 0 Then
Dim Resultat As String
Dim boucle As Integer
For boucle = 1 To N
If Plage(boucle, 1) = Cellule Then
Resultat = Resultat & "/" & Plage(boucle, colonne)
End If
Next boucle
Else
Resultat = "xAucune correspondance"
End If
RECHERCHEVMULTIPLE = Right(Resultat, Len(Resultat) - 1)
End Function

Mais je peux être amené à traiter des bases de plusieurs milliers de lignes et à la place de N je voudrais le rang de la dernière cellule non vide de la première colonne de la plage sélectionnée.

Merci !
 

Pièces jointes

  • Classeur1.xlsm
    14.7 KB · Affichages: 31
  • Classeur1.xlsm
    14.7 KB · Affichages: 34
  • Classeur1.xlsm
    14.7 KB · Affichages: 36

Waldstein

XLDnaute Nouveau
Re : Créer une rechercheV avec correspondances multiples

Merci pour ton aide, pierrejan :) Par contre il faut sélectionner une plage et pas des colonnes. Du coup j'ai fait le code suivant et pour les bases de plus de 10 000 lignes je modifierai la fonction. J'ai maintenant une fonction de recherchev 1 pour n qui peut aussi gérer des chaînes de caractère. J'en suis bien 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 pour ton aide en tout cas !
 

Discussions similaires

Statistiques des forums

Discussions
312 112
Messages
2 085 417
Membres
102 885
dernier inscrit
AISSOU