Guia Completo da Função List.Generate em Power Query

Tempo de leitura:

4–5 minutes

Neste artigo vou apresentar a função List.Accumulate em Power Query, que é uma das funções que permite criar listas através de iteração e que funciona como o conceito “while loop” presente em várias linguagens de programação.

Esta função em particular, não trabalha sobre uma lista, mas como o nome indica, permite gerar uma lista, mas neste caso o processo de gerar uma lista é definido em função de uma condição. A lista é gerada enquanto uma condição for verdadeira, assim que a condição deixar de ser verdadeira, a lista deixa de gerar valores.

Sintaxe da função

List.Generate(

   initial as function,

   condition as function,

   next as function,

   optional selector as nullable function,

) as list

A função tem algumas particularidades sendo que a principal talvez, seja o facto de todos os parâmetros da função serem definidos como “função”:

  • Initial -> representa o valor inicial da lista, sobre o qual a mesma começa a ser gerada. O valor tem de ser definido como função e neste caso sobre a forma explicita de uma função, sem parâmetros: ()=>
  • Condition -> Este parâmetro representa a condição avaliada para permitir gerar o valor da lista. É o equivalente a dizer “enquanto a condição for verdadeira… faz algo”. Aqui podemos definir a função explicita ou usar a expressão “each _”.
  • Next -> Este parâmetro é que define o sumo da função, o que pretendemos que aconteça com a lista, que na verdade é o valor a gerar. Aqui podemos definir a função explicita ou usar a expressão “each _”
  • Selector -> Este parâmetro é opcional e permite definir o que pretendemos que aconteça com a lista depois desta ser gerada. Este parâmetro é muito útil se pretendemos realizar alguma alteração a lista.

Exemplo para a função

Vamos começar por aceder ao Editor do Power Query…

Interface do Excel mostrando a opção de iniciar o Editor do Power Query, com várias opções de obtenção de dados na barra de ferramentas.

E no editor, vamos começar uma consulta em branco.

Interface do Editor do Power Query mostrando opções para adicionar uma nova consulta em branco e configurar origens de dados.

Na barra de fórmulas colocamos a expressão:

= List.Generate(

    () => 1,

    each _ <= 20,

    each _ + 1

)

Captura de tela mostrando a função List.Generate em Power Query, com o valor inicial 1, condição até 20 e incremento de 1, resultando em uma lista de números de 1 a 20 à esquerda.

Aplicar o 4 parâmetro – Selector

O 4 parâmetro permite alterar a lista depois da mesma ser gerada. Isto significa que podemos realizar qualquer alteração aos valores da lista gerando uma nova lista. Importante também verificar que neste caso a condição não afeta a nova lista. A condição (parametro 2) é importante para avaliar o valor e definir como o próximo valor (Next -> parametro 3) é gerado. Contudo neste caso o 4º Parâmetro -> Selector, já é executado depois da lista estar criada, então não é afetado pela condição!

Imagem do editor do Power Query mostrando a função List.Generate, gerando uma lista de números de 1 a 20, e cada valor sendo multiplicado por 2.

Criar a função List.Generate com funções específicas

Em vez de usarmos a expressão “each _” podemos aplicar uma função explicita, com a sintaxe (parametro) => para melhor interpretar os paramentos da função. Apenas o primeiro parâmetro (inicial) é que deve ser definido com a função explicita e sem argumentos.

= List.Generate(

    () => 1,

    (valor) => valor <= 20,

    (valor) => valor + 1,

    (valor) => valor * 2

)

O resultado não é alterado, apenas mais lógico e coerente com um parâmetro explicito para a função.

Código da função List.Generate em Power Query que gera uma lista de números de 2 a 40, seguindo uma lógica de iteração definida por condições.

List.Generate com mais de um valor

Se pretendemos gerar uma lista com mais do que um simples valor, podemos criar uma lista a partir de um registo. Se o valor inicial é um registo, o resultado será uma lista com registos aninhados, onde a partir dos quais podemos extrair o valor de um campo.

Vamos iniciar uma nova lista para verificar este comportamento.

= List.Generate (

    ()=> [numero = 1],

    each [numero] <= 12,

    each [numero = [numero] + 1]

)

Screenshot of the List.Generate function in Power Query, showing a code example that creates a list of records with a field named 'numero'. The interface displays the output in a structured format.

Nota aqui o comportamento nos passos:

  1. O valor inicial é um registo, apenas com um campo -> número
  2. A condição avaliar o campo do registo
  3. O resultado do próximo passo é um Registo, que modifica o campo [numero] e adiciona 1 ao valor.

Atribuir mais campos ao registo

Agora que temos um registo na lista podemos adicionar mais campos.

= List.Generate (

    ()=> [numero = 1, data = #date(2025, 1, 1)],

    each [numero] <= 12,

    each [numero = [numero] + 1, data = Date.AddMonths( [data], 1) ]

)

Tela do Editor Power Query mostrando a função List.Generate, gerando uma lista com registros que incluem dois campos: 'numero' e 'data'.

Usar o Selector – 4ª argumento

Agora que sabemos com acrescentar vários campos ao registo, acrescentei mais alguns campos na lista. O resultado é um registo com 4 campos. Mas usando o 4º Argumento -> Selector, podemos “desmontar” a lista para mostrar o pretendido.

= List.Generate (

    ()=> [numero = 1, data = #date(2025, 1, 1), DiaSemana = Date.DayOfWeekName(#date(2025, 1, 1)), FimMes = Date.EndOfMonth(#date(2025, 1, 1))],

    each [numero] <= 12,

    each [numero = [numero] + 1, data = Date.AddMonths( [data], 1), DiaSemana = Date.DayOfWeekName(Date.AddMonths([data],1)), FimMes = Date.EndOfMonth(Date.AddMonths([data], 1)) ],

    each [DiaSemana]

)

Imagem mostrando o Editor do Power Query com um código para gerar uma lista de dias da semana a partir de uma data inicial.

Caso prático – Gerar uma lista de data numa tabela

Vamos então agora a um caso prático, onde vamos gerar uma coluna numa tabela, que permite gerar uma lista em função das datas de Encomenda e Entrega.

Tela do Power Query mostrando a aba de dados com a opção 'Da Tabela / Intervalo' selecionada. A tabela contém duas colunas: 'DataEncomenda' e 'DataEntrega' com várias datas listadas.

Começamos por trazer a tabela para o Power Query através do Separador Dados -> Da Tabela / Intervalo.

Adicionamos uma nova coluna na Tabela

E aplicamos a nossa expressão:

List.Generate (

    ()=> [inicio = [DataEncomenda], fim = [DataEntrega]],

    each [inicio] < [fim],

    each [inicio = Date.AddDays([inicio], 1), fim = [fim]],

    each [inicio]

)

Explicando a expressão:

  1. Valor inicial: é um registo composto por 2 campos:
    1. Inicio -> que armazena a data de encomenda [DataEncomenda]
    1. Fim -> que armazena a data de entrega [DataEntrega]
  2. Condição: É definida pelo operador: [inicio] < [fim]
  3. Next: Altera o valor do campo [inicio] pela função Date.AddDays e mantem o valor do campo [fim]
  4. Selector: Modifica a lista para apresentar um valor do registo -> [inicio]
Captura de tela do Editor do Power Query mostrando uma tabela com colunas 'Dataencomenda' e 'Dataentrega', além de um exemplo de expressão usando List.Generate para gerar datas.

A lista é gerada em cada célula da coluna. É uma lista aninhada.

Tabela de encomendas no Power Query com colunas para 'DataEncomenda' e 'DataEntrega', mostrando a lista de dias entre as duas datas e a opção para extrair valores da lista.

Selecionamos a opção para extrair os valores da lista…

Tela do Power Query mostrando a tabela com as colunas 'DataEncomenda', 'DataEntrega' e uma coluna 'Dias' que contém listas de datas geradas.

E obtemos a tabela com a informação dos dias que ocorrem entre as duas datas.

Screenshot of a Power Query table displaying columns for Order Date, Delivery Date, and Days, with cells indicating status (Valid, Error, or Empty) and dates listed under the Days column.

Próximo artigo:

Artigo Anterior:


Comments

Leave a Reply

Discover more from Exceldriven

Subscribe now to keep reading and get access to the full archive.

Continue reading