oguruma
XLDnaute Occasionnel
Bonjour,
Ce post fait suite à celui-ci
excel-downloads.com
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
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é.
Exemples
Ce post fait suite à celui-ci
![excel-downloads.com](https://excel-downloads.com/apple-touch-icon.png)
POWERQUERY :: Recherche d'un élément dans une sous-liste
Bonjour, J'ai été confronté ces derniers temps à cette situation et je vous fais part via un petit exemple qui pour une fois se passera de fonctions et d'un fichier joint : List01={{"L1","Sub1"}, {"L2","Sub2"}, {"L3","Sub3"}}, t_Position_1 = List.PositionOf(List01, "L2"...
![excel-downloads.com](https://excel-downloads.com/favicon.png)
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
PowerQuery:
let
List={{"L1","Sub10"}, {"L2","Sub20"}, {"L3","Sub30","Sub31"}},
Slist={"L3","L1"},
Lnumber={2},
R=fnListPositionOfV20(List,Slist, Lnumber)
in
R
PowerQuery:
let
List={{1,"Sub10","Sub11"}, {2,"Sub20","Sub21","Sub22"}, {3,"Sub30","Sub31"}},
Slist={1,2,3},
Lnumber={},
R=fnListPositionOfV20(List,Slist)
in
R
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