Suivie de donnée par ligne

De temps en temps je reviens sur ce sujet. Et j'ai toujours des problèmes de compréhension / je pense aussi qu'on n'est pas sur la bonne voie.

Si la liste n'est jamais apparu dans ORDO/MASK, colonne A, alors l'inscrire dans cette liste à la suite. Un bouton d'exécution peut être mis en place si nécessaire.

"si la liste n'est jamais apparu" .... quelle liste ?

"alors l'inscrire dans la liste" ... quelle liste ? une liste inscrite dans une liste ?

ou alors c'est une nouvelle référence qu'il faut donc ajouter à la liste des références


Une fois l'historique fixe dans la feuille ORDO/MASK, colonne A, l'opérateur n'aura qu'a remplir une cellule sur la même ligne que la liste.

c'est quoi l'historique ? et où l'opérateur renseigne ... dans les onglets KFR etc ? à préciser car c'est évident pour toi mais il faut que tu puisses expliquer tout cela clairement à quelqu'un qui passe dans la rue et ne connait pas ton sujet

Les colonnesX des feuilles KFR e KAL servent justement à déclencher la macro pour avoir les dates heures et ruptures.

je n'ai rien vu en colonne X


je reconnais que je suis un peu "chiant" mais voici une citation de Nicolas Boileau que me répétait mon prof de français

Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.

je n'ai pas retrouvé les consignes de stackoverflow qui demandent de faire un exemple simple représentatif, reproductible du problème en élaguant tout ce qui marche bien ... je suis sûr qu'on aurait pu répondre en un rien d etemps

Bonjour, en effet je pense qu'on est partie sur de mauvaise base à cause de mes explications bancal, excusez moi. je vais reprendre à zéro.

Désolé ImoKa mais ta solution je n'ai pas réussi à la faire tournée comme je voulais.

Pour tous reprendre, j'ai fait un tableau simplifié. Si il y a un 1 au début de la feuille c'est que se sont les feuilles de base sur les quelles je travaille. Et si il y a un 2 c'est un exemple de ces même feuilles après modification.

1) il a une personne en bureau qui remplie/supprime/rajoute des références dans une liste de référence en A:A de la feuille 1-BBB, ce qui deviendra 2-BBB une fois modifié. La liste de référence est classé par ordre de priorité d'usinage. La priorité est à celle la référence la plus haut.

2) Dans la feuille 1-AAA, un opérateur remplie seulement la colonne date, heure début et heure fin en fonction de son travail.

3) Pour exposé mon problème, je vous ai mis la feuille erreur 1-AAA. On aperçoit que les dates rentré manuellement ne suivent pas la référence au quelle elle sont attribué lorsque la personne du bureau fait des modification à 1-BBB. (AE qui n'était pas commencé se retrouve terminé selon mon tableau alors que c'est faux)

Mon problème est donc de faire suivre les dates avec la référence pour la quelle elle est attribué lorsque que la personne du bureau fait des modification à 1-BBB.

4) Pour ça avec un collègue, on a plusieurs solution en tête. La première est de faire une nouvelle feuille 1-BBB/MASK , qui sera masqué, ou un historique de toute les références qui seront rentré en A:A feuille 1-BBB en donnée fixe. Cela me permettra de fixé mes dates en face de la bonne référence dans l'historique lorsque l'opérateur actionnera la macro (action pas encore définie). Puis je n'aurais qu'a faire des recherchev en 1-AAA dans les colonnes date ,heure début, heure fin.

5) Sinon nous avions pensé à une autre méthode. C'est une macro qui se déclencherai quand A:A de 1-BBB serai modifier. Pour sont fonctionnement 1-AAA sera dupliqué une première fois en valeur fixe sous le nom de 1-AAA/MASK. Cette page sera une sauvegarde de 1-AAA.

Donc lorsque A:A de 1-BBB serai modifier, la macro supprimera les données des colonnes date ,heure début, heure fin dans un premier temps, puis copiera les colonnes de date ,heure début, heure fin de 1-AAA/MASK pour les coller dans 1-AAA. La macro se basera sur la recherche de références égalent ligne par ligne afin de gérer ses copier/coller.

Une fois fini, elle remettra à jours la sauvegarde de 1-AAA en 1-AAA/MASK. Puis attendra le prochain changement.

nous avons donc essayé de commencer cette macro et nous en arrivons à ce point :

function onEdit(){ 
  var f = SpreadsheetApp.getActiveSheet();
  var r = SpreadsheetApp.getActiveRange();
  if (f.getName() == '1-BBB' && r.getValue()!=''){
    if (r.getColumn()>=1 && r.getColumn()<=1){
      var j=1
      var i=2
      for i<50 {
        while j<50 {
            if i=j {
              "copier coller les valeurs de 1-AAA/MASK sur 1-AAA en face de la bonne réf"
            else
            j=j+1   
            }
        i=i+1
        }
      }
   }
}

 

i correspond à la lecture dans la colonne A:A de 1-AAA et j à la lecture dans 1-AAA/MASK.

J'espère que cette fois si j'ai réussi mon explication et je voulais avoir un avis et un peu d'aide ou de confirmation sur ma future macro si possible.

Pour reprendre mon précédant ébauche de programme sur la méthode du copier/coller, j'ai essaye de le rédigé du mieux que je puisse encore (même si il est encore en cours d'évolution).

J'ai eux un soucis avec getValue que je dois rectifier, c'est prévu.

Ps : j'ai transformé 1-AAA en AAA / 1-AAA/SAUVEGARDE en AAA/MASK et 1-BBB en BBB pour des soucis pratique.

function onEdit(){ 
  var f = SpreadsheetApp.getActiveSheet();
  var r = SpreadsheetApp.getActiveRange();
  if (f.getName() == 'BBB' && r.getValue()!=''){
    if (r.getColumn()>=1 && r.getColumn()<=1){
      var i = 2 // la ligne de AAA
      var j = 2 // la ligne de AAA/MASK
      //Remettre les dates et heures en face des référence déblacé en AAA
      for (i < 0; i<=50; i++) {
        var h = getName(AAA).getRange(i.getColumn(),1.getValue()) // lire la valeur en AAA ligne/ligne
        while (j<=50) { 
          var p = getName(AAA/MASK).getRange(j.getColumn(),1.getValue()) // lire la valeur en AAA/MASK
          if (h = p) {
           // "copier la ligne j dans AAA la la ligne i"
            j = 50
          }
          else {
            j = j+1
          }
        }
        i = i+1
      }
      i = 2
      j = 2
      //Remettre à jours la sauvegarde en AAA/MASK, en copier/coller ligne/ligne
      for (i<0; i<=50; i++) {
        l = getName(BTS).getRange(i.getColumn(),2.getValue())
        getName(BTS/MASK).getRange(j.getRow(),2).setValue(l)
        m = getName(BTS).getRange(i.getColumn(),3.getValue())
        getName(BTS/MASK).getRange(j.getRow(),3).setValue(m)       
        n = getName(BTS).getRange(i.getColumn(),4.getValue())
        getName(BTS/MASK).getRange(j.getRow(),4).setValue(n)
        i = i + 1
        j = j + 1
      }
    }
  }
}

1) il a une personne en bureau qui remplie/supprime/rajoute des références dans une liste de référence en A:A de la feuille 1-BBB, ce qui deviendra 2-BBB une fois modifié. La liste de référence est classé par ordre de priorité d'usinage. La priorité est à celle la référence la plus haut.

2) Dans la feuille 1-AAA, un opérateur remplie seulement la colonne date, heure début et heure fin en fonction de son travail.

3) Pour exposé mon problème, je vous ai mis la feuille erreur 1-AAA. On aperçoit que les dates rentré manuellement ne suivent pas la référence au quelle elle sont attribué lorsque la personne du bureau fait des modification à 1-BBB. (AE qui n'était pas commencé se retrouve terminé selon mon tableau alors que c'est faux)

Dans l'attente du fichier qui illustre ce que tu dis, voici quelle me semble être la solution la plus simple :

  1. faire une feuille "maître", ce qui me semble être le cas de la feuille BBB :
    1. celle-ci comprend les références
    2. d'autres informations en propre (désignation, priorité, besoin hebdo)
    3. voire des informations des feuilles atelier par des fonctions comme RECHERCHEV pour avoir une vue synthétique
  2. sur chaque feuille "atelier", lister les références en "dur" (et surtout ne pas mettre = la colonne A de la feuille BBB, voir remarque [*]) :
    1. on peut y rapatrier certaines valeurs de l'onglet maître comme des désignations et des priorités (n° de ligne) par les fonctions classiques RECHERCHEV et EQUIV
    2. on peut y ajouter des informations propres comme les dates, heures, etc.
  3. la référence constitue le seul lien ombilical entre les feuilles, elles peuvent être retriées indépendamment

et puis c'est tout !

[*] il faut que les références de chaque feuille soient notées en "dur", c'est-à-dire qu'elles ne soient pas le résultat d'une formule quelconque (de type =, ou query, ou filter).

  • Soit on propage par script l'inscription d'une nouvelle référence quand elle est entrée dans BBB la feuille maître.
  • Soit on laisse les ateliers entrer cette nouvelle référence en puisant dans un menu déroulant.
  • Si suppression d'une référence dans la feuille-maître c'est que je suppose le travail terminé !

Nota : en dehors de la stricte question posée ... si plusieurs ateliers différents accèdent au même fichier en même temps, je pense qu'il faut

  • soit travailler en filter-view ou vue filtrée (a nouveau ce n'est pas un filtre)
  • soit travailler dans des fichiers séparés, c'est l'avantage de GSheets puisque tous les fichiers sont sur serveurs et se parlent relativement facilement.

Mince j'était tellement la tête devant j'ai même pas remarqué que j'avais pas mis mon fichier.

Dans le 1, l'ordre de dans les quelles sont classés les références indique directement leurs priorité

Et oui j'aimerai bien que mes référence soient fixe sur les pages atelier cela me simplifierai la tache. Mais la personne qui devra le mettre à jours y passerai trop de temps. Je ne connais que la solution pleinement manuelle pour l'instant. Il devrait remplir la fiche mère (BBB) pour le nouvelle ordo, ainsi que faire tout le trie sur 8 pages ateliers. Il refusera le document si je lui présente cela.

Apres vous avez évoqué un solution c'est de rajouté par script dans les feuille atelier toutes nouvelles références inscrivent en BBB. Cela peut amplement convenir au document. Mais je connais que la recherche pas/pas en script il y a t'il une autre façon.

Encore désolé pour le doc oublié...

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

Apres vous avez évoqué un solution c'est de rajouté par script dans les feuille atelier toutes nouvelles références inscrivent en BBB. Cela peut amplement convenir au document. Mais je connais que la recherche pas/pas en script il y a t'il une autre façon.

oui, cela ma parait simple et sain, je vais regarder ...

https://docs.google.com/spreadsheets/d/17pI7jnp7DFiwJslVHNNZ0G1-qHRzLXFyBsyDTEH0r3M/copy

var listeAteliers = ['ATELIER X','ATELIER Y','ATELIER Z']

function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='LISTE' && cellule.getColumn()==1 && cellule.getValue()!=''){
    listeAteliers.forEach(function(atelier){
      var f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(atelier)
      var values = f.getRange('A:A').getValues().join().split(","); 
      if ( values.indexOf(cellule.getValue()) == -1 ){
        var der = f.getLastRow()+1
        f.getRange('A'+der).setValue(cellule.getValue())
      }
    })
  }
}

un ajout d'une référence inconnue dans les autres feuilles identifiées entraîne la mise à jour des feuilles

à coupler avec ton propre onEdit (je n'ai pas voulu y toucher car je e comprends pas le rôle de chaque feuille)

Pour traiter l'horodatage ...

var listeAteliers = ['ATELIER X','ATELIER Y','ATELIER Z']

function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName()=='LISTE' && cellule.getColumn()==1 && cellule.getValue()!=''){
    listeAteliers.forEach(function(atelier){
      var f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(atelier)
      var values = f.getRange('A:A').getValues().join().split(","); 
      if ( values.indexOf(cellule.getValue()) == -1 ){
        var der = f.getLastRow()+1
        f.getRange('A'+der).setValue(cellule.getValue())
      }
    })
  }
  else if(listeAteliers.indexOf(feuille.getName())!=-1){
    Browser.msgBox(feuille.getName())
    // ici le traitement de l'horodatage
  }
}

Si ensuite, tu veux rapatrier des informations (i.e. la désignation) dans les onglets ateliers ...

={"DESIGNATION";arrayformula(if(A2:A="";;vlookup(A2:A;LISTE!$A:$B;2;0)))}

à mettre en première ligne puisque la formule contient l'en-tête elle-même.

Idem si tu veux que les dates remontent dans l'onglet maître.

Merci pour ce programme, il va m'être très utile pour avoir une solution en partant d'un historique. Mais il serait plus lent que la deuxième solution que j'avais évoqué.

J'ai un petit déblocage de ce langage à force de chercher et surtout avec les programmes que vous me transmettiez. J'ai donc commencé à coder la deuxième solution qui serait me mieux adapté à mon document.

Pour reprendre, dès que je change une cellule en A:A de BBB le programme se lance. Le temps que la liste de référence soit finie d'être modifié, il y aurais une casse (remplit ou non) qui ferai office de "bouton". Ce qui permet que le programme ne se lance pas directe.

Par la suite la colonne A:A de AAA se mettra à jours automatiquement avec une formule =. Le programme se lance. Il vient chercher les références en A:A de AAA et A:A de AAMASK afin de copier les valeurs dans AAAMASK pour les coller dans AAA. Une fois que toute les valeurs on été faite, la page AAAMASK se remet à jours en copier la page AAA.

Puis cela fait reprend au début. Cependant j'ai pas d'indication d'erreur mais je n'arrive pas a faire tourné mon programme il se bloque.

Je voulais donc vous demander si vous pouviez me corrigé sur mes fautes de codage.

Dès que je rentre dans le premier while j'arrive pas à en sortir. Et je suis bloquer après le premier for aussi.

function onEdit(event){
  var bbb = SpreadsheetApp.getActiveSheet();
  var cellule = SpreadsheetApp.getActiveRange();
  if (bbb.getName()=='BBB' && cellule.getColumn()==1 && cellule.getValue()!=''){
    // J'ai mis en place une sorte de "bouton" pour pouvoir changer la liste en BBB tranquillement sans que le programme se lance
    var modification = bbb.getRange(1,2).getValue();
    if (modification != ''){
      Browser.msgBox("A2");
    while (modification !=''){
      modification = bbb.getRange(1,2).getValue();
    }
    Browser.msgBox("ERREUR");// Il y a une erreur avec la boucle dessus le progremme n'en sort pas
    var i = 2; // ligne de AAA
    var j = 2; // Ligne de AAAMASK

// Ici je vais faire conrespondre les pages AAA et AAAMASK

    for (i < 0; i<=50; i++) {
      while (j<=50) { 
        var aaa = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(AAA);
        Browser.msgBox("ERREUR"); // la ligne juste dessus bloque le programme 
        var aaamask = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(AAAMASK);
        var aaaref = aaa.getRange(i,1).getValue(); // lire la valeur REF en AAA
        var aaamaskref = aaamask.getRange(j,1).getValue(); // lire la valeur REF en AAAMMASK
        if (aaaref == aaamaskref) {
          var aaamaskdate = aaamask.getRange(j,2).getValue(); //Prend les valeur sur la page AAAMASK
          var aaamaskHB = aaamask.getRange(j,3).getValue();
          var aaamaskHF = aaamask.getRange(j,4).getValue();
          var aaamaskrup = aaamask.getRange(j,5).getValue();
          aaa.getRange(i,2).getValue(aaamaskdate); //Met les valeur copier en AAAMASK en AAA
          aaa.getRange(i,3).getValue(aaamaskHB);
          aaa.getRange(i,4).getValue(aaamaskHF);
          aaa.getRange(i,5).getValue(aaamaskrup);
          j = 50;
        }
        j = j+1;
      }
    }

    // Ensuite je copier toute les valeurs de AAA pour les coller en AAAMASK pour les sauvgarder

    var j = 2;
    var j = 2;
    for (i < 0; i<=50; i++) {
      var aaa = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(AAA);
      var aaamask = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(AAAMASK);
      var aaaref = aaa.getRange(i,1).getValue(); //Prend les valeur sur la page AAA
      var aaadate = aaa.getRange(i,2).getValue(); 
      var aaaHD = aaa.getRange(i,3).getValue();
      var aaaHF = aaa.getRange(i,4).getValue();
      var aaarup = aaa.getRange(i,5).getValue();
      aaamask.getRange(j,1).getValue(aaaref);//Je met les valeur copier en AAA en AAAMASK
      aaamask.getRange(j,2).getValue(aaadate);
      aaamask.getRange(j,3).getValue(aaaHD);
      aaamask.getRange(j,4).getValue(aaaHF);
      aaamask.getRange(j,5).getValue(aaarup);
      j =j+1;
      }
    }
  }
}

Je remet le tableau qui va avec :

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

Qu'est-ce qui te fait dire cela ?

Mais il serait plus lent que la deuxième solution que j'avais évoqué.

ce que je comprends, c'est que tu veux réaliser la recopie en maîtrisant le moment où tu le fais (tu parles de "case qui ferait office de bouton"), dans ce cas, au lieu de onEdit, il faut utiliser un menu spécifique que tu peux ajouter à la barre de menu.


Pour ton programme, j'ai juste parcouru visuellement ...

    while (modification !=''){
      modification = bbb.getRange(1,2).getValue();
    }

tu ne sors jamais de la boucle car rien ne change dans celle-ci, la valeur de la variable modification reste toujours figée à la cellule B1

comme je ne sais pas comment tu veux parcourir ta feuille à la recherche d'une cellule vide, je ne peux pas te corriger,

mais cette façon de faire est très chronophage car elle prendrait les cellules une à une au lieu de retenir en une seule fois un bloc de cellules


var aaa = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(AAA);

AAA n'est défini nulle part, à moins qu'il ne s'agisse d'une valeur et dans ce cas il faut mettre

var aaa = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('AAA');
Rechercher des sujets similaires à "suivie donnee ligne"