¿Es posible usar rangos con nombre en las consultas de hoja de cálculo de Google para que las referencias de las columnas se mantengan actualizadas?

9

Con las hojas de cálculo de Google, puede escribir consultas . Sin embargo, si tiene letras de columna entre comillas, entonces no se actualizan a medida que cambia el orden de las columnas.

¿Hay alguna forma de escribir estas consultas para que no necesiten actualizarse cada vez que se agrega o elimina una columna?

¿Es posible usar rangos con nombre en las consultas para resolver este problema?

Aquí hay un ejemplo: si agrega una columna después de 'F', la columna 'G' se desplaza a 'H' y el significado de la fórmula cambia.

= Consulta (B: J, "seleccionar grupo promedio (J) por G")

Preguntas relacionadas

Esta pregunta no es lo mismo que Usar consulta con encabezados de columna en lugar de letras de columna porque esta se centra en el uso de rangos con nombre.

Alex B
fuente

Respuestas:

5

Es un poco complicado, pero es posible con un rango de ayuda y cierta concatenación.

Lo que hay que hacer:

  1. Cree un rango con nombre, COLS, para llevar las letras de columna como esta:

    A  
    B  
    C  
    D  
    E  
    ...
    

    Hazlo de manera vertical como se muestra.

  2. Ensamble la cadena de consulta de esta manera:

    =QUERY( B:J, "SELECT AVG(" & INDEX(**COLS**, COLUMN(J1)) & ") GROUP BY " & INDEX(**COLS**, COLUMN(G1)) )
    
Oneide
fuente
1
El rango con nombre funcionará tanto en forma vertical u horizontal.
Rubén
@ Rubén probablemente tenga razón.
Oneide
3

¿Hay alguna forma de escribir estas consultas para que no necesiten actualizarse cada vez que se agrega o elimina una columna?

¿Es posible usar rangos con nombre en las consultas para resolver este problema?

Sí, podría usar rangos con nombre en lugar de encabezados de columna incorporados, pero la idea básica es la misma que otras respuestas a esto y otras preguntas similares en este sitio sugirieron: la hoja de cálculo debe configurarse para construir una cadena dinámica de SQL .

Digamos eso Jy Gcorresponde a rangos con nombre Gradesy Classrespectivamente.


El siguiente enfoque funciona solo cuando las columnas están entre las columnas A y Z


CELL("address",Grades)devolverá "$J:$J". Para obtener la referencia de columna, use MID(CELL("address",Grades),2,1)get "J". La fórmula final es

= CONSULTA (B: J, "SELECCIONAR AVG (" &
MID (CELL ("dirección", grados), 2,1) &
") AGRUPAR POR "&
MID (CELL ("dirección", clase), 2,1))


El siguiente enfoque funciona para todos los casos.


COLUMN(Grades)devolverá un número entero (un número de la forma 1,2,3, etc.) Para simplificar la fórmula para crear el argumento de la declaración SQL, sugiero forzar a SQL a usar referencias de columna de la forma COL1, COL2, etc. mediante el uso de la matriz notación ( {B:J}). La fórmula final es

= CONSULTA ({B: J}, "SELECCIONAR AVG (Col" y COLUMNA (Grados) -1 & ") GROUP BY Col" y COLUMNA (Clase) -1)

Hoja de cálculo de demostración

Referencias

Uso de matrices en Hojas de cálculo de Google - Ayuda de editores de Documentos de Google

Rubén
fuente
1

La respuesta de Ruben no resuelve el problema en todos los casos porque MID(CELL("address",Grades),2,1)falla si el Gradesrango se mueve a una columna de doble letra como $AA:$AA.

En ese caso, MID(CELL("address",Grades),2,2)se necesita la fórmula . Para los rangos con nombre que abarcan o linda con el $Z:$AArango, esta fórmula se vuelve problemática.

La fórmula REGEXEXTRACT( CELL("address", Grades), "\$([a-zA-Z]+)\$")resuelve el problema para el caso general, pero cuestiono fuertemente su eficiencia de CPU cuando se usa en una hoja de cálculo grande.

Stobber
fuente
En mi respuesta hay dos enfoques, pero esta respuesta solo critica uno de ellos. El segundo enfoque debería funcionar para todos los casos.
Rubén
No creo que esto funcione para rangos con nombre que están en diferentes hojas. Preguntándome si hace +2 años, si hay mejores soluciones para esto ... como simplemente poder hacer referencia a los malditos rangos con nombre en la consulta misma
mike01010
0

Encontré esta página en infoinspired.com que explica una forma de hacerlo. Lo probé exactamente como en el ejemplo que dio y funcionó. La puesta en marcha:

      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

Su explicación de F1: la fórmula DIRECCIÓN que incluye las funciones FILA y COLUMNA devuelve la dirección de celda de B1. La función IZQUIERDA extrae la primera letra que es el encabezado de la columna.

--- Haga clic en la celda F1 y luego vaya al menú Datos> Rangos con nombre y nombre el rango "Edad" (sin comillas)

Ahora puede formular su consulta como: =QUERY(A:B,"Select "&Age)

Tiene ejemplos más complicados en su página que estoy a punto de probar ahora, ¡pero me alienta que el primer ejemplo funcionó!

Editar: perdón si esto es exactamente lo que otros han estado proponiendo con sus respuestas. Acabo de encontrar este ejemplo claro como el cristal y pude resolverlo. Pensé que podría ayudar a otros con la misma pregunta.

Lise
fuente