É possível usar intervalos nomeados nas consultas da planilha do Google para que as referências das colunas sejam mantidas atualizadas?

9

Usando o Google Spreadsheets, você pode escrever consultas . No entanto, se você tiver letras de coluna entre aspas, elas não serão atualizadas conforme a ordem das colunas é alterada.

Existe uma maneira de escrever essas consultas para que elas não precisem ser atualizadas sempre que uma coluna for adicionada ou removida?

É possível usar intervalos nomeados em consultas para resolver esse problema?

Aqui está um exemplo: Se você adicionar uma coluna após 'F', a coluna 'G' será empurrada para 'H' e o significado da fórmula será alterado.

= Consulta (B: J, "selecione o grupo médio (J) por G")

Perguntas relacionadas

Esta questão não é a mesma que Usar consulta com cabeçalhos de coluna, em vez de letras de coluna, porque esta se concentra no uso de intervalos nomeados.

Alex B
fonte

Respostas:

5

É meio complicado, mas é possível com um Range auxiliar e alguma concatenação.

O que precisa ser feito:

  1. Crie um intervalo nomeado, COLS, para carregar as letras da coluna desta maneira:

    A  
    B  
    C  
    D  
    E  
    ...
    

    Faça isso na vertical, como mostrado.

  2. Monte a string de consulta assim:

    =QUERY( B:J, "SELECT AVG(" & INDEX(**COLS**, COLUMN(J1)) & ") GROUP BY " & INDEX(**COLS**, COLUMN(G1)) )
    
Oneide
fonte
11
O intervalo nomeado funcionará na forma vertical ou horizontal.
Rubén
@ Rubén provavelmente está certo.
Oneide 15/11/16
3

Existe uma maneira de escrever essas consultas para que elas não precisem ser atualizadas sempre que uma coluna for adicionada ou removida?

É possível usar intervalos nomeados em consultas para resolver esse problema?

Sim, você pode usar intervalos nomeados em vez de cabeçalhos de coluna internos, mas a idéia básica é a mesma que outras respostas a isso e outras perguntas semelhantes neste site sugeridas: a planilha deve ser configurada para criar uma string SQL dinâmica .

Digamos que Je Gcorresponde aos intervalos nomeados Gradese Classrespectivamente.


A abordagem a seguir funciona apenas quando as colunas estão entre as colunas A e Z


CELL("address",Grades)retornará "$J:$J". Para obter a referência da coluna, use MID(CELL("address",Grades),2,1)get "J". A fórmula final é

= QUERY (B: J, "SELECT AVG (" &
MID (CÉLULA ("endereço", Notas), 2,1) e
") GRUPO POR" &
MID (CÉLULA ("endereço", Classe), 2,1))


A abordagem a seguir funciona para todos os casos


COLUMN(Grades)retornará um número inteiro (um número do formulário 1,2,3 etc.) Para simplificar a fórmula para criar o argumento da instrução SQL, sugiro forçar o SQL a usar referências de coluna do formulário COL1, COL2 etc. usando a matriz notação ( {B:J}). A fórmula final é

= QUERY ({B: J}, "SELECT AVG (Col" & COLUMN (notas) -1 & ") GRUPO POR COL" & COLUMN (Class) -1)

Planilha de demonstração

Referências

Usando matrizes no Planilhas Google - Ajuda do Editores do Google Docs

Rubén
fonte
1

A resposta de Ruben não resolve o problema em todos os casos, porque MID(CELL("address",Grades),2,1)falha se o Gradesintervalo for movido para uma coluna de duas letras como $AA:$AA.

Nesse caso, a fórmula MID(CELL("address",Grades),2,2)é necessária. Para intervalos nomeados que abrangem ou se limitam ao $Z:$AAintervalo, essa fórmula se torna problemática.

A fórmula REGEXEXTRACT( CELL("address", Grades), "\$([a-zA-Z]+)\$")resolve o problema no caso geral, mas questiono fortemente sua eficiência de CPU quando usada em uma planilha grande.

Stobber
fonte
Na minha resposta, existem duas abordagens, mas essa resposta apenas critica uma delas. A segunda abordagem deve funcionar para todos os casos.
Rubén
Eu não acho que isso funcionará para intervalos nomeados que estão em folhas diferentes. Querendo saber se +2 anos desde que, se há melhores soluções para este ... como simplesmente ser capaz de referenciar o danado intervalos nomeados na própria consulta
mike01010
0

Me deparei com esta página em infoinspired.com que explica uma maneira de fazê-lo. Eu testei exatamente como no exemplo que ele deu e funcionou. A configuração:

      A        B        F                                     G
 1  names     Age   =left(address(row(B1),column(B1),4))   =QUERY(A:B,"Select "&Age)
 2  joey      32
 3  nicole    26
 4  sally     66

Sua explicação sobre F1: a fórmula ADDRESS que inclui as funções ROW e COLUMN retorna o endereço da célula B1. A função ESQUERDA extrai a primeira letra que é o cabeçalho da coluna.

--- Clique na célula F1 e vá para o menu Dados> Intervalos nomeados e nomeie o intervalo "Idade" (sem as aspas)

Agora você pode formular sua consulta como: =QUERY(A:B,"Select "&Age)

Ele tem exemplos mais complicados em sua página que estou prestes a testar agora, mas estou encorajado que o primeiro exemplo tenha funcionado!

Editar - desculpe se é exatamente isso que os outros têm proposto com suas respostas. Acabei de encontrar este exemplo claro e consegui descobrir isso. Achei que poderia ajudar outras pessoas com a mesma pergunta.

Lise
fonte