Somme via index+equiv avec écrasement des données utilisées pour le calcul

Bonjour à tous,

Je travaille sur un petit logiciel de suivi des stocks (déjà ok sur les sorties), le problème que je rencontre intervient lors des entrées vu que je ne connais absolument pas ce langage :

Concrètement, je cherche un code Google Apps Script afin de mettre à jour la cellule de la colonne "ACH CUM" (achats cumulés) de l'onglet CATA en fonction de l'entrée effectuée dans la colonne "ENTREE" de l'onglet ENTREESTOCK. La nouvelle valeur de la colonne "ACH CUM" devant être sommée de la sorte : valeur précédente de la cellule + valeur entrée lors de l'entrée de stock.

Voici le lien vers le fichier de test :

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

Merci par avance pour votre aide précieuse !

Balek

Bonjour,

comment fait-on le lien entre les 2 onglets ? je pensais que les données de la colonne A seraient les mêmes ...

Bonjour,

Au temps pour moi, je pensais que c'était clair mais c'est vrai qu'il y a pas mal de colonnes..!

Le lien se fait entre la colonne AG de l'onglet CATA et la colonne A de l'onglet ENTREESTOCK qui contiennent la même valeur.

Merci d'avance,

Balek

Le lien se fait entre la colonne AG de l'onglet CATA et la colonne A de l'onglet ENTREESTOCK

si je prends CRISTA 1,5L x 6 en colonne A de ENTREESTOCK, je trouve 6 correspondances dans la colonne AG de CATA => impossible de savoir sur quelle ligne il faut appliquer cette addition "valeur précédente de la cellule + valeur entrée lors de l'entrée de stock"

il y a beaucoup de doublons

image

Oui, excuse moi je te raconte n'importe quoi...

Le lien est entre la colonne A de l'onglet CATA et la colonne D de l'onglet ENTREESTOCK, pour le coup ce sont bien des valeurs uniques..!

Ouvre l'éditeur de script, colle ceci à la place de ce qui est proposé

function onOpen() {
  var menu = [
    { name: "Autoriser", functionName: "init" }
  ];
  SpreadsheetApp.getActiveSpreadsheet().addMenu("➪ M E N U", menu);
}
function init() {
  SpreadsheetApp.getActive().toast("L'application est initialisée.");
}
function onEdit(e) {
  var sh = e.source.getActiveSheet()
  var cel = e.source.getActiveRange();
  if (sh.getName() == 'ENTREESTOCK' && cel.getColumn() == 3) {
    var cata = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('CATA')
    var ref = cata.getRange('A:A').getValues().flat()
    var ligne = ref.indexOf(cel.offset(0, 1).getValue()) + 1
    if (ligne > 0) {
      cata.getRange('AB' + ligne).setValue((cata.getRange('AB' + ligne).getValue()) * 1 + (e.value) * 1)
      SpreadsheetApp.getActive().toast(e.value + ' ' + cel.offset(0, 1).getValue() + ' ajouté(s)')
    }
  }
}

enregistre

ferme et rouvre le fichier

tu verras un menu en haut à droite pour activer

donne les autorisations ... et c'est bon

Hello Steelson,

Désolé pour ma réponse tardive, trop de boulot.

Merci, ça marche impec, je marque le sujet comme résolu !

Maintenant, la cerise sur le gâteau serait qu'une fois les quantités mise a jour via ton code, les colonne A et C de l'onglet ENTREESTOCK soit vidées et que les colonnes AE à AG de l'onglet CATA soient copiées vers une nouvelle feuille appelée COURSES, puis trié par "Denom perso" croissante sur ce nouvel onglet (ignorer "vide" et "0"), avant d'être envoyé vers l'impression puis de supprimer ce même onglet.

Franchement si tu arrives à me sortir le code correspondant (et j'imagine bien que tu l'es haha), tu n'imagines pas a quel point cela m'aiderait quotidiennement.....!

Encore merci pour ton travail déjà accompli et ta réactivité.

Balek

Mieux ! Vu que tu m'as créé un petit menu sympa; que ce que je viens de te demander soit traitable indépendamment (via une autre macro dans ton menu, quoi) de ce que tu m'as déjà mis en place stp.

Bonne soirée !

Balek

Maintenant, la cerise sur le gâteau serait qu'une fois les quantités mise a jour via ton code, les colonne A et C de l'onglet ENTREESTOCK soit vidées

il serait alors plus intéressant de passer tes formules en arrayformula (et au passage supprimer a minima 900 lignes pour alléger ton fichier), si tu peux le faire de ton côté

function onOpen() {
  var menu = [
    { name: "RAZ", functionName: "raz" }
  ];
  SpreadsheetApp.getActiveSpreadsheet().addMenu("➪ M E N U", menu);
}
function raz() {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ENTREESTOCK')
  var lr = Math.max(sh.getLastRow(),3)
  sh.getRange('A2:A'+lr).clearContent()
  sh.getRange('C2:C'+lr).clearContent()
}

et que les colonnes AE à AG de l'onglet CATA soient copiées vers une nouvelle feuille appelée COURSES, puis trié par "Denom perso" croissante sur ce nouvel onglet (ignorer "vide" et "0"), avant d'être envoyé vers l'impression puis de supprimer ce même onglet.

ok, mais sauf impression car cela pose souvent des problèmes, on peut par contre sortir en pdf

solution plus simple, sur une nouvelle feuille COURSES

=query(CATA!AE:AG;"select AG,AE,AF where AE>=0 or AF>=0 order by AG";1)

que tu imprimes

Rechercher des sujets similaires à "somme via index equiv ecrasement donnees utilisees calcul"