oguruma
XLDnaute Impliqué
Bonjour,
Ce post fait suite à celui-ci
	
	
		
			
				
					
						 
					
				
			
			
				
					
						
							 excel-downloads.com
						
					
					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
 
					
				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
						
					
					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
		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
   RCi-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 
    fnListPositionOfV2Exemples
		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 
	 
 
		