Comment changer la source d'une requête PowerQuery liée à un fichier externe en changeant simplement le chemin de ce fichier dans une cellule.
Et la ligne magique en M qui permet de reprendre le nom du fichier :
Chemin = Excel.CurrentWorkbook(){[Name="NomEmplacement"]}[Content]{0}[Column1],
Attention, le copier-coller transforme parfois les " en autres guillemets. Cela peut être une source d'erreur potentielle.
Et pour aller plus loin avec PowerQuery, vous pouvez vous procurer ma formation en ligne.
#powerquery #cellule #nom
Merci Gaëtan,
Je vais inclure cela dans mon cours !
Porte toi bien,
Daniel
https://www.gotomeet.me/DanielDEVEAUX
Au passage, je donne deux séminaires live sur ces sujets :
https://www.xlerateur.com/powerquery-niveau-debutant-intermediaire
et
https://www.xlerateur.com/powerquery-niveau-intermediaire-et-avance
Merci pour votre tuto. Je voudrais adapter ce code fonctionnant avec un lien web, celui ci est tous les jours different.
J'ai essayé ceci mais sans succes:
Chemin = Excel.CurrentWorkbook(){[Name="lienweb"]}[Content]{0}[Column11],
Source = Excel.CurrentWorkbook(Web.Contents(Chemin),null,true),
Mon lien internet en K1 (donc colonne 11), nommé lienweb.
Pouvez vous m'aider à faire fonctionner cette requete?
Cordialement,
Bonjour, si je peux me permettre ce complément qui consiste à capter n'importe quelle clef/params dans un tableau de paramètres. Certes ça n'est peut-être pas très clair au premier visuel mais je peux fournir le fichier Excel avec exemple si souhaité
/*
AUTHOR : OGURUMA1209@OUTLOOK.FR
DATE : 11/06/2023
VERSION : Initial
PURPOSE : Excel RECHERCHEX in PowerQuery
DESCRIPTION :
pLookupValue : searched value
pTableName : table lookup for - type may be text or pq table
tmpColumnKeyNumberIndex : searched column -- type may be text or number -- not necessary to be the firts column (as RechercheX)
tmpColumnReturnIndexNumber : returned column -- type me be texte or number
pSort : table lookup for need sorted or not -- eg speed
*/
// Nested let started - 1
let pqXLOOKUPV1 = (pLookupValue as any, pTableName as any, tmpColumnKeyNumberIndex as any, tmpColumnReturnIndexNumber as any, optional pSort as logical) as any =>
// Nested let started - 2
let
// Fixe parameters
// ---------------
pMSG = "#N/A",
pColumnKeyNumberIndex = if tmpColumnKeyNumberIndex = 0 then 1 else tmpColumnKeyNumberIndex,
pColumnReturnIndexNumber = if tmpColumnReturnIndexNumber = 0 then 1 else tmpColumnReturnIndexNumber,
pTableArray = if pTableName is table then pTableName else Excel.CurrentWorkbook(){[Name=pTableName]}[Content],
// ----------------------------------------------------------------------
// Fixe index colunm index and return column -- either number or string
// ----------------------------------------------------------------------
pKeyIndex=if tmpColumnKeyNumberIndex is text then List.PositionOf(Columns,tmpColumnKeyNumberIndex) else tmpColumnKeyNumberIndex - 1,
pKeyReturn=if tmpColumnReturnIndexNumber is text then List.PositionOf(Columns,tmpColumnReturnIndexNumber) else tmpColumnReturnIndexNumber - 1,
// -------------------------------------
// fixe columns in table lookup for
// -------------------------------------
Columns = Table.ColumnNames(pTableArray),
// ------------------------------------
// transform to table
// ------------------------------------
ColumnsTable = Table.FromList(
Columns, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
// ---------------------------------------
// fixe index key in index column
// ---------------------------------------
ColumnNameMatch = Record.Field(
ColumnsTable{pKeyIndex},"Column1"),
//-----------------------------------------------------
// fixe column return value
//-----------------------------------------------------
ColumnNameReturn = Record.Field(
ColumnsTable{pKeyReturn},"Column1"),
//-----------------------------------------------------
// sort ? yes ? no ?
//-----------------------------------------------------
SortTable =
if pSort = null
then Table.Sort(pTableArray,{{ColumnNameMatch, Order.Ascending}})
else pTableArray,
//----------------------------------------------------------------------
// fixe temp column to get value with a secured name as __Lookup__
//----------------------------------------------------------------------
RenameTargetCol = Table.RenameColumns(
SortTable,{{ColumnNameMatch, "__Lookup__"}}),
//-----------------------------------------------------
// get value from [__Lookup__] column
//-----------------------------------------------------
Lookup = Table.SelectRows(
RenameTargetCol, each [__Lookup__] = pLookupValue),
//-------------------------------------------------------------------------------
// return value or not in this case msg error (customized or default #N/A)
//-------------------------------------------------------------------------------
ReturnValue=
if Table.IsEmpty(Lookup)=true
then pMSG
// Get first record mandatory
else Record.Field(Lookup{0},ColumnNameReturn)
// end nested Let
in ReturnValue
// end function RechercheX as pq
in pqXLOOKUPV1
Une variante simplifiée
let Tbl = (optional pFileParam as text) as table =>
let
pFile=
if pFileParam = null
then getXLParameters("FILE_TEXT_PARAMS", QRY_TB_PARAMS, "PARAMETRE", "VALEUR", null)
else pFileParam,
Source = Table.FromColumns({Lines.FromBinary(File.Contents(pFile), null, null, 1252)}),
CLEAN_TEXT = Table.TransformColumns(Source,{{"Column1", Text.Clean, type text}}),
DELETE_SPACES = Table.TransformColumns(CLEAN_TEXT,{{"Column1", Text.Trim, type text}}),
SPLIT_COLUMN_1 = Table.SplitColumn(DELETE_SPACES, "Column1", Splitter.SplitTextByDelimiter("=", QuoteStyle.Csv), {"Column1.1", "Column1.2"}),
RENAME_COLUMNS = Table.RenameColumns(SPLIT_COLUMN_1,{{"Column1.1", "PARAM"}, {"Column1.2", "VALUE"}})
in
RENAME_COLUMNS
in
Tbl
Une variante avec un n° de paramètre
let Param=(pTable as text,pNum as number) as any =>
let
Source = Excel.CurrentWorkbook(){[Name=pTable]}[Content],
value = Source{pNum-1}[Value]
in
value
in
Param
Autre
let Tbl = (optional pFileParam as text) as table =>
let
pFile=
if pFileParam = null
then getXLParameters("FILE_TEXT_PARAMS", QRY_TB_PARAMS, "PARAMETRE", "VALEUR", null)
else pFileParam,
Source = Table.FromColumns({Lines.FromBinary(File.Contents(pFile), null, null, 1252)}),
CLEAN_TEXT = Table.TransformColumns(Source,{{"Column1", Text.Clean, type text}}),
DELETE_SPACES = Table.TransformColumns(CLEAN_TEXT,{{"Column1", Text.Trim, type text}}),
SPLIT_COLUMN_1 = Table.SplitColumn(DELETE_SPACES, "Column1", Splitter.SplitTextByDelimiter("=", QuoteStyle.Csv), {"Column1.1", "Column1.2"}),
RENAME_COLUMNS = Table.RenameColumns(SPLIT_COLUMN_1,{{"Column1.1", "PARAM"}, {"Column1.2", "VALUE"}})
in
RENAME_COLUMNS
in
Tbl
Merci beaucoup pour le tuto ! Ca fait deux jours que je galérais ... Je tentais de modifier la source de la connexion via ma macro VBA, alors qu'il y avait bcp plus simple en faisant comme ça !
Merci et bonne continuation
Avec grand plaisir !