13 février 2017
Groupe Excel + Power BI
Cathy Monier, est venue nous rencontrer, de la France, pour nous présenter un cas concret d'élaboration de tableau de bord de ressources humaines avec un traitement de données avancé dans Power Query.
Elle nous a également montré comment récupérer des définitions de fonctions de Power Query en français.
Finalement, elle nous a montré comment utiliser l'API de Meetup pour récupérer les données de notre groupe (données sur les membres et sur les meetings).
2. Cathy Monier
Auteure du Site CathyAstuce.com
Auteur des livres
Power Query et le langage M (Edition ENI)
Excel 2013 & VBA (Ed. Pearson)
Tableaux croisés dynamiques (Ed. Pearson – Épuisé)
Maîtriser Excel 2013 (Ed. Pearson – Épuisé)
Me Contacter
www.gemccap.com
cathy.monier@gemccap.fr
3. Déroulement de la Session
• Récupérer
Contenu d’un
classeur
• Créer une
fonction récursive
RH
• Utilisation de
#shared
Aide
• Une fonction
récursive sur une
table
API
Meetup
4. Problématique RH
En France, pour toute personne embauchée en CDD, nous devons considérer plusieurs
contrats qui se suivent pour une même personne comme étant un seul contrat.
5. Suivi des contrats
Les contrats se suivent et donc n’en font qu’un seul
Les contrats ne se suivent pas, nous avons donc 6 contrats
6. Fonction récursive
1. Besoin de lire les données de la ligne
précédente
Utilisation d’un index
Fusion de la table avec elle-même
2. Schéma de la fonction OUI
NON
Ligne actuel
(table + Entrée)
Sortie+1
=
Entrée ?
debut contrat =
Date entrée
Ligne précédente
7. Code de la fonction fnGetDebut
(TableContrats as table, ID as number, DateEntree as date) =>
let
LigneTest = Table.SelectRows(TableContrats , each ([Index] = ID-1)),
NbLignes = Table.RowCount(LigneTest),
DateDebut = if NbLignes = 0 then
DateEntree
else
if DateEntree = (LigneTest{0}[Sortie] + #duration(1,0,0,0)) then
fnGetDebut(TableContrats, ID-1,LigneTest{0}[Entree])
else
DateEntree
in
DateDebut
9. Aide Vous trouverez ce tableau de bord sur
• Un partage d’app BI
• Mon site CathyAstuce
10. Code
Récupérer l’ensemble des fonctions de Power Query
#shared
Se limiter aux fonctions
Value.Is([Value], type function)
Récupérer les métadonnées de la fonction
Value.Metadata(Value.Type([Value]))
Il peut y avoir jusque 3 exemples, donc recupération dans 3 colonnes de chaque ligne de la liste
[Documentation.Examples]{0} , [Documentation.Examples]{1} , [Documentation.Examples]{2}
12. Meetup
Documentation https://www.meetup.com/fr-
FR/meetup_api/
page : la taille de page (nombre maximal de
résultats à chaque réponse)
offset : la page à retourner.
Exemple, page = 10, offset =0 donne les lignes de
1-10, offset=1 de 11à 20, etc..
desc : ordre inverse, desc=true
13. Récupérer la 1ère page
Construire l’URL
L’URL de connexion : https://api.meetup.com/members?status=past
Paramètres communs aux requêtes :
• &group_urlname= GroupUrlName
• &key= MeetupApiKey
“https://api.meetup.com/members?status=past" & "&group_urlname=" & GroupUrlName & "&key=" &
MeetupApiKey & "&page=200" & "&offset=0"
Création d’un paramètre pour chaque page : NumPage = 0
“https://api.meetup.com/members?status=past" & "&group_urlname=" & GroupUrlName & "&key=" &
MeetupApiKey & "&page=200" & "&offset=" & Text.From(NumPage)
Dès que la table est récupérée, on compte le nombre de lignes afin de savoir s’il faut lire d’autres pages
Table.RowCount(ConvertTable )
14. Fonction récursive
Schéma de la fonction
Combiner les tables
CombineResult = Table.Combine({MaTable , ConvertTable})
Code de la ligne de récursivité
if NbLignes = 0 then
CombineResult
else
fnGetPages (NumPage + 1, CombineResult )
NON
OUI
NumPage = 0
Resultat = 200 membres
Nb
Membres
<200
Nous sommes arrivés sur la
dernière page
NumPage=+1
Combiner les tables
15. Code de la fonction
(NumPage as number, MaTable as table) =>
let
Source = Json.Document(Web.Contents("https://api.meetup.com/members?status=past" &
"&group_urlname=" & GroupUrlName & "&key=" & MeetupApiKey & "&page=200" & "&offset=" &
Text.From(NumPage))),
Navigation = Source[results],
ConvertTable = Table.FromList(Navigation , Splitter.SplitByNothing(), null, null, ExtraValues.Error),
NbLignes = Table.RowCount(ConvertTable),
CombineResult = Table.Combine({MaTable , ConvertTable}),
Resultat = if NbLignes = 0 then CombineResult else fnGetPages (NumPage + 1, CombineResult )
in
Resultat