Bonjour
Merci pour le travail fait, j'en ai tiré de bonnes idées pour mon classeur de suivi.
J'ai lu toutes les pages du topic et notamment la discussion intéressante sur le calcul du PRU. Je trouve ça étonnant qu'aucune fonction native ne soit prévue sur Sheets ?
Alors comme dans la vie faut être pratique quand on veut ce que l'on a pas (comme disait le poète) j'en ai écrit une que je partage ici. Je ne suis pas trop à l'aide avec le JS, le code est certainement perfectible, si vous avez des améliorations, n'hésitez pas à les partager (notamment un gestionnaire d'erreur).
La fonction calcul le PRU et permet en option de le calculer en fonction des produits. Ainsi, pas besoin d'avoir une liste chronologique par produit, la fonction est capable de sortir le PRU pour chaque produit considéré (voir exemple 1 sur le classeur partagé ci-dessous).
Le code :
Code :
- /**Calcul de PRU (Prix de Revient Unique)
- *@param {nombre|Tableau<nombres>} colCouts Colonne des coûts de la transaction
- *@param {nombre|Tableau<nombres>} colNbActions Colonne du nombre d'actions achetées
- *@param {Tableau<strings>} colProduits [Optionnel] Colonne indiquant le nom des produits
- *@param {string} prod [Optionnel] Cellule donnant le nom du produit à filtrer
- *@return {Nombre} Le PRU
- *@customfunction
- */
- function PRU(colCouts, colNbActions, colProduits, prod) {
- // Mise en tableaux des valeurs en entrée
- var couts = new Array;
- var nbAct = new Array;
- var produits = new Array;
- couts = colCouts;
- nbAct = colNbActions;
- produits = colProduits;
- if (Array.isArray(couts) & Array.isArray(nbAct)) {
- var tab = new Array;
- // Composition d'un nouveau tableau filtré si nécessaire à partir des colonnes entrées
- // tableau tab : 1ere colonne : Coûts, 2e colonnes : nbActions achetées
- var j = 0; // Numéro de ligne du tableau tab
- for(var i = 0; i < couts.length; i++) {
- // Si la colonne des produits et le nom du produit à filtrer n'est pas indéfini,
- // vérifier si la ligne lue correspond au produit 'prod'
- if (!(colProduits === undefined & prod === undefined)) {
- if (produits[i] == prod){ // si ça correspond, ajouter au tableau
- Logger.log("prod : " + prod);
- Logger.log("produits : " + produits);
- tab[j]=new Array(2);
- tab[j][0] = couts[i][0];
- tab[j][1] = nbAct[i][0];
- j++;
- }
- } else { // Sinon ajouter toutes les lignes trouvées
- tab[i]=new Array(2);
- tab[i][0] = couts[i][0];
- tab[i][1] = nbAct[i][0];
- }
- }
- // Calcul du PRU
- var nbActions0 = 0; // Nb d'actions détenues avant achat
- var prix = 0; // PRU final à retourner
- var nbActions = 0; // Nb d'actions totales après achat
- // Le PRU se calcul comme ceci :
- // Si nombre d'action est >0 alors :
- // [nouveau PRU] = ([Nb d'actions avant achat] x [PRU avant achat] + [Coût achat]) / [Nb total d'actions après achat]
- //
- // Itération du tableau pour calcul du PRU de chaque achat
- for (var i = 0; i < tab.length; i++) {
- nbActions=tab[i][1] + nbActions0
- if (tab[i][1] > 0) {
- prix = (prix * nbActions0 + tab[i][0]) / nbActions
- }
- nbActions0=nbActions
- }
- } else {
- prix = colCouts/colNbActions;
- }
- // Retourne la valeur du PRU;
- return prix;
- }
|
Et le classeur avec 2 exemples :
https://docs.google.com/spreadsheet [...] sp=sharing
C'est la première fois que je partage un classeur avec une fonction personnalisée, je ne sais pas si le code va suivre. Pour le voir (ou le recopier) il faut aller dans le menu Extensions > Apps Scripts.
Comme les autres classeurs ici, après l'avoir ouvert, il faut créer une copie : menu Fichiers > Enregistrer une copie.
Probablement que vous aurez un message de sécurité lors de l'exécution du code, il faut accepter sinon ça ne marchera pas.
En espérant que ça vous sera utile, n'hésitez pas à faire un retour !
---------------
OtObOxBlOg - - - Etre seul à avoir tort c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons