Estou usando o Power Query no Excel para Microsoft 365.
A questão que vou colocar é muito semelhante a outra que coloquei recentemente e à qual foi dada uma resposta elegante. Essa pergunta está aqui: Power Query: consulte uma coluna por nome armazenado como um parâmetro de texto
Na questão vinculada acima, precisei filtrar linhas com base na nulidade de uma coluna cuja posição era constante (sempre a primeira coluna) mas cujo nome era difícil de usar porque estava armazenado em um parâmetro de texto. A resposta foi rebaixar os cabeçalhos (dando-lhes nomes previsíveis), filtrar com base na nulidade de Column1 e promover os cabeçalhos (para trazer de volta seus nomes originais). O parâmetro de texto que contém o nome da coluna acabou não entrando em ação.
Na questão atual, preciso novamente filtrar as linhas com base na nulidade de uma coluna cujo nome está armazenado em um parâmetro de texto, mas desta vez nem sempre será a primeira coluna. Pode ser a primeira, segunda, terceira ou quarta coluna. Então, desta vez, eu realmente preciso usar o parâmetro que especifica o nome da coluna.
Apresentarei novamente minha pergunta original, alterada para refletir esse novo requisito.
Aqui está minha tabela de dados de origem (cujo nome da tabela é Source ):
Col1 | Col2 | Col3 | Col4 | Nome |
---|---|---|---|---|
11 | 21 | 31 | 41 | Cachorro |
12 | 22 | 32 | 42 | Gato |
23 | 33 | 43 | Avestruz | |
14 | 24 | 44 | Periquito | |
15 | 25 | 35 | 45 | Truta |
Eu defini um parâmetro de texto:
FilterColumn
especifica o nome da coluna que será usada para filtrar valores nulos . Pode assumir qualquer um dos valores Col1 , Col2 , Col3 ou Col4 .
Meu objetivo é desenvolver um Power Query para filtrar linhas onde há um nulo na coluna especificada por FilterColumn
.
Supondo que eu configurei FilterColumn
Col3 , o resultado desejado é:
Col1 | Col2 | Col3 | Col4 | Nome |
---|---|---|---|---|
11 | 21 | 31 | 41 | Cachorro |
12 | 22 | 32 | 42 | Gato |
23 | 33 | 43 | Avestruz | |
15 | 25 | 35 | 45 | Truta |
Aqui está o código da linguagem M para minha consulta do Power:
let
Source = Excel.CurrentWorkbook(){[Name="Source"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Col1", Int64.Type}, {"Col2", Int64.Type}, {"Col3", Int64.Type}, {"Col4", Int64.Type}, {"Name", Text.Type}}),
// #"Filtered Rows" = Table.SelectRows(#"Changed Type", each [FilterColumn] <> null and [FilterColumn] <> "")
// #"Filtered Rows" = Table.SelectRows(#"Changed Type", each FilterColumn <> null and FilterColumn <> "")
in
#"Filtered Rows"
É a etapa aplicada #"Filtered Rows" que está dando errado. No código acima, mostro duas tentativas (comentadas) que fiz de implementar esta etapa aplicada.
Na primeira tentativa, simplesmente me refiro diretamente ao nome da coluna (entre colchetes). No entanto, FilterColumn
é considerado o nome da coluna de interesse, e não como um parâmetro de texto que contém o nome da coluna. Um erro é gerado porque não há coluna chamada FilterColumn :Expression.Error: The field 'FilterColumn' of the record wasn't found.
Na segunda tentativa, novamente me refiro diretamente ao nome da coluna, mas desta vez sem colchetes. Isso não gera um erro, mas nenhuma linha é filtrada. A saída permanece inalterada em relação à entrada.
Como posso filtrar linhas com base em valores nulos em uma coluna nomeada pelo parâmetro FilterColumn
?
Você precisa passar o parâmetro como uma string de texto, então tente:
ou
Você pode usar isso também,,,
Observação
Nesta abordagem.
Table.SelectRows(...)
usado para filtrar linhas com base na condição especificada eTable.SelectColumns(...)
usado para selecionar as colunas desejadas nas linhas filtradas.Essa abordagem combina a filtragem da seleção de linhas e colunas em uma única etapa, o que pode ser mais eficiente e tornar o código mais conciso.