[VBA] Recherche avec plusieurs conditions et résultats multiple

DVT_Sogh

XLDnaute Nouveau
Bonjour,

Je souhaite faire une recherche d'un objet en fonction d'une valeur et d'afficher dans une cellule la liste des éléments associés.
Comme cela ne risque pas d'être clair, j'ai joint un fichier exemple

Je souhaite obtenir le résultat indiqué dans la colonne Numéro de la feuille Feuil2 (ici, je l'ai noté en dur)

J'ai utilisé une fonction que j'ai modifié provenant de ce post : https://www.excel-downloads.com/threads/recherchev-mais-plusieurs-resultats-a-afficher.147441/

Cette fonction marche, elle me retourne bien la liste de tous les numéro en fonction du produit recherché.

Voici ma fonction modifiée :
Code:
Function RechTousFiltre(Produit, Filtre, ChampRecherche As Range, ChampRetourne As Range)
  a = ChampRecherche
  temp = ""
  For b = 1 To ChampRecherche.Count
    If a(b, 1) <> Filtre Then
          c = ""
    ElseIf a(b, 1) = Produit Then
      temp = temp & ChampRetourne(b) & ", "
    End If
  Next b
  RechTousFiltre = Left(temp, Len(temp) - 1)
End Function

Celle-ci ne fonctionne pas, mais je ne vois pas où se trouve le problème.

Par avance, merci pour votre aide !

[EDIT] : Ajout du fichier exemple au format Excel 2003
[EDIT 2] : Modification du titre (Ajout du préfixe VBA)
 

Pièces jointes

  • test.xls
    28.5 KB · Affichages: 81
  • test.xlsx
    10.1 KB · Affichages: 87
  • test.xls
    28.5 KB · Affichages: 90
  • test.xlsx
    10.1 KB · Affichages: 85
  • test.xls
    28.5 KB · Affichages: 82
  • test.xlsx
    10.1 KB · Affichages: 76
Dernière édition:

DVT_Sogh

XLDnaute Nouveau
Re : Recherche avec plusieurs conditions et résultats multiple

Bonjour R@chid,

Merci pour cette solution. J'avais essayer de faire quelque chose avec les formules matricielles en vain.
Malheureusement, je souhaite avoir ces numéros dans la même cellule.

Avec la fonction suivante, je récupère bien les résultats en fonction d'un paramètre (nommé ici Produit):
Code:
Function RechTous(Produit, ChampRecherche As Range, ChampRetourne As Range)
  a = ChampRecherche
  temp = ""
  For b = 1 To ChampRecherche.Count
    If a(b, 1) = Produit Then
      temp = temp & ChampRetourne(b) & ", "
    End If
  Next b
  RechTous = Left(temp, Len(temp) - 1)
End Function
J'ai essayé de la modifier comme suit pour effectuer ma recherche en fonction d'un 2nd paramètre (nommé ici Filtre) :
Code:
Function RechTousFiltre(Produit, Filtre, ChampRecherche As Range, ChampRetourne As Range)
  a = ChampRecherche
  temp = ""
  For c = 1 To ChampRecherche.Count
    If a(c, 4) <> Filtre Then
          d = ""
    ElseIf a(c, 1) = Produit Then
      temp = temp & ChampRecherche(c) & ", "
    End If
  Next c
  RechTousFiltre = Left(temp, Len(temp) - 1)
End Function

N'est-il pas possible de voir le code de cette fonction pour arriver au même résultat que ta formule ?

Merci pour ton aide (ou celle d'un autre volontaire pour m'aider !)

[EDIT] : Modification du code de la 2nde fonction (qui ne marche toujours pas)
 
Dernière édition:

DVT_Sogh

XLDnaute Nouveau
Re : [VBA] Recherche avec plusieurs conditions et résultats multiple

J'ai essayer de modifier le code de la fonction :
Code:
Function RechTousFiltre(Produit, Filtre, ChampRecherche As Range, ChampRetourne As Range)
  a = ChampRecherche
  temp = ""
  For b = 1 To ChampRecherche.Count
    If a(b, 1) = Filtre And a(b, 2) = Produit Then
      temp = temp & ChampRetourne(b) & ", "
    End If
  Next b
  RechTousFiltre = Left(temp, Len(temp) - 1)
End Function

Sans succès... :(

Je pense que c'est au niveau de la sortie du temp que se trouve le problème.

Si un Expert/Dieu/Spécialiste (rayez la mention inutile) du VBA passe par là...
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : [VBA] Recherche avec plusieurs conditions et résultats multiple

Bonsoir.
Pourriez vous joindre un classeur avec votre module contenant votre fonction et un exemple de formule l'utilisant ?
Et figez les formules =_xlfn.COUNTIFS(Feuil1!E:E;A3;Feuil1!D:D;$B$2) : ça fait des #NOM? chez moi.
P.S. J' ai quand même vue une ligne à corriger sûrement:
temp = temp & ChampRetourne(b, 1) & ", "
À +
 
Dernière édition:

DVT_Sogh

XLDnaute Nouveau
Re : [VBA] Recherche avec plusieurs conditions et résultats multiple

Bonjour Dranreb,

En pièce jointe le fichier avec le module contenant la fonction en question.

J'ai également corrigé la ligne comme préconisé : pas mieux :(

Merci pour ton aide !
 

Pièces jointes

  • test_2.xlsm
    16 KB · Affichages: 76
  • test_2.xlsm
    16 KB · Affichages: 84
  • test_2.xlsm
    16 KB · Affichages: 84

Dranreb

XLDnaute Barbatruc
Re : [VBA] Recherche avec plusieurs conditions et résultats multiple

Comme ça elle marche et donne même, avec "Retenu" sélectionné, le même résultat que dans la colonne "Numéro (manuel)".
VB:
Function RechTousFiltre(Produit, Filtre, ChampRecherche As Range, ChampRetourne As Range) ' As String
  a = ChampRecherche
  Temp = ""
  For b = 1 To ChampRecherche.Rows.Count
    If a(b, 1) = Filtre And a(b, 2) = Produit Then
      Temp = Temp & ChampRetourne(b) & ", "
    End If
  Next b
  If Temp <> "" Then Temp = Left(Temp, Len(Temp) - 2)
  RechTousFiltre = Temp
End Function
Mais elle est très longue à évaluer. Je vous proposerai une écriture différente dans un petit moment
À +

Ouais, bof. C'est un tout petit peu plus rapide comme ça:
VB:
Function RechTousFiltre(ByVal Produit As String, ByVal Filtre As String, _
   ByVal ChampRecherche As Range, ByVal ChampRetourné As Range) As String
Dim F As Worksheet, TRech() As Variant, TRetr() As Variant, Ts() As String, _
   Le As Long, Ls As Long
Set F = ChampRecherche.Worksheet
TRech = Intersect(ChampRecherche, F.UsedRange).Value
TRetr = Intersect(ChampRetourné, F.UsedRange).Value
Ls = -1
For Le = 1 To UBound(TRech, 1)
   If TRech(Le, 1) = Filtre And TRech(Le, 2) = Produit Then
      Ls = Ls + 1: ReDim Preserve Ts(0 To Ls): Ts(Ls) = TRetr(Le, 1)
      End If
   Next Le
On Error Resume Next
RechTousFiltre = Join(Ts, ", ")
If Err Then RechTousFiltre = ""
End Function
Cordialement.
 
Dernière édition:

DVT_Sogh

XLDnaute Nouveau
Re : [VBA] Recherche avec plusieurs conditions et résultats multiple

Bonjour,

Désolé, je réponds un peu tardivement... :eek:

Le 1er script est effectivement très long (dans mon cas ~15s par ligne, 1000 cas à analyser avec 63 produits différents)
Cela me prend donc 16 minutes pour faire mon traitement !

Le 2nd est quasi instantané ! J'ai réessayé en pensant avoir fait une erreur mais non, je ne sais pas pourquoi tu le vois seulement à peine plus rapide.

Merci pour le coup de main, cela va beaucoup m'aider !

PS : Dois-je changer le titre en préfixant Résolu ?
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] Recherche avec plusieurs conditions et résultats multiple

Bonsoir.
je ne sais pas pourquoi tu le vois seulement à peine plus rapide.
Je ne sais plus non plus, mais ça pouvait dépendre d'un tas de facteurs.
Dois-je changer le titre en préfixant Résolu ?
Ce n'est pas une obligation et ça laisse le truc ouvert à d'éventuelle évolutions.
Cordialement.
 

Jam

XLDnaute Accro
Re : [VBA] Recherche avec plusieurs conditions et résultats multiple

Salut à tous,

Ce que ne dis pas Dranreb (il est trop modeste) c'est pourquoi c'est beaucoup beaucoup plus rapide: bref, la réponse est très simple, au lieu de faire le traitement en lisant patiemment chaque cellule, hop on met tout ça en mémoire et roule ma poule. C'est mille fois plus performant. A garder dans un petit coin de tête quand on développe et qu'on cherche de la performance.

Bonne soirée.
 

DVT_Sogh

XLDnaute Nouveau
Re : [VBA] Recherche avec plusieurs conditions et résultats multiple

Bonjour,

Je pense que Dranreb ne s'est pas trop penché sur la raison : quand il l'avait testé, le script semblait à peine plus rapide.
Quand je l'ai testé de mon côté, la différence de vitesse était (et est toujours) impressionnante.

Dans tous les cas merci pour l'explication Jam, je l'avais compris en lisant un peu mieux le code de Dranreb.
A garder sous le coude effectivement, surtout si on veux ajouter des filtres de recherche supplémentaires !
 

Discussions similaires

Réponses
16
Affichages
981