web-dev-qa-db-fra.com

Liste déroulante basée sur le résultat de la liste déroulante d'une autre cellule

Je souhaite remplir une liste déroulante en fonction d'une sélection de la liste déroulante d'une autre cellule.

Voici ma feuille de calcul .

Par exemple, si l'utilisateur ne fait pas de choix dans le menu déroulant D20, le menu déroulant F20 est vide mais ne contient que l'option ChoixA dans son menu déroulant.

Si l'utilisateur fait un choix dans le menu déroulant D20, F20 est vide, mais les options ChoixA, ChoixB et ChoixC figurent dans son menu déroulant.

J'ai joué avec le dessous mais ce n'est pas tout à fait ça ...

Cette formule est dans la cellule Sheet2! B: 14

=ARRAYFORMULA(IF(ISBLANK(Sheet1!D20),(Sheet2!A14),(Sheet2!A14:A16)))

et ma cellule Sheet1! F20 utilise la liste de validation des données de la plage Sheet2! B14: B16

Sur une seule ligne, cela fonctionne comme vous le souhaitez, mais lorsque vous ajoutez des lignes, le problème qui se pose est qu'une fois qu'une sélection est effectuée à un endroit quelconque de la colonne D qui autorise les 3 choix dans le menu déroulant de la colonne F, ces 3 choix deviennent disponibles de manière permanente dans n'importe quelle colonne. ajout de cellules de colonne F indépendamment du choix de la colonne D dans la même ligne.

Un autre problème nécessitant un correctif est que si l'option de la colonne D est supprimée, les trois options sont également disponibles, bien qu'un commentaire d'avertissement soit présent.

Ces problèmes peuvent-ils être résolus avec une formule ou un script?

4
MJM

Si vous avez besoin de plusieurs règles de validation pour plusieurs cellules, vous devez également disposer de plusieurs plages pour que les règles soient suivies indépendamment les unes des autres.

Mais le second problème, avec un choix illégal restant dans F après une modification en D, ne peut pas être résolu avec des formules seules. J'ai donc écrit un script qui garde un meilleur suivi de la validation dans la colonne F. Notez qu'il ne définit pas les règles de validation initiales (avant la première utilisation); que vous pouvez faire manuellement. Il ne définit pas non plus de règles pour la colonne D, qui sont statiques.

Ce qu’il fait est le suivant: lorsqu’une cellule de la colonne D est modifiée (ligne d’en-tête exclue), elle ajuste la règle de validation de la cellule deux pas à droite en conséquence. En outre, si cette cellule contenait une valeur telle que OptionB qui n'est plus autorisée lorsque D est vide, la valeur dans F est supprimée.

Dans le script, e.range est la cellule modifiée, e.value est sa nouvelle valeur.

function onEdit(e) {
  if (e.range.getColumn() === 4 && e.range.getRow() > 1 ) {  // only Column D, not header 
    var optionA = SpreadsheetApp.newDataValidation()
      .requireValueInList(['OptionA'], true).build();
    var optionsABC = SpreadsheetApp.newDataValidation()
      .requireValueInList(['OptionA', 'OptionB', 'OptionC'], true).build();

    var affectedCell = e.range.offset(0,2,1,1);  // two steps to the right
    if (e.value === '') {
      if (affectedCell.getValue() !== 'OptionA') {
        affectedCell.setValue('');    // reset if current choice is no longer legal
      }
      affectedCell.setDataValidation(optionA); 
    }
    else {
      affectedCell.setDataValidation(optionsABC);      
    }
  }
}
1
user79865

Voici une solution simple:

Sheet1:

D20: Validation des données> Liste d'éléments: I made a choice,I didn't make a choice

F20: Validation des données> Liste dans une plage: Sheet2!D8:D11

Sheet2:

D8: =IF(Sheet1!D20 = B6; QUERY(B8:B11;;-1);IF(Sheet1!D20 = C6; QUERY(C8:C11;;-1);))

1
user0