Changer la source d'une requête PowerQuery

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

Pour marque-pages : Permaliens.

6 réponses à Changer la source d'une requête PowerQuery

  1. Merci Gaëtan,
    Je vais inclure cela dans mon cours !
    Porte toi bien,
    Daniel
    https://www.gotomeet.me/DanielDEVEAUX

  2. Leclercq Gregory dit :

    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,

  3. oguruma2 dit :

    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

  4. Maxime dit :

    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

  5. Gaetan Mourmant dit :

    Avec grand plaisir !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *


La période de vérification reCAPTCHA a expiré. Veuillez recharger la page.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.