POWERQUERY : POWERQUERY :: Recherche d'un élément dans une sous-liste - V2.0

oguruma

XLDnaute Occasionnel
Bonjour,
Ce post fait suite à celui-ci

Il était difficile de ne pas passer à côté du mode industrialisation d'autant que j'en ai eu besoin pour les développements qui s'en sont suivis et aussi les évolutions qui s'y trouvent.
Je vous les partage donc :

fnListPositionOfV10

PowerQuery:
let fnListPositionOfV10 =
    (
        pList as list,
        pSearchedValue as any,
        optional pIndexReturn as number

    ) as any =>

        let
            List=pList,
            SearchedValue=pSearchedValue,
            IndexReturn=if pIndexReturn is null then 1 else pIndexReturn,
            t_Position = List.PositionOf(List, SearchedValue, Occurrence.First, (current, value) => value = current{0}),
            ReturnValue=if t_Position = -1
                         then "#N/A"
                         else
                              try List{t_Position}{IndexReturn} otherwise "#OUT OF RANGE"
        in
            ReturnValue           
in
    fnListPositionOfV10

Code:
let

   List={{"L1","Sub1"}, {"L2","Sub2"}, {"L3","Sub3"}},   
   R=fnListPositionOfV10(List,"L2",1)

in
    R
    
let

   List={{1,"Sub10"}, {2,"Sub20"}, {3,"Sub30","Sub31","Sub32"}},
   R=fnListPositionOfV10(List,3,2)
in
   R

Ci-dessous une autre version plus évoluées.

fnListPositionOfV20

Elle permet de rechercher plusieurs clefs et éventuellement de retourner l'élément de la liste souhaitée quand la clef est trouvée. Si l'élément à retourner n'est pas mentionné le premier est renvoyé.

PowerQuery:
let fnListPositionOfV2 =
    (
        pList as list,
        pListSearched as list,
        optional pListNum as list
    ) as any =>

        let

            //=========================================================================================================
            // Fonction de recherche dans une sous liste
            //=========================================================================================================
            Search=(pValue as any, x as number) =>
            let           
                t_Position = List.PositionOf(List, pValue, Occurrence.First, (current, value) => value = current{0}),
                ReturnValue=if t_Position = -1
                            then "#N/A"
                            else
                                try List{t_Position}{x} otherwise "#OUT OF RANGE"
            in 
                ReturnValue,

            //=========================================================================================================
            // Gestion des paramètres
            //=========================================================================================================
            List=pList,
            ListSearched=pListSearched,
            ListNum=if pListNum is null then {} else pListNum,         
            NbrNum=List.Count(ListNum), 

            //=========================================================================================================
            // Boucle de recherche des éléments dans les sous-listes
            //=========================================================================================================
            ReturnValues=List.Accumulate
            (
                    ListSearched, // Liste contenant les clefs à rechercher dans les sous-listes
                    {},           // Initialisation de l'accumulateur
                    (state,current) =>
                        let
                            x=List.Count(state), // En comptant le nbr d'éléments dans l'accumulateur on fait l'équivalent du x=x+1 dans la boucle
                            SearchResult=if x < NbrNum then Search(current,ListNum{x}) else Search(current,1), // On la recherche via la fonction
                            CombineList=List.Combine({state,{SearchResult}}) // Fusion avec le contenu de l'accumulateur
                        in 
                            CombineList
            )
        in   
            ReturnValues
in 
    fnListPositionOfV2

Exemples

PowerQuery:
let
   List={{1,"Sub10"}, {2,"Sub20"}, {3,"Sub30"}},
   Slist={3,1},
   R=fnListPositionOfV20(List,Slist)
in
   R

1719577306862.png


PowerQuery:
let

   List={{"L1","Sub10"}, {"L2","Sub20"}, {"L3","Sub30","Sub31"}},
   Slist={"L3","L1"},
   Lnumber={2},
   R=fnListPositionOfV20(List,Slist, Lnumber)
in
   R

1719577371560.png


PowerQuery:
let

   List={{1,"Sub10","Sub11"}, {2,"Sub20","Sub21","Sub22"}, {3,"Sub30","Sub31"}},
   Slist={1,2,3},
   Lnumber={},
   R=fnListPositionOfV20(List,Slist)
in
   R

1719577449296.png


PowerQuery:
let
   List={{1,"Sub10","Sub11"}, {2,"Sub20","Sub21","Sub22"}, {3,"Sub30","Sub31"}},
   Slist={1,2,3},
   Lnumber={2,3,2},
   R=fnListPositionOfV20(List,Slist,Lnumber)
in
   R

1719577519484.png
 

Pièces jointes

  • SLIST_LOOKUP_v0.006.xlsx
    37.7 KB · Affichages: 0

Discussions similaires

Statistiques des forums

Discussions
313 769
Messages
2 102 234
Membres
108 181
dernier inscrit
Chr1sD