Liste en cascade qui marche sur plusieurs ligne

Bonjour à tous,

J'ai besoin de voter aide svp. Dans ma feuille Aout, j'ai une des listes dépendantes 3 pour être précis colonne D, E, F j'ai mis une formule dans la feuille base de données cellule A2 et A3 qui me permet d'aller chercher les informations souhaitées. Seulement, ma formule ne marche que pour ma première ligne si je rajoute une nouvelle ligne mes liste ne marche plus. J'ai trouvé un sujet similaire dans la section excel, mais malheureusement je n'ai pas réussi à reproduite la solution.

Ci-joint le lien pour mon fichier google sheet. Merci pour votre aide.

https://docs.google.com/spreadsheets/d/1_XowKj6cOCZqKuI62u2M6RstMQVWlbOZsFLpSgWabIE/edit?usp=sharing

Bonjour,

Avec GSheets, c'est une peu différent

Il y a plusieurs façons de faire, mais pour suivre ton idée, j'ai créé 2 onglets, l'un pour E l'autre pour F, il faut firer les formules vers le bas pour en avoir autant que dans la feuille prinicpale

Merci beaucoup pour ton retour, malheureusement quand je click sur le bouton NEW CDM cellule B1, pour avoir une nouvelle ligne, les listes ne marche plus, est ce qu'il ya moyen de les garder fonctionnelles même après avoir rajouter des nouvelles lignes ?

oui, dans ce cas il faut que tu ajoutes aussi des nouvelles lignes dans les 2 nouveaux onglets avec la formule en colonne 1

je n'avais pas été voir tes macros, mais c'est ce que je disais autrement ici

il faut tirer les formules vers le bas pour en avoir autant que dans la feuille principale

c'est à dire qu'il faut avoir les formules pour chaque ligne et faire en sorte que les validation de données pointent vers ces lignes.

In fine on traite 2 choses à la fois : les listes déroulantes (cela fonctionne) et ensuite l'ajout de ligne dans un ordre différent.

J'ai essayé de suivre votre recommandation, mais étant donné que la ligne qui se rajoute automatiquement via ma macro est toujours la ligne 3, ca ne marche pas. Avez-vous une astuce à me recommander. Un grand merci pour votre temps.

ajouter aussi une ligne devant les autres dans les 2 onglets ajoutés, et recopier la formule de la colonne A (ligne 4 vers ligne 3) dans ces 2 onglets peut-être, à tester

sinon on peut faire un script mais mieux vaut éviter

Bonjour, j'ai testé cela, mais la référence disparait aussitôt que je rajoute une ligne. Avez-vous une autre piste ? Merci encore une fois pour votre temps

je ne comprends pas bien tes scripts dans le fichier

mais cela fonctionne si tu suis la procédure suivante

  1. insère une ligne dans les 3 onglets : liste pour E, liste pour F et l'onglet principal
  2. copie les cellules A4 sur A3 des onglets liste pour E, liste pour F
  3. recopie enfin uniquement les validations des cellules D, E et F de la ligne 4 sur la ligne 3 pour l'onglet principal

comme je m'aperçois que tu fais un onglet par mois, cela va vite devenir ingérable

je pense qu'il vaut mieux dans ton cas un script, je vais regarder ce point, cela permet aussi d'effacer les choix dépendants quand on change la valeur au niveau supérieur

Merci infiniment

à tester

const excl = ['Base de donnée'] // onglets non pris en compte dans onEdit
const data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Base de donnée').getDataRange().getValues()
function onEdit(e) {
  const sh = e.source.getActiveSheet()
  if (excl.indexOf(sh.getName()) != -1) { return }
  for (let j = e.range.columnStart; j <= e.range.columnEnd; j++) {
    if (j == 4) {// colonne D
      for (let i = e.range.rowStart; i <= e.range.rowEnd; i++) {
        if (i > 2) {
          sh.getRange('E' + i).clearContent().clearDataValidations()
          sh.getRange('F' + i).clearContent().clearDataValidations()
          let values = data.filter(r => r[0] == sh.getRange('D' + i).getValue())
            .map(r => r[1])
            .filter(onlyUnique)
          let validationRule = SpreadsheetApp.newDataValidation().requireValueInList(values).build()
          sh.getRange('E' + i).setDataValidation(validationRule);
        }
      }
    }
    if (j == 5) {// colonne E
      for (let i = e.range.rowStart; i <= e.range.rowEnd; i++) {
        if (i > 2) {
          sh.getRange('F' + i).clearContent().clearDataValidations()
          let values = data.filter(r => (r[0] == sh.getRange('D' + i).getValue() && r[1] == sh.getRange('E' + i).getValue()))
            .map(r => r[2])
            .filter(onlyUnique)
          let validationRule = SpreadsheetApp.newDataValidation().requireValueInList(values).build()
          sh.getRange('F' + i).setDataValidation(validationRule);
        }
      }
    }
  }
}
function onlyUnique(value, index, self) {
  return self.indexOf(value) === index;
}

J'ai testé, malheureusement ca ne marche pas

qu'est-ce qui ne fonctionne pas ? qu'est-ce qui se passe ?

prends une copie de mon fichier d'essai, j'ai collé à tes données

https://docs.google.com/spreadsheets/d/1uYOfMQhF0a2iQvjx_w6XBNZt3FvUAfPCm76O1lt0r8A/copy

C'est vraiment génial, je ne te remercierais jamais assez

qu'est-ce qui ne fonctionnait pas chez toi ?

Je ne suis pas calé en script, je l'ai copier ensuite exécuter, mais je n'ai eu aucun résultat. Je ne sais pas si j'ai raté une étape.

pourquoi l'avoir mis à l'intérieur d'une autre fonction ?

c'est corrigé, cela fonctionne

regarde le script, il n'y a plus de myFunction

Ah d'accord, my bad. Merci beaucoup pour ton aide.

Rechercher des sujets similaires à "liste cascade qui marche ligne"