AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1713772
Accepted
Preston Maness
Preston Maness
Asked: 2022-03-31 21:54:39 +0800 CST2022-03-31 21:54:39 +0800 CST 2022-03-31 21:54:39 +0800 CST

Nome de tabela dinâmica na função Lambda do Excel com referências estruturadas sem INDIRETO

  • 772

É possível definir uma função lambda do Excel que recebe um parâmetro que atua como um nome "dinâmico" para uma tabela, que é então usada em uma referência estruturada, sem usar a função INDIRETA ?
Minha esperança é ser capaz de definir um método auxiliar que permita aos usuários, de fato, usar uma tabela para definir uma estrutura de dicionário com uma string como chave e uma tupla como valor e, em seguida, extrair partes específicas desse tupla.

Uma tabela de exemplo chamada "Variáveis" está abaixo:

Variável Valor inicial Unidade inicial
Pressão 1 caixa eletrônico
Volume 4 eu
massa 10 g
Temperatura 30 C
Rgas 0,7 atm*L/g*C

E meu comportamento desejado é poder definir um lambda que os usuários possam chamar assim:

=l.Variable("Variables","mass","Initial Value")

(com o resultado sendo 10)

Até agora, porém, só posso alcançar essa interface específica empregando a INDIRECTfunção:

=LAMBDA(Table,Var,Prop,
    INDEX(
        INDIRECT(Table & "[#All]"),
        MATCH(Var,INDIRECT(Table & "[[#All],[Variable]]"),0),
        MATCH(Prop,INDIRECT(Table & "[#Headers]"),0)
    )
)

Se, em vez disso, eu quiser evitar o uso de INDIRECT, tenho que codificar o nome da tabela específica:

=LAMBDA(Var,Prop,
    INDEX(
        Variables[#All],
        MATCH(Var,Variables[[#All],[Variable]],0),
        MATCH(Prop,Variables[#Headers],0)
    )
)

Estou sem sorte? Existe uma maneira melhor de fazer o que estou tentando fazer?

Eu vinculei a uma pasta de trabalho que usa a abordagem codificada e a INDIRECTabordagem abaixo:

https://www.dropbox.com/s/344rfrrzhjjr6z2/superuser-lambda-question.xlsx?dl=0

microsoft-excel worksheet-function
  • 3 3 respostas
  • 427 Views

3 respostas

  • Voted
  1. GLW
    2022-10-07T17:11:34+08:002022-10-07T17:11:34+08:00

    Você pode procurar dados arbitrários de uma tabela sem INDIRETO com bastante facilidade. Você só precisa passar a referência completa da tabela com o qualificador [#All] em vez de apenas o nome da tabela como uma string e extrair as seções [#Header] e [#Data] usando INDEX.

    Eu dividi isso em vários lambdas, que é como eu implementaria para mim. Eu também incluí alguma verificação de erros.

    Você pode ajustar conforme necessário para trabalhar exatamente como deseja.

    getTableColumn = lambda(tableall, colname, let(
       header, index(tableall, 1, 0),
       data, let(rcount, rows(tableall), index(tableall, 2, 0):index(tableall, rcount, 0)),
       colIndex, xmatch(colname, header),
       if(isnumber(colIndex), index(data, 0, colIndex), "column not found")));
    
    TableLookup = lambda(tableAll, keyColName, dataColName, keyVal, let(
       keyCol, getTableColumn(tableAll, keyColName),
       dataCol, getTableColumn(tableAll, dataColName),
       keyFound, index(keyCol, 1)<>"column not found",
       dataFound, index(dataCol, 1)<>"column not found",
       ifs(
           not(keyFound), "key column not found",
           not(dataFound), "data column not found",
           and(keyFound, dataFound), xlookup(keyVal, keyCol, dataCol, "key not found"))
        ));
    

    Então, usando este lambda para seu exemplo original:

    =TableLookup(Variable[#All], "Variable", "Initial Value", "mass")
    
    • 2
  2. Best Answer
    Máté Juhász
    2022-03-31T22:23:42+08:002022-03-31T22:23:42+08:00

    recebe um parâmetro que atua como um nome "dinâmico" para uma tabela

    A melhor maneira no Excel para converter um parâmetro de texto em um intervalo é usar a função INDIRETO.
    (outras maneiras são OFFSET e função VBA personalizada, no entanto, no seu caso, ambos seriam mais complicados)

    No entanto, você ainda pode melhorar sua fórmula usando FILTER, em vez de INDEX e MATCH.

    O exemplo abaixo mostra apenas parte da fórmula desejada, pois meu Excel ainda não possui LAMBDA.

    =FILTER(INDIRECT(E1&"["&G1&"]"),INDIRECT(E1&"[Variable]")=F1)

    insira a descrição da imagem aqui

    • 1
  3. ExcelEverything
    2022-04-01T00:13:52+08:002022-04-01T00:13:52+08:00

    Método não volátil para INDEX em diferentes Tabelas ou Planilhas

    A única maneira de INDEX em tabelas diferentes usando uma variável de texto é usar INDIRETO conforme a pergunta. A razão para evitar o INDIRETO, é claro, é porque ele é volátil, o que significa que ele será recalculado em todas as oportunidades possíveis (o INDIRETO pode se referir a qualquer célula e, portanto, depende de cada célula). Funções voláteis podem afetar o desempenho, especialmente para pastas de trabalho grandes.

    Para um número finito predefinido de tabelas ou planilhas, você pode usar CHOOSE e LET (LET requer Excel 365). Para mesas:

    =LET(tableall,CHOOSE(MATCH(table,{"Table1","Table2","Table3"},0),Table1[#All],Table2[#All],Table3[#All]),INDEX(tableall,MATCH(var,INDEX(tableall,,1),0),MATCH(prop,INDEX(tableall,1,),0)))
    

    Onde var é o valor de pesquisa na primeira coluna da tabela e prop é a coluna de cabeçalho correspondente.

    Se você precisar de colunas de tabela específicas, você pode estender LET com várias variáveis, por exemplo:

    =LET(tableindex,MATCH(table,{"Table1","Table2","Table3"},0),tableall,CHOOSE(tableindex,Table1[#All],Table2[#All],Table3[#All]),tablehdr,CHOOSE(tableindex,Table1[#Headers],Table2[#Headers],Table3[#Headers]),INDEX(tableall,MATCH(var,INDEX(tableall,,1),0),MATCH(prop,tablehdr,0)))
    

    Ou se você precisar apenas de um VLOOKUP e não de um INDEX completo:

    =LET(tableall,CHOOSE(MATCH(table,{"Table1","Table2","Table3"},0),Table1[#All],Table2[#All],Table3[#All]),INDEX(tableall,VLOOKUP(var,tableall,MATCH(prop,INDEX(tableall,1,),0),FALSE))
    

    E, por último, uma vez que o LAMDA chega à versão de produção do Excel 365, você pode basicamente definir o acima como uma função de intervalo nomeado e chamá-lo com parâmetros, por exemplo=TABLEINDEX("Table1","Mass","Initial Value")

    E como um FYI, você pode fazer o mesmo para endereçar dinamicamente diferentes planilhas de forma não volátil:

    =LET(sheet,CHOOSE(MATCH(sheetname,{"Sheet1","Sheet2","Sheet3"},0),Sheet1!$1:$10000,Sheet2!$1:$10000,Sheet3!$1:$10000),INDEX(sheet, i, j))
    

    onde sheetname é o sheetname como um valor de texto, i e j são índices de linha e coluna.

    PS. Se você não tiver o Excel 365, tudo acima pode ser feito sem LET, você só precisa substituir/duplicar as fórmulas para cada variável LET nomeada na fórmula principal (mais computacionalmente intensiva).

    • 1

relate perguntas

  • Como usar a função LENGTH do Excel para uma coluna inteira?

  • Matriz do Excel (2 variáveis)

  • como abrir um arquivo de escritório do WSL

  • VBA para renomear planilha com base no nome do arquivo

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve