Est-il possible d'utiliser des plages nommées dans les requêtes de feuille de calcul Google afin que les références des colonnes soient mises à jour?

9

À l'aide de feuilles de calcul Google, vous pouvez écrire des requêtes . Cependant, si vous avez des lettres de colonne entre guillemets, elles ne sont pas mises à jour lorsque l'ordre des colonnes change.

Existe-t-il un moyen d'écrire ces requêtes afin qu'elles n'aient pas besoin d'être mises à jour chaque fois qu'une colonne est ajoutée ou supprimée?

Est-il possible d'utiliser des plages nommées dans les requêtes pour résoudre ce problème?

Voici un exemple: si vous ajoutez une colonne après «F», la colonne «G» est poussée vers «H» et la signification de la formule change.

= Requête (B: J, "sélectionner le groupe moy (J) par G")

Questions connexes

Cette question n'est pas la même que l' utilisation de la requête avec des en-têtes de colonne au lieu de lettres de colonne, car celle-ci se concentre sur l'utilisation des plages nommées.

Alex B
la source

Réponses:

5

C'est un peu délicat, mais c'est possible avec une gamme d'assistance et une certaine concaténation.

Ce qui doit être fait:

  1. Créez une plage nommée, COLS, pour transporter les lettres de colonne comme ceci:

    A  
    B  
    C  
    D  
    E  
    ...
    

    Faites-le verticalement comme indiqué.

  2. Assemblez la chaîne de requête comme ceci:

    =QUERY( B:J, "SELECT AVG(" & INDEX(**COLS**, COLUMN(J1)) & ") GROUP BY " & INDEX(**COLS**, COLUMN(G1)) )
    
Oneide
la source
1
La plage nommée fonctionnera à la fois en forme verticale ou horizontale.
Rubén
@ Rubén a probablement raison.
Oneide
3

Existe-t-il un moyen d'écrire ces requêtes afin qu'elles n'aient pas besoin d'être mises à jour chaque fois qu'une colonne est ajoutée ou supprimée?

Est-il possible d'utiliser des plages nommées dans les requêtes pour résoudre ce problème?

Oui, vous pouvez utiliser des plages nommées au lieu des en-têtes de colonne intégrés, mais l'idée de base est la même que les autres réponses à cette question suggérée par d'autres questions similaires sur ce site: la feuille de calcul doit être définie pour créer une chaîne SQL dynamique .

Disons que Jet Gcorrespond à des plages nommées Gradeset Classrespectivement.


L'approche suivante ne fonctionne que lorsque les colonnes sont entre les colonnes A et Z


CELL("address",Grades)reviendra "$J:$J". Pour obtenir la référence de colonne, utilisez MID(CELL("address",Grades),2,1)pour obtenir "J". La formule finale est

= QUERY (B: J, "SELECT AVG (" &
MID (CELLULE ("adresse", Grades), 2,1) &
") PAR GROUPE "&
MID (CELL ("adresse", classe), 2,1))


L'approche suivante fonctionne pour tous les cas


COLUMN(Grades)renverra un entier (un nombre de la forme 1,2,3 etc.) Pour simplifier la formule pour créer l'argument de l'instruction SQL, je suggère de forcer SQL à utiliser les références de colonne de la forme COL1, COL2, etc. en utilisant le tableau notation ( {B:J}). La formule finale est

= QUERY ({B: J}, "SELECT AVG (Col" & COLUMN (Grades) -1 & ") GROUP BY Col" & COLUMN (Class) -1)

Feuille de calcul de démonstration

Références

Utilisation de tableaux dans Google Sheets - Aide des éditeurs de Google Documents

Rubén
la source
1

La réponse de Ruben ne résout pas le problème dans tous les cas, car elle MID(CELL("address",Grades),2,1)échoue si la Gradesplage est déplacée vers une colonne à deux lettres comme $AA:$AA.

Dans ce cas, la formule MID(CELL("address",Grades),2,2)est nécessaire. Pour les plages nommées qui s'étendent sur ou s'étendent sur la $Z:$AAplage, cette formule devient problématique.

La formule REGEXEXTRACT( CELL("address", Grades), "\$([a-zA-Z]+)\$")résout le problème pour le cas général, mais je doute fortement de son efficacité CPU lorsqu'elle est utilisée sur une grande feuille de calcul.

Stobber
la source
Dans ma réponse, il y a deux approches, mais cette réponse ne critique qu'une d'entre elles. La deuxième approche devrait fonctionner pour tous les cas.
Rubén
Je ne pense pas que cela fonctionnera pour les plages nommées qui se trouvent sur différentes feuilles. Vous vous demandez si +2 ans depuis, s'il y a de meilleures solutions à cela ... comme simplement pouvoir référencer les gammes sacrément nommées dans la requête elle
mike01010
0

Je suis tombé sur cette page sur infoinspired.com qui explique une façon de le faire. Je l'ai testé exactement comme dans l'exemple qu'il a donné et cela a fonctionné. La mise en place:

      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

Son explication de F1: La formule ADDRESS qui inclut les fonctions ROW et COLUMN renvoie l'adresse de cellule de B1. La fonction LEFT en extrait la première lettre qui est l'en-tête de colonne.

--- Cliquez sur la cellule F1 puis allez dans le menu Données> Plages nommées et nommez la plage "Age" (sans les guillemets)

Vous pouvez maintenant formuler votre requête comme suit: =QUERY(A:B,"Select "&Age)

Il a des exemples plus compliqués dans sa page que je suis sur le point de tester maintenant, mais je suis encouragé que le premier exemple ait fonctionné!

Modifier - désolé si c'est exactement ce que d'autres ont proposé avec leurs réponses. Je viens de trouver cet exemple limpide et j'ai pu le comprendre. Je pensais que cela pourrait aider les autres avec la même question.

Lise
la source