Afficher cellule dans une autre feuille en fonction d'une valeur

Bonjour à tous,

J'aurais deux petites questions à vous poser, tout d'abord je vais expliquer ce que je souhaite faire :

Lorsque je vais mettre dans ma liste déroulante "A envoyer" (Colonne K) alors, je souhaiterais afficher certaines cellules dans une autre feuille qui se nomme "Expe"

En effet, j'ai pu venir sur le forum dernièrement et j'avais une demande similaire, mais c'était pour couper / coller une ligne, cette fois-ci il faudrait qu'elle soit affiché et non copier / coller pour la simple et bonne raison, que s'il y a une modification sur cette cellule sur la feuille 1, je souhaiterais qu'elle se répercute sur la seconde.

J'ai donc testé de repartir de l'ancien code que j'avais et de le modifier (sur cette exemple c'est donc un copier / coller et non un affichage) :

    // expe
  var col= 11; // colonne K
  if (r.getColumn() == col && f.getName() == feuille){ 
    if(r.getValue() == 'A envoyer'){ 
      var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("EXPE");
      destination.insertRowBefore(2);
      var plage = f.getRange('B'+ r.getRow() + ':W'+ r.getRow()); 
      plage.copyTo(destination.getRange('A2'), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);  
    } 
  }

De même, sur ce test je copie colle donc TOUTES les cellules comprises entre B et W, y a-t-il un moyen de concaténer pour afficher par exemple les colonnes B - H - I - L etc. et non toutes les cellules de la ligne ?

En gros, je souhaiterais simplement faire l'équivalent du ='LE_NOM_DE_MA_FEUILLE'!MACELLULE mais avec une condition, peut-être ai-je cherché trop loin et trop compliqué ?

Dans l'attente de vous lire, bonne journée à vous tous

EDIT : Voici le lien vers le fichier de test : https://docs.google.com/spreadsheets/d/1CfpUIkRlClqjEy2AXf4okSl6aMH3Pq8yYFgBoucatMA/edit?usp=sharing

Bonjour,

je te le fais demain (sauf si qqun prend le sujet d'ici là)

  • mais au cas où ... y a t'il un identifiant unique qui permet de relier une feuille à l'autre ?
  • toutefois je vais essayer en mettant des formules, ce qui lira directement les 2 feuilles, quelque chose comme
feuille.getRange("XY").setFormula("=ma_formule");

Bonjour,

function onEdit(event){ 
  var feuille = "TABLEAU_DE_SUIVI_DE_FABRICATION";
  var f = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  // expe
  var col= 11; // colonne K
  if (r.getColumn() == col && f.getName() == feuille){ 
    if(r.getValue() == 'A envoyer'){ 
      var d = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("EXPE");
      d.insertRowBefore(2);
      d.getRange("A2").setFormula("=" + feuille + "!B" + r.getRow());
      d.getRange("B2").setFormula("=" + feuille + "!H" + r.getRow());
      d.getRange("C2").setFormula("=" + feuille + "!I" + r.getRow());
      d.getRange("D2").setFormula("=" + feuille + "!L" + r.getRow());
      f.getRange("X" + r.getRow()).setFormula('=iferror(row(EXPE!A2);"ligne supprimée")');
    } 
  }
}

on peut aussi prévoir une correction/retour en arrière en exploitant la valeur que j'ai mise dans la colonne X de

TABLEAU_DE_SUIVI_DE_FABRICATION

on peut aussi prévoir une correction/retour en arrière en exploitant la valeur que j'ai mise dans la colonne X de TABLEAU_DE_SUIVI_DE_FABRICATION

function onEdit(event){ 
  var feuille = "TABLEAU_DE_SUIVI_DE_FABRICATION";
  var f = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  // expe
  var col= 11; // colonne K
  if (r.getColumn() == col && f.getName() == feuille){ 
    var d = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("EXPE");
    if(r.getValue() == 'A envoyer'){ 
      d.insertRowBefore(2);
      d.getRange("A2").setFormula("=" + feuille + "!B" + r.getRow());
      d.getRange("B2").setFormula("=" + feuille + "!H" + r.getRow());
      d.getRange("C2").setFormula("=" + feuille + "!I" + r.getRow());
      d.getRange("D2").setFormula("=" + feuille + "!L" + r.getRow());
      f.getRange("X" + r.getRow()).setFormula('=iferror(row(EXPE!A2);"ligne supprimée")');
    } else {
      var ligne = f.getRange("X" + r.getRow()).getValue();
      if (typeof ligne == 'number'){
        d.deleteRow(ligne);
      }
      f.getRange("X" + r.getRow()).setValue('');
    }    
  }
}

Bonjour Steelson,

Je viens de faire les tests sur le fichier test, c'est IMPEC ! Et merci pour le petit rajout de "correction" c'est génial, plus qu'à tout mettre en place sur mon fichier principal sans tout casser ! Merci encore !

Rebonjour,

Tout fonctionne à la perfection, encore merci, j'aurais cependant une petite demande en plus, rajouter une condition à savoir :

N'appliquer le code ci-dessous QUE si la colonne "J" affiche "OUI"

    // expe
  var col= 11; // colonne K
  if (r.getColumn() == col && f.getName() == feuille){ 
    var d = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("EXPEDITION");
    if(r.getValue() == 'A envoyer'){ 
      d.insertRowBefore(2);
      d.getRange("A2").setFormula("=" + feuille + "!B" + r.getRow());
      d.getRange("B2").setFormula("=" + feuille + "!D" + r.getRow());
      d.getRange("C2").setFormula("=" + feuille + "!H" + r.getRow());
      d.getRange("D2").setFormula("=" + feuille + "!I" + r.getRow());
      d.getRange("E2").setFormula("=" + feuille + "!L" + r.getRow());
      f.getRange("AA" + r.getRow()).setFormula('=iferror(row(EXPEDITION!A2);"ligne supprimée")');
    } else {
      var ligne = f.getRange("AA" + r.getRow()).getValue();
      if (typeof ligne == 'number'){
        d.deleteRow(ligne);
      }
      f.getRange("AA" + r.getRow()).setValue('');
    }    
  }

Est-ce faisable en repartant de ce même code ?

essaie de modifier cette ligne

if(r.getValue() == 'A envoyer'){

comme ceci

if(r.getValue() == 'A envoyer' && r.offset(0,2).getValue() == 'OUI'){

mais malheureusement ce n'est pas top car cela risque de perturber les annulations de 'A envoyer', donc la modif est plus complexe que cela ! Si on modifie le Oui en Non il faudrait aussi supprimer le 'A envoyer' et la ligne en expédition ...

Hummm, intéressant j'ai testé et ça ne fonctionnait plus avec ta proposition, à savoir :

Le "OUI" n'est pas un "OUI" dans mon doc, c'est "JMJ" donc j'avais remplacé par ça, car en gros cette case correspond aux différents fournisseurs, et le but étant de dire SI c'est JMJ alors balance la ligne dans EXPEDITION sinon ne rien faire ...

Cela impliquerait donc de modifier le code ?

En revanche oui je trouvais vraiment top ton rajout pour l'annulation, si ça pouvait fonctionner aussi ce serait top ... !

Réponse d'ici demain matin ...

Super, encore merci pour ton temps et bonne fin de journée :D

Dans cette solution, je loque la modif de la colonne J si c'est 'A envoyer', et je bloque la colonne K si ce n'est pas JMJ (mais je pense que cela bloque aussi les autres valeurs)

function onEdit(event){ 
  var feuille = "TABLEAU_DE_SUIVI_DE_FABRICATION";
  var f = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  var d = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("EXPE");

  // expe
  // colonne J = pas de modif si 'A envoyer'
  if (r.getColumn() == 10 && f.getName() == feuille){ 
    if(r.offset(0,1).getValue() == 'A envoyer'){ 
      r.setValue('JMJ');
    }
  }
  // colonne K
  if (r.getColumn() == 11 && f.getName() == feuille){ 
    if(r.getValue() == 'A envoyer' && r.offset(0,-1).getValue() != 'JMJ'){ 
      r.setValue('');
    }
    if(r.getValue() == 'A envoyer' && r.offset(0,-1).getValue() == 'JMJ'){ 
      d.insertRowBefore(2);
      d.getRange("A2").setFormula("=" + feuille + "!B" + r.getRow());
      d.getRange("B2").setFormula("=" + feuille + "!H" + r.getRow());
      d.getRange("C2").setFormula("=" + feuille + "!I" + r.getRow());
      d.getRange("D2").setFormula("=" + feuille + "!L" + r.getRow());
      f.getRange("X" + r.getRow()).setFormula('=iferror(row(EXPE!A2);"ligne supprimée")');
    }else{
      var ligne = f.getRange("X" + r.getRow()).getValue();
      if (typeof ligne == 'number'){
        d.deleteRow(ligne);
      }
      f.getRange("X" + r.getRow()).setValue('');
    }    
  }
}

En effet je viens de tester et ça bloque tout malheureusement, ce n'est pas le but, puisque par exemple si je veux mettre un "AUTRE" expéditeur, alors la case disparait si je veux mettre "A envoyer" :/

Mais ce n'est pas dans l'urgence, si tu veux que l'on regarde demain matin à tête reposé :)

image

Je n'ai donc pas bien compris le rôle de cette colonne J. Si tu peux repréciser...

Tout fonctionne à la perfection, encore merci, j'aurais cependant une petite demande en plus, rajouter une condition à savoir :

N'appliquer le code ci-dessous QUE si la colonne "J" affiche "OUI"

Le "OUI" n'est pas un "OUI" dans mon doc, c'est "JMJ" donc j'avais remplacé par ça, car en gros cette case correspond aux différents fournisseurs, et le but étant de dire SI c'est JMJ alors balance la ligne dans EXPEDITION sinon ne rien faire ...

En effet je viens de tester et ça bloque tout malheureusement, ce n'est pas le but, puisque par exemple si je veux mettre un "AUTRE" expéditeur, alors la case disparait si je veux mettre "A envoyer" :/

j'ai juste un peu de mal à suivre ...

Je comprends, désolé j'essaie d'expliquer au mieux mais ce n'est pas toujours simple ^^ Je reprends :

Le but du code est : SI la colonne "J" renvoie "JMJ" ET que la colonne "K" renvoie "A envoyer" ALORS on mets la ligne dans la page EXPE

Mais en revanche la colonne J et la colonne K ne doivent pas être bloquées, elles doivent pouvoir continuer de fonctionner sans contraintes :)

Si ce n'est pas assez claire / facile à comprendre, au pire des cas je pourrais passer en privé pour t'envoyer une capture d'écran du vrai tableau, ce sera peut-être plus facile à comprendre

Le but du code est : SI la colonne "J" renvoie "JMJ" ET que la colonne "K" renvoie "A envoyer" ALORS on mets la ligne dans la page EXPE

Mais en revanche la colonne J et la colonne K ne doivent pas être bloquées, elles doivent pouvoir continuer de fonctionner sans contraintes :)

Mon soucis est la cohérence.

  • Que fait-on quand la colonne J est alors modifiée,
    • pour une autre valeur > ne rien faire
    • avec effacement > il faudrait logiquement effacer 'A envoyer' et supprimer la ligne dans EXPE
  • Que fait-on quand la colonne K n'est plus égale à 'A envoyer' > il faudrait logiquement supprimer la ligne dans EXPE

Je comprends où tu veux en venir,

Pour la colonne K : En effet il faut supprimer la ligne lorsque ce n'est plus égale à "A envoyer"

Pour la colonne J : Idéalement, ce serait de supprimer la ligne dans "EXPE" SI la case n'est plus égale à "JMJ" mais de ne pas toucher à "A envoyer" car peu importe l'expéditeur, ça reste "A envoyer"

ok

Bonjour à tous,

J'aurais deux petites questions à vous poser, tout d'abord je vais expliquer ce que je souhaite faire :

Lorsque je vais mettre dans ma liste déroulante "A envoyer" (colonne K) alors, je souhaiterais afficher certaines cellules dans une autre feuille qui se nomme "Expe" En effet, j'ai pu venir sur le forum dernièrement et j'avais une demande similaire, mais c'était pour couper / coller une ligne, cette fois-ci il faudrait qu'elle soit affiché et non copier / coller pour la simple et bonne raison, que s'il y a une modification sur cette cellule sur la feuille 1, je souhaiterais qu'elle se répercute sur la seconde.

J'ai donc testé de repartir de l'ancien code que j'avais et de le modifier (sur cette exemple c'est donc un copier / coller et non un affichage)

Je voudrai savoir comment vous vous y êtes pris pour tester l'ancien code

Bonjour Azeline,

"L'ancien" code proviens d'un topic qui j'avais fait il y a quelques temps : https://forum.excel-pratique.com/sheets/deplacer-une-ligne-dans-une-autre-feuille-en-fonction-d-une-...

Rechercher des sujets similaires à "afficher feuille fonction valeur"