Código M para Tabela de Calendário no Excel

Tempo de leitura:

4-7 minutos

Neste artigo vou mostrar-te como podes criar uma Tabela de calendário completa utilizando código M em Power Query. Uma tabela de calendário é fundamental em qualquer modelo de dados que pretendas usar seja em Excel ou Power Bi.

No exemplo, vou mostrar-te algumas técnicas com código M que podes usar em detrimento da interface do utilizador. Claro que utilizando os comandos da interface podes perfeitamente chegar ao mesmo resultado, no entanto com código tens vários benefícios, desde logo a performance da tua consulta, uma vez que tens muito menos passos executados. Outra vantagem de usar o código M, que vais poder ver neste artigo é que com um único passo podes gerar logo todas as colunas extra da tabela de calendário. E ainda vais poder converter o código numa função se pretenderes invocar o calendário várias vezes, por exemplo com datas diferentes!

Iniciar a consulta

Para começar vamos iniciar com uma consulta completamente em branco. Assim sendo, no Excel podes começar por iniciar o Editor do Power Query, acedendo a Dados -> Obter Dados -> Iniciar o Editor do Power Query.

Tela do Excel mostrando o menu 'Dados' com a opção 'Iniciar Editor do Power Query' destacada.

No editor do Power Query iniciamos uma consulta em branco.

Interface do Editor do Power Query com menu e opções de gerenciamento de consultas.

E de seguida acedemos ao Editor Avançado [Advanced Editor] para iniciarmos o código da Consulta.

Screenshot showing the Power Query Editor with options to view, transform, and add columns.

Definir as datas de início e de fim do calendário

Vamos começar então por definir as datas de início e fim do calendário, inicialmente com valores “estáticos” e para já usando a expressão #date() que funciona de forma semelhante à função DATA no Excel. Na Data de fim acrescentamos a função Date.EndOfYear para obter o último dia do ano, da respetiva data.

let

    DataInicio = #date(2025,1,1),

    Datafim = Date.EndOfYear(#date(2026,1,1))

in

    Datafim

O resultado como se pode ver é apenas um valor, a última data, resultante do último passo.

Uma tela do Editor Avançado no Power Query com uma expressão M que define a data de fim do ano como 31 de dezembro de 2026.

Criar uma Lista a partir das datas

O próximo passo é criar uma lista a partir das datas. A lista pode ser criada através da inicialização da lista com a lógica de números contínuos -> {..}. Uma vez que as datas tem de ser convertidas em números usamos a função Number.From().

let

    DataInicio = #date(2025,1,1),

    Datafim = Date.EndOfYear(#date(2026,1,1)),

    ListaDatas = {Number.From(DataInicio)..Number.From(Datafim)}

in

    ListaDatas

O resultado é uma lista com números de serie sequenciais.

Código M para gerar uma lista de dados em Power Query, mostrando a lógica de conversão e operações realizadas.

Converter a lista em tabela

Agora, vamos converter a lista numa tabela, com apenas uma coluna. Neste caso podemos usar o comando Para Tabela, mas vamos usar código, que nos permite definir uma serie de opções num único passo.

Interface do Power Query mostrando opções para converter uma lista em tabela com código M.

Desta forma, voltamos ao Editor Avançado…

Através do código podemos atribuir logo o nome da nova coluna “Datas” sem necessidade de adicionar este passo extra, o que aconteceria se tivéssemos a usar a interface do utilizador.

let

    DataInicio = #date(2025,1,1),

    Datafim = Date.EndOfYear(#date(2026,1,1)),

    ListaDatas = {Number.From(DataInicio)..Number.From(Datafim)},

    TabelaV1 = Table.FromList(ListaDatas, Splitter.SplitByNothing(), {“Datas”}, ExtraValues.Ignore)

in

    TabelaV1

Agora o próximo passo é apenas o de alterar o tipo de dados da coluna. Aqui sim podemos usar a interface do utilizador.

Interface do Editor do Power Query com opções de transformação de coluna, incluindo a seleção do tipo 'Data'.

No Editor Avançado, alteramos apenas o nome do passo para não conter espaços. O código até ao momento é o seguinte:

let

    DataInicio = #date(2025,1,1),

    Datafim = Date.EndOfYear(#date(2026,1,1)),

    ListaDatas = {Number.From(DataInicio)..Number.From(Datafim)},

    TabelaV1 = Table.FromList(ListaDatas, Splitter.SplitByNothing(), {“Datas”}, ExtraValues.Ignore),

    ColunaDatas = Table.TransformColumnTypes(TabelaV1,{{“Datas”, type date}})

in

    ColunaDatas

Adicionar as colunas extra da tabela

Agora este passo é importante! Aqui é que vamos ter um dos maiores benefícios do código M no cenário. Vamos adicionar uma nova coluna, mas que na verdade serão várias colunas em simultâneo. O processo pode ser feito através da interface, adicionando uma coluna de cada vez a partir da coluna de datas, e o processo é muito simples desta forma, contudo, estamos a criar vários passos e não estamos a tornar a consulta eficiente. Desta forma vamos criar a consulta com este patamar de eficiência.

Este passo pode ser feito inteiramente através do Editor Avançado, no qual vou mostrar o código final, mas aqui, vou aproveitar um pouco da interface do utilizador.

Interface do Editor do Power Query mostrando a adição de uma coluna personalizada com várias colunas criadas a partir de um registro.

Podes acrescentar as colunas que pretenderes. No exemplo estou a utilizar funções de Data para criar cada um dos “campos” do mesmo Registo.

let

    DataInicio = #date(2025,1,1),

    Datafim = Date.EndOfYear(#date(2026,1,1)),

    ListaDatas = {Number.From(DataInicio)..Number.From(Datafim)},

    TabelaV1 = Table.FromList(ListaDatas, Splitter.SplitByNothing(), {“Datas”}, ExtraValues.Ignore),

    ColunaDatas = Table.TransformColumnTypes(TabelaV1,{{“Datas”, type date}}),

    OutrasColunas =

        Table.AddColumn(

            ColunaDatas,

            “Outras Colunas”, each

            [

                Ano = Date.Year([Datas]),

                NumMes = Date.Month([Datas]),

                Dia = Date.Day([Datas]),

                NomeMes = Text.Proper(Date.MonthName([Datas])),

                Trimeste = Text.From(Date.QuarterOfYear([Datas])) & “º Trimestre”,

                InicioMes = Date.StartOfMonth([Datas]),

                FimMes = Date.EndOfMonth([Datas]),

                InicioTrimestre = Date.StartOfQuarter([Datas]),

                FimTrimestre = Date.EndOfQuarter([Datas])

            ]

        )

in

    OutrasColunas

O código acima mostra os argumentos da função Table.AddColumn:

  • Tabela -> ColunaDatas
  • Nome da Coluna -> “Outras Colunas
  • Expressão aplicada na coluna: Aqui, a expressão each aplica uma expressão a cada linha da tabela, que neste caso é um Registo -> []. O registo é composto por vários campos.

O resultado é apresentado na imagem a baixo.

Tabela de calendário em Excel com a coluna "Datas" e "Outras Colunas" que inclui informações como Ano, NumMes, Dia, NomeMes, Trimeste, InicioMes, FimMes, InicioTrimestre e FimTrimestre.

Expandir as colunas

Agora basta expandir todas as colunas criadas. Para esta parte podemos perfeitamente usar novamente a interface do utilizador. É criado o código M por nós.

Interface do Editor do Power Query com a tabela de dados e a opção para expandir registros em destaque.

let

    DataInicio = #date(2025,1,1),

    Datafim = Date.EndOfYear(#date(2026,1,1)),

    ListaDatas = {Number.From(DataInicio)..Number.From(Datafim)},

    TabelaV1 = Table.FromList(ListaDatas, Splitter.SplitByNothing(), {“Datas”}, ExtraValues.Ignore),

    ColunaDatas = Table.TransformColumnTypes(TabelaV1,{{“Datas”, type date}}),

    OutrasColunas =

        Table.AddColumn(

            ColunaDatas,

            “Outras Colunas”, each

            [

                Ano = Date.Year([Datas]),

                NumMes = Date.Month([Datas]),

                Dia = Date.Day([Datas]),

                NomeMes = Text.Proper(Date.MonthName([Datas])),

                Trimeste = Text.From(Date.QuarterOfYear([Datas])) & “º Trimestre”,

                InicioMes = Date.StartOfMonth([Datas]),

                FimMes = Date.EndOfMonth([Datas]),

                InicioTrimestre = Date.StartOfQuarter([Datas]),

                FimTrimestre = Date.EndOfQuarter([Datas])

            ]

        ),

    ExpandirColunas = Table.ExpandRecordColumn(OutrasColunas, “Outras Colunas”, {“Ano”, “NumMes”, “Dia”, “NomeMes”, “Trimeste”, “InicioMes”, “FimMes”, “InicioTrimestre”, “FimTrimestre”}, {“Ano”, “NumMes”, “Dia”, “NomeMes”, “Trimeste”, “InicioMes”, “FimMes”, “InicioTrimestre”, “FimTrimestre”})

in

    ExpandirColunas

A parte do código a vermelho pode ser retirada uma vez que representa a parte onde as colunas podem ser renomeadas.

A tabela de calendário

Neste momento se visualizarmos a Consulta temos a tabela de calendário pronta. Basta apenas alterar o tipo de dados das colunas e o resultado é o esperado.

Interface do Power Query mostrando a tabela de calendário após a expansão das colunas, com opções para definir tipos de dados e adicionar colunas.

A tabela de calendário com as colunas expandidas.

Tabela mostrando colunas de uma tabela de calendário no Power Query, incluindo Dia, NomeMes, Trimeste, InicioMes, e FimMes, com formatação de tipo de dados.

Converter a consulta numa função

Este passo, é opcional! Se pretenderes colocar os anos do calendário dinâmicos e por alguma razão pretenderes reutilizar a consulta, podes sempre converter a mesma numa função.

Voltando ao editor avançado, vamos inicializar uma função.

Para criarmos a função, antes da expressão let definimos a inicialização da função.

(AnoInicio as number, AnoFim as number) =>

E aplicamos os argumentos da função que neste caso representam o Ano de Inicio e Ano de Fim do calendário no respetivo local da consulta, conforme indicado na imagem do código em baixo.

Código da consulta M para criar uma tabela de calendário dinâmica no Power Query, com data de início e fim configuráveis.

Assim que confirmamos esta alteração, a consulta transforma-se numa função, com 2 argumentos: AnoInicio e AnoFim, que são necessários para invocar a mesma.

Assim que invocada a função temos a consulta criada.

Interface do Power Query mostrando a função fxCalendario com campos para introduzir os anos de início e fim do calendário.

Eis o resultado da função Invocada.

Tela do Excel mostrando uma função invocada para criar um calendário, com colunas para datas, ano, número do mês e dia.

E o resultado no Excel -> Menu Base -> Fechar e Carregar -> Fechar e Carregar Para…

Tabela de calendário no Excel com colunas para Datas, Ano, Número do Mês, Dia, Nome do Mês, Trimestre, Início do Mês, Fim do Mês, Início do Trimestre e Fim do Trimestre.

Próximo artigo:

Artigo Anterior:


Comentários

Leave a Reply

Discover more from Exceldriven

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

Continue reading