XL 2013 Recherche v - afficher toutes les occurrences

Comfortably_Numb

XLDnaute Junior
Bonjour à tous !

Voici je suis sur un tableau simple, prenons deux colonnes la première avec code relatif à une ville et l'autre avec une désignation représentant une activité. Par ex :

402 course à pieds
500 flipper
505 vélo
402 basket

Vous remarquez que le code 402 revient deux fois, or lorsque je fais ma recherche v, il ne m'affiche que course à pieds.
Comment faire pour que autant de fois que 402 apparaît j'obtienne le résultat suivant et non pas le premier à chaque fois ?

Merci de votre aide !
 

zebanx

XLDnaute Accro
@Dranreb ;)

Merci pour cette proposition de code.
Une présentation différente que celle proposée dans le premier fil sur un éclatement en lignes ou en colonnes qui à l'usage devrait se révéler un peu plus pratique (dmpv) pour des réponses futures.
Ici avec un tri sur la colonne C (pour Jason).

Bonne journée
zebanx
 

Pièces jointes

  • Réponse_RechVM.xlsm
    20.5 KB · Affichages: 22

Dranreb

XLDnaute Barbatruc
Plus compliqué que prévu parce que je me suis lancé dans un truc à au moins 4 cas, combinant recherche en lignes ou en colonnes avec résultat en lignes ou en colonnes …
Mais enfin voilà :
VB:
Function Ressortir(ByVal Quoi, ByVal VClé, ByVal Dans)
   Dim RngAC As Range, TRés(), DansHor As Boolean, RésuHor As Boolean, _
      D As Long, LD As Long, CD As Long, R As Long
   If TypeOf Quoi Is Range Then Quoi = Quoi.Value
   If TypeOf VClé Is Range Then VClé = VClé.Value
   If TypeOf Dans Is Range Then Dans = Dans.Value
   Set RngAC = Application.Caller
   ReDim TRés(1 To RngAC.Rows.Count, 1 To RngAC.Columns.Count)
   DansHor = UBound(Dans, 1) = 1 And UBound(Dans, 2) > 1
   RésuHor = UBound(TRés, 1) = 1 And UBound(TRés, 2) > 1
   On Error Resume Next
   For D = 1 To UBound(Dans, 1 - DansHor)
      If DansHor Then LD = 1: CD = D Else LD = D: CD = 1
      If Dans(LD, CD) = VClé Then R = R + 1: TRés(IIf(RésuHor, 1, R), IIf(RésuHor, R, 1)) = Quoi(LD, CD)
      Next D
   While R < UBound(TRés, 1 - RésuHor)
      R = R + 1: TRés(IIf(RésuHor, 1, R), IIf(RésuHor, R, 1)) = "": Wend
   Ressortir = TRés
   End Function
Maintenant je vais peut être étudier aussi la possibilité que Quoi puisse avoir plus d'une colonne ou plus d'une ligne là où Dans n'en a qu'une, et aussi tout sortir …
Mais c'est beaucoup plus compliqué d'en déduire l'orientation de sortie d'après les tailles de la plage appelante.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Là de toutes façon c'est une fonction perso à utiliser en formule. Pour sortir des inventaires avec regroupements j'ai d'autres outils.
La version qui peut ressortir plusieurs colonnes ou lignes pour chaque ligne ou colonne :
VB:
Function Ressortir(ByVal Quoi, ByVal VClé, ByVal Dans, Optional ByVal Horizontal)
   Dim RngAC As Range, TRés(), DansHztal As Boolean, RésuHztal As Boolean, _
      D As Long, LD As Long, CD As Long, R As Long, X As Long
   If TypeOf Quoi Is Range Then Quoi = Quoi.Value
   If TypeOf VClé Is Range Then VClé = VClé.Value
   If TypeOf Dans Is Range Then Dans = Dans.Value
   Set RngAC = Application.Caller
   ReDim TRés(1 To RngAC.Rows.Count, 1 To RngAC.Columns.Count)
   DansHztal = UBound(Dans, 1) = 1 And UBound(Dans, 2) > 1
   If VarType(Horizontal) <> vbBoolean Then RésuHztal = UBound(TRés, 1) = 1 _
      And UBound(TRés, 2) > 1 Else RésuHztal = Horizontal
   On Error Resume Next
   For D = 1 To UBound(Dans, 1 - DansHztal)
      If Dans(IIf(DansHztal, 1, D), IIf(DansHztal, D, 1)) = VClé Then
         R = R + 1
         For X = 1 To UBound(Quoi, IIf(DansHztal, 1, 2))
            TRés(IIf(RésuHztal, X, R), IIf(RésuHztal, R, X)) _
               = Quoi(IIf(DansHztal, X, D), IIf(DansHztal, D, X))
            Next X: End If
      Next D
   While R < UBound(TRés, 1 - RésuHztal)
      R = R + 1
      For X = 1 To UBound(Quoi, IIf(DansHztal, 1, 2))
         TRés(IIf(RésuHztal, X, R), IIf(RésuHztal, R, X)) = ""
         Next X: Wend
   Ressortir = TRés
   End Function
 

zebanx

XLDnaute Accro
Bonjour Dranreb, Jason

Quelques difficultés à comprendre l'utilisation de ce dernier code.

Le fichier ci-joint contient toutes les fonctions.
Si tu as un peu de temps pour l'amender afin de mieux comprendre les subtilités de cette dernière fonction (ici renommée Ressortir21h) , nous t'en remercions par avance.
(Et cela évitera de te faire perdre plus de temps en te posant des questions).

Bonne journée et encore bravo pour ce travail complet (et chronophage)

zebanx
 

Pièces jointes

  • Réponse_RechVM.xlsm
    39.9 KB · Affichages: 26

Dranreb

XLDnaute Barbatruc
Bonjour.
Il n'y a toujours qu'une info à ressortir, l'intitulé. du sport, alors on ne peut pas voir de différence
Mais au départ il n'était question de sortir les infos que d'une seule clé interrogée, et là on sort chaque fois tout.
Alors c'est sûr qu'on ne peut pas bien l'utiliser parce que tout c'est déjà un tableau à 2 dimensions, alors qu'il en faudrait 3 pour sortir plusieurs informations de toutes les occurences de toutes les clés. Pour sortir tout j'utiliserais plutôt ma fonction Gigogne. D'autres sauraient le faire avec PowerQuery, mais ce n'est pas mon cas.
 

Comfortably_Numb

XLDnaute Junior
Bonjour à tous,

Il y a-t-il un moyen de faire en sorte que la formule fasse son travail par exemple me sortir toutes les fois où le code ville 402 a une valeur différente et lui dire de stopper toute seule la recherche quand toutes les occurances sont trouvées ?
Pour le moment j'ai étendu la formule quelques cellules plus bas, mais si il n'y a que 3 occurrences par exemple, la formule est étendue sur beaucoup plus.. En résumé, la formule peut elle s'étendre automatiquement pour chaque requête ?
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa