Suivie de donnée par ligne

Bonjour,

J'ai un problème assez complexe à expliquer mais je vais faire de mon mieux.Je dispo d'un tableau d'entrée (Ordo/Jours) où je liste différents codes de production suivant l'ordre d'usinage.

Cette tache est faite manuellement. Puis dans différents tableaux (ex : KFR), je fais un suivi de l'avancement de mon code de production(ok, en cours, non commencé...)

Donc pour en venir à mon problème, je retranscris mes codes dans l'ordre du tableau Ordo/Jours sur le tableau KFR. Et de là j'en fais la basse de mes formules. mais je rentre aussi des données à la main grâce à une macro (Date, heure début/fin).

Mon problème est donc que si mes codes sources changent d'ordre où sont supprimée, la donnée rentrée manuellement ne suit pas le code source.

Si il y a une solution à mon problème merci d'avance.

Sinon je prends des conseils pour refaire mon document.

Sheets :

https://docs.google.com/spreadsheets/d/17A0wJyj0XJffmZ-uG0oaNp7U8QRBioQD4dIcptBv9Fs/edit?usp=sharing

Doc (pour voir la macro) :

https://docs.google.com/document/d/1WOg4uDkXLJr_eVMLLGwCqIB71qfpvLTU1aEmLn1XeIc/edit?usp=sharing

Bonjour,

C'est copieux ! belle formule en B2 de chaque feuille.

Ce que tu exposes est assez classique en effet ! quand on lie 2 onglets en ajoutant des infos manuellement, cela ne suit plus.

On pourrait essayer différentes solutions (si tant est qu'il en existe plusieurs), dont une à laquelle je pense, c'est travailler avec des vues filtrées (attention, pas des filtres, des vues filtrées https://www.sheets-pratique.com/fr/cours/filtre)

Pour ma compréhension, à quoi correspondent les différents onglets comme KFR, KAL, BHX ... ? des ateliers ? est-ce qu'il travaillent en séquence sur le même produit ?

Merci je vais étudier cette potentiel solution.

Et pour en dire plus, il s'agit d'un suivie de liste de fabrication de meuble dans un atelier dépoté. Donc au fur et à mesure que la semaine avance des listes y sont rajoutés ou priorisées et d'autres supprimé (dans la feuille ORDO/JOURS).

Dans les autres feuilles, il y a l'avancement chaque machine de l'atelier, ce qui détermine ma feuille SUIVI LISTE.

Re,

La solution de vue filtré fonctionne, mais pour dans mon cas, il me faudrait changer l'utilisation du document source (ORDO/JOURS). C'est donc une solution de dernier recours pour moi.

J'ai pensé à une autre solution qui pourrais éventuellement fonctionner aussi, mais il me faudrait de l'aide pour du codage script Sheets.

Cela consiste à réaliser un historique de toute les listes qui sont rentrées dans l'ordonnancement. 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.

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. Les colonnesX des feuilles KFR e KAL servent justement à déclencher la macro pour avoir les dates heures et ruptures.

Si je le représente sous forme de protocole pour plus de compréhension cela donnerai ça :

- Mise à jours historique liste à chaque nouvelle liste.

- Si 1X de KFR est remplie Alors

- Lire la liste de la même ligne

- Recherche la liste dans ORDO/MASK

- Mettre la Date et Heure dans les colonne B et C en face de la liste

- Supprimer le caractère rentré dans la cellule X1

- ... (Par la suite je pense pouvoir reprendre le programme et l'adapter pour le reste des opérations similaire)

Si vous arrivez à résoudre mon problème je ne serai comment vous remercier !!

Doc Sheets :

https://docs.google.com/spreadsheets/d/1VQ0Ewhg-vWxi7RcJY95mb0NcO8Ia6QeJgQ16jCm2GBc/edit?usp=sharing

Macro utilisé jusqu'à présent :

https://docs.google.com/document/d/1WOg4uDkXLJr_eVMLLGwCqIB71qfpvLTU1aEmLn1XeIc/edit?usp=sharing

Je vais regarder, mais ton fichier est complexe ... pour aller plus vite, peux-tu m'expliquer en 2 mots ce que fait chaque onglet ?

En excel, je construisais au fur et a mesure des ajouts dans les onglets une base de données par macro événementielle.

J'aime beaucoup GSheets, mais les macros (scripts) sont exécutés côté serveur et il faut faire attention aux temps de latence éventuels, et privilégier les formules ou des scripts courts et pas trop fréquents. Il n'empêche qu'aujourd'hui, je préfère travailler avec GSheets.

En effet il doit être complexe en le découvrant, entre les données qui s'emmêlent et mes formules pas très optimisé.

ORDO/JOURS : Cette fenêtre sert à une personne du bureau de mettre l'ordre de fabrication des listes en colonne A et de remplir la quantité à faire chaque jours. L'ordre peut varier en fonction d'imprévu (demande client, rupture...) et il peut en rajouté à n'importe quel moment.

ORDO/JOURS : Elle me servirait à y faire un historique des listes et d'y incrémenter une date et une heure afin de pouvoir gérer mes dates et heures avec des rechercheV dans les feuilles de machine pour quelles suivent le cycle de l'ordonnancement.

SUIVIE LISTE : Elle permet d'un coup d'oeil de visualiser la production de l'atelier en temps réelle. (mais pas de problème ici)

RUPTURE : Permet que la personne des bureaux puisse être au courant en temps réelle des manques en atelier. (mais pas de problème ici)

RELANCE : Permet de relancer une petite production de pièce à refaire. (mais pas de problème ici)

LISTE DONNEE : porte bien son nom, c'est mon stock de données. (mais pas de problème ici)

Après il ne reste que les machines avec leurs noms en titre de feuille. (le problème rencontré se répète sur chaque machine)

EN BLEU : le débit -> il y avait déjà des document en place, donc à garder sans trop modifier. (demande de l'entreprise)

EN VERT : placage

ET LE RESTE : c'est du perçage et montage des meubles

Et si on prend exemple de la feuille KFR, l'opérateur ne doit rentré que sa date de début au lancement de la liste de fabrication et remplir l'heure quand il a fini. ce qui me permet moi de pouvoir avoir mon tableau SUIVIE LISTE

J'espère que cela te fait mieux comprendre le principe de mon tableau. Si non je peux reprendre.

Bonjour,

En D2

=SIERREUR(SI(NBVAL($C$2:C)>=1;SI(INDEX('ORDO/MASK'!$A$2:$A;EQUIV(A2;'ORDO/MASK'!$A$2:$A;0))=A2;figer(MAINTENANT());"");"");"")

La fonction figer arrive plus tard dans la Journée.

Bonne Journée

Voilà le script.

function figer(e, nom, case1, case2){
  var feuille = e.source.getActiveSheet();
  var cellule = e.source.getActiveRange();
  if (feuille.getName()==nom && cellule.getA1Notation()==case1){
    if (cellule.getValue()){
      feuille.getRange(case2).setValue(feuille.getRange(case2).getValue())
    }
  }
}

//Exécution

figer(e, "KFR", M2, D2);
figer(e, "KFR", M3, D3);
figer(e, "KFR", M4, D4);
//Et ainsi de suite...

En M2 et N2 insère une case à cocher puis marque dans M2.

=SI(ET(D2<>"";N2=FAUX);VRAI;FAUX)

Pour arrêter, coche la case N2.

A toi de tester.

Je réfléchis à un script plus perfectionné. qui évite de marquer à la manuel toutes les données.

Mais juste le nom des feuilles.

PS: Petit changement à la formule.

=SIERREUR(SI(NB.SI($C$2:C;FAUX)>=1;SI(INDEX('ORDO/MASK'!$A$2:$A;EQUIV(A2;'ORDO/MASK'!$A$2:$A;0))=A2;MAINTENANT();"");"");"")

Avec une ligne de case à cocher en C;

cela va un peu mieux pour moi ... mais dans ces cas, ce serait bien de faire un extrait du fichier qui montre la problématique de façon à se concentrer là-dessus, tu connais bien le fichier car tu y a travaillé longtemps, ce n'est pas notre cas

bon, j'espère que ImoKa a trouvé la solution, mais il me reste une question ici :

Si je le représente sous forme de protocole pour plus de compréhension cela donnerai ça :

- Mise à jours historique liste à chaque nouvelle liste.

- Si 1X de KFR est remplie Alors

- Lire la liste de la même ligne

- Recherche la liste dans ORDO/MASK

- Mettre la Date et Heure dans les colonne B et C en face de la liste

- Supprimer le caractère rentré dans la cellule X1

Tu parles de 1X, tu veux dire un coche dans la colonne C ? Tu dis supprimer le caractère de la cellule X1, là je n'ai pas bien compris !

Est-ce que ta fonction

onEdit(KFR)

seule fonctionne correctement ?

function onEdit(KFR){ 
  var f = SpreadsheetApp.getActiveSheet();
  var r = SpreadsheetApp.getActiveRange();
  if (f.getName() == 'KFR' && r.getValue()!=''){
    if (r.getColumn()>=4 && r.getColumn()<=5){
      f.getRange(r.getRow(),4).setValue(new Date());
      f.getRange(r.getRow(),5).setValue(new Date()).setNumberFormat('HH:mm:ss');
    }else if(r.getColumn()>=6 && r.getColumn()<=6) {
      f.getRange(r.getRow(),6).setValue(new Date()).setNumberFormat('HH:mm:ss');
    }
  }
}

attention, tu ne peux faire qu'une seule fonction onEdit, il faut donc combiner tous les cas, sinon une seule sera active, pas les autres. Je pense d'ailleurs qu'une unique onEDit sera simple avec juste un test de toutes les feuilles potentiellement concernées.

Bonjour,

A Mikhail, bonne idée de combiner pour onEdit.

En relisant ton problème, je rajoute dans la feuille ORDO/MASK en B2

=ARRAYFORMULA(KFR!D2:D)

Après que sa soit figer par le script.

Dans mon précédent message, je dis : « Avec une ligne de case à cocher en C »

FAUX c'est M.

J’insère tout sa dans la feuille pendant la journée.

A Mikhail, bonne idée de combiner pour onEdit.

mais c'est même indispensable, une seule fonction onEdit !


En relisant ton problème, je rajoute dans la feuille ORDO/MASK en B2

=ARRAYFORMULA(KFR!D2:D)

Après que sa soit figer par le script.

pas besoin de figer cette formule, et j'ajoute qu'il vaut mieux la mettre en titre, ligne 1 comme ceci

={"mon titre de colonne";ARRAYFORMULA(KFR!D2:D)}

Mikhail, je veux dire que le script fige les données en D2:D dans KRF jusqu’a que le problème soit résolu.

Bonjour à vous et merci pour votre aide et tous ces messages.

Cependant je n'ai pas réussi à mettre en place la solution que vous m'avez donné (par manque de compréhension et de connaissance)

//Pour commencer je vais ré pondre au message de Cta. Mon idée initial pour X1, oui je pensais à un système de case à cocher. Et dès qu'elles sont coché, elles se décocheront après avoir inscrit date et heure en face du code concernée en ORDO/MASK. Et comme je voulais faire un historique de tout les codes rentré dans ORDO/JOURS en fixe, cela me créait une basse de donné fixe qui ne sera pas sujet à d'éventuel suppression de code en ORDO/JOURS. Ainsi si la personne du bureau supprime les 10 première liste dans ORDO/JOURS, ORDO/MASK ne bougera pas et en KFR tous les codes remonteront de 10 lignes, leurs dates et heures suivront car elles sont enregistré dans ORDO/JOURS et la case à cocher sera vierge pour resélectionner des dates et heures des codes qui prendront la place des 10 qui sont remonté.

Et oui excuser moi j'ai mis le mauvais script, j'avais fait la bêtise de mettre plusieurs onEdit au début.

//Maintenant, j'ai plusieurs question sur ta solution ImoKa.

=SIERREUR(SI(NB.SI($C$2:C;FAUX)>=1;SI(INDEX('ORDO/MASK'!$A$2:$A;EQUIV(A2;'ORDO/MASK'!$A$2:$A;0))=A2;MAINTENANT();"");"");"")

Si j'ai bien compris, cette formulation me permettra d'avoir ma date si une case est coché en C:C. Mais cela me permettra-t-il d'enregistre mes date cas par cas ? (j'ai pas tout compris donc désolé si la réponse vous parait logique )

function figer(e, nom, case1, case2){
  var feuille = e.source.getActiveSheet();
  var cellule = e.source.getActiveRange();
  if (feuille.getName()==nom && cellule.getA1Notation()==case1){
    if (cellule.getValue()){
      feuille.getRange(case2).setValue(feuille.getRange(case2).getValue())
    }
  }
}

//Exécution

figer(e, "KFR", M2, D2);
figer(e, "KFR", M3, D3);
figer(e, "KFR", M4, D4);
//Et ainsi de suite...

Ensuite mon niveau en script me pause pas mal de problème. En premier je n'arrive pas à exécuter le programme.

J'ai essayer de créé un nouveau script et de tout supprimé pour le copier colle et j'ai une une erreur comme quoi je venais de supprimé une fonction. Et si je l'insert dans un onEdit() la fonction figer() n'est plus lu. Sur quelle étape je me trompe à votre avis ?

Puis je je sais pas si il faut que je change des noms de caractère. Je ne comprend pas la fonction de "e" et se que fait "case1" et "case2" et pour "nom" je penses qu'il faut que je le remplace par KFR dans notre cas.

Mon idée initial pour X1, oui je pensais à un système de case à cocher.

Et dès qu'elles sont coché, elles se décocheront après avoir inscrit date et heure en face du code concernée en ORDO/MASK.

Et comme je voulais faire un historique de tout les codes rentré dans ORDO/JOURS en fixe, cela me créait une basse de donné fixe qui ne sera pas sujet à d'éventuel suppression de code en ORDO/JOURS.

Ainsi si la personne du bureau supprime les 10 première liste dans ORDO/JOURS, ORDO/MASK ne bougera pas et en KFR tous les codes remonteront de 10 lignes, leurs dates et heures suivront car elles sont enregistré dans ORDO/JOURS et la case à cocher sera vierge pour resélectionner des dates et heures des codes qui prendront la place des 10 qui sont remonté.

merci, c'est plus clair pour moi

je le laisse en stand-by chez moi mais je reviens si problème technique sur la solution / j'y réfléchirai aussi mais j'ai un peu moins de temps à consacrer

Pour la fonction figer (avec commentaire d'expliaction):

function figer(e){
  var feuille = e.source.getActiveSheet();//Mets la feuille actuelle
  if (feuille.getName()=='KFR') {//Si le nom de la feuille est égal à KFR alors...
    feuille.getRange(D2).setValue(feuille.getRange(D2).getValue())//Dans la cellule D2 mettre D2
    feuille.getRange(D3).setValue(feuille.getRange(D3).getValue())//Dans la cellule D3 mettre D3
    feuille.getRange(D4).setValue(feuille.getRange(D4).getValue())
    feuille.getRange(D5).setValue(feuille.getRange(D5).getValue())
    feuille.getRange(D6).setValue(feuille.getRange(D6).getValue())
    feuille.getRange(D7).setValue(feuille.getRange(D7).getValue())
    feuille.getRange(D8).setValue(feuille.getRange(D8).getValue())
    feuille.getRange(D9).setValue(feuille.getRange(D9).getValue())
    feuille.getRange(D10).setValue(feuille.getRange(D10).getValue())
    feuille.getRange(D11).setValue(feuille.getRange(D11).getValue())
    feuille.getRange(D12).setValue(feuille.getRange(D12).getValue())
    feuille.getRange(D13).setValue(feuille.getRange(D13).getValue())
    feuille.getRange(D14).setValue(feuille.getRange(D14).getValue())
    feuille.getRange(D15).setValue(feuille.getRange(D15).getValue())
    feuille.getRange(D16).setValue(feuille.getRange(D16).getValue())
    feuille.getRange(D17).setValue(feuille.getRange(D17).getValue())
    feuille.getRange(D18).setValue(feuille.getRange(D18).getValue())
    feuille.getRange(D19).setValue(feuille.getRange(D19).getValue())
    feuille.getRange(D20).setValue(feuille.getRange(D20).getValue())
    feuille.getRange(D21).setValue(feuille.getRange(D21).getValue())
    feuille.getRange(D22).setValue(feuille.getRange(D22).getValue())
    feuille.getRange(D23).setValue(feuille.getRange(D23).getValue())
    feuille.getRange(D24).setValue(feuille.getRange(D24).getValue())
    feuille.getRange(D25).setValue(feuille.getRange(D25).getValue())
    feuille.getRange(D26).setValue(feuille.getRange(D26).getValue())
    feuille.getRange(D27).setValue(feuille.getRange(D27).getValue())
    feuille.getRange(D28).setValue(feuille.getRange(D28).getValue())
    feuille.getRange(D29).setValue(feuille.getRange(D29).getValue())
    feuille.getRange(D30).setValue(feuille.getRange(D30).getValue())
    feuille.getRange(D31).setValue(feuille.getRange(D31).getValue())
    feuille.getRange(D32).setValue(feuille.getRange(D32).getValue())
    feuille.getRange(D33).setValue(feuille.getRange(D33).getValue())
    feuille.getRange(D34).setValue(feuille.getRange(D34).getValue())
    feuille.getRange(D35).setValue(feuille.getRange(D35).getValue())//Dans la cellule D35 mettre D35
  }
}

Le script bloque l'heure des que le nombre de valeurs en C2:C et supérieur ou égal à 1. Et sachant que le script s'exécute à l'infini, c'est la valeur de départ qui reste.

Rappel:

La formule en D2:D35

=SIERREUR(SI(NBVAL($C$2:C)>=1;SI(INDEX('ORDO/MASK'!$A$2:$A;EQUIV(A2;'ORDO/MASK'!$A$2:$A;0))=A2;MAINTENANT();"");"");"")

Et s'est tout.

Bonne Journée.

ce code risque d'être lent, pour accélérer, remplace

feuille.getRange(D4).setValue(feuille.getRange(D4).getValue())
    feuille.getRange(D5).setValue(feuille.getRange(D5).getValue())
    feuille.getRange(D6).setValue(feuille.getRange(D6).getValue())
    feuille.getRange(D7).setValue(feuille.getRange(D7).getValue())
    feuille.getRange(D8).setValue(feuille.getRange(D8).getValue())
    feuille.getRange(D9).setValue(feuille.getRange(D9).getValue())
    feuille.getRange(D10).setValue(feuille.getRange(D10).getValue())
    feuille.getRange(D11).setValue(feuille.getRange(D11).getValue())
    feuille.getRange(D12).setValue(feuille.getRange(D12).getValue())
    feuille.getRange(D13).setValue(feuille.getRange(D13).getValue())
    feuille.getRange(D14).setValue(feuille.getRange(D14).getValue())
    feuille.getRange(D15).setValue(feuille.getRange(D15).getValue())
    feuille.getRange(D16).setValue(feuille.getRange(D16).getValue())
    feuille.getRange(D17).setValue(feuille.getRange(D17).getValue())
    feuille.getRange(D18).setValue(feuille.getRange(D18).getValue())
    feuille.getRange(D19).setValue(feuille.getRange(D19).getValue())
    feuille.getRange(D20).setValue(feuille.getRange(D20).getValue())
    feuille.getRange(D21).setValue(feuille.getRange(D21).getValue())
    feuille.getRange(D22).setValue(feuille.getRange(D22).getValue())
    feuille.getRange(D23).setValue(feuille.getRange(D23).getValue())
    feuille.getRange(D24).setValue(feuille.getRange(D24).getValue())
    feuille.getRange(D25).setValue(feuille.getRange(D25).getValue())
    feuille.getRange(D26).setValue(feuille.getRange(D26).getValue())
    feuille.getRange(D27).setValue(feuille.getRange(D27).getValue())
    feuille.getRange(D28).setValue(feuille.getRange(D28).getValue())
    feuille.getRange(D29).setValue(feuille.getRange(D29).getValue())
    feuille.getRange(D30).setValue(feuille.getRange(D30).getValue())
    feuille.getRange(D31).setValue(feuille.getRange(D31).getValue())
    feuille.getRange(D32).setValue(feuille.getRange(D32).getValue())
    feuille.getRange(D33).setValue(feuille.getRange(D33).getValue())

par

var data = feuille.getRange("D4:D34").getValues()
feuille.getRange("D4:D34").setValues(data)

je crains qu'il manque aussi des parenthèses

attention à mettre s à getValues() et setValues()

Résumons avec la correction de Mikhail, (on n'est la pour apprendre )

function figer(e){
  var feuille = e.source.getActiveSheet();//Mets la feuille actuelle
  if (feuille.getName()=='KFR') {
    var data = feuille.getRange("D4:D34").getValues()
    feuille.getRange("D4:D34").setValues(data)
  }
}

Voilà

Merci à vous deux pour vos réponses !!

Je voulais pas vous demandez parce que je commençais à avoir un peu honte de pas comprendre, mais après une matinée de recherche j'en pouvais plus.

Quand je copie colle ton programme ImoKa, je me trouve bloqué avec un message d'erreur.

ReferenceError: e is not defined

Et je n'arrive pas à m'en sortir...

on ne peut pas lancer function figer(e) à partir de l'éditeur de script, car en effet la variable e n'est pas renseignée.

soit la fonction est appelée par une autre qui lui passera la variable e

soit il s'agit d'une des quelques fonctions événementielles genre onEDit, onInstall, onOpen, onSelectionChange où on passer e comme événement

https://developers.google.com/apps-script/guides/triggers

pour ce qui est spécifiquement de cette fonction je laisse ImoKa répondre, je ne sais pas s'il a prévu de l'appeler ...

Bonjour,

2 facons,

La première par la feuille, celle la.

Mais après réflexions:

function onEdit(e){
  var feuille = e.source.getActiveSheet();//Mets la feuille actuelle
  if (feuille.getName()=='KFR') {//Vérifie le nom de la feuille
    var data = feuille.getRange("D4:D34").getValues()//Mets à la variable data les valeurs de la plage D4:D34
    feuille.getRange("D4:D34").setValues(data)//Mets les valeurs de data à D4:D34
  }
}
Rechercher des sujets similaires à "suivie donnee ligne"