Duplication de la ligne précédente en utilisant une macro

Bonjour,

Je suis en cour de réalisation d'un fichier google sheets pour maintenir une comptabilité "légère" pour une activité équestre.

Ci dessous une explication sommaire du fichier et du problème que cela induit :

- Dans la feuille "saisie des mouvements" je saisie les dépenses / recettes

- La feuille "cal_filtre_catégorie" me permet d'éditer les items de catégorie selon le type (recette ou dépense) sélectionné dans la liste déroulante de la feuille "saisie des mouvements" (colonne B). Ainsi dans la colonne C de la feuille "saisie des mouvements" ma liste déoulante contient les items de catégorie du type (recette ou dépense) sélectionné dans la colonne B (principe d'une liste déroulante conditionnelle).

Ce que je souhaiterai par la suite c'est,

pour la 1ère macro :

-1- Dans la feuille "saisie des mouvements" je puisse ajouter une ligne de mouvement (une nouvelle entrée) sous la dernière ligne saisie, et ensuite effacer le contenu de la cellule A, B, C, D, F et H (ne garder que les formules qui ont été recopiée dans les cellules E et G).

-2- Mais aussi en complément dans la feuille "cal_filtre_catégorie" saisir (ou copier) la formule qui me permet d'éditer les items de catégorie dans la cellule de la ligne correspondante à celle crée dans la feuille "saisie des mouvements".

-3- Enfin revenir sur la 1ère cellule de la ligné crée dans la feuille "saisie des mouvements", c'est à dire la date.

Avec pour seule contrainte que la cellule AX de la feuille "saisie des mouvements" soit sélectionnée (avec X = la ligne après la dernière ligne saisie), peu importe la cellule sélectionnée dans la feuille "cal_filtre_catégorie"

Exemple :

-1- Dans la feuille "saisie des mouvements", je copie/colle la ligne 7 sur la ligne 8, puis j'efface le contenu des cellules A, B, C, D, F et H

-2- Ensuite dans la feuille "cal_filtre_catégorie" je copie/colle la cellule A7 sur la cellule A8 (ce qui permet de recopier la formule en adaptant le n° de ligne)

-3- Enfin je sélectionne la cellule A8 de la feuille "saisie des mouvements" pour être prêt à saisir ma dépense ou recette

J'ai enregistré une macro en tenant compte de la position relative mais elle échoue lors de l'étape 2 :

- si lors de l'enregistrement de la macro je copie / colle "en glisser" la cellule A7 sur la cellule A8 dans la feuille "cal_filtre_catégorie", à l'éxecution de la macro j'ai une alerte "Exception: La première ligne de la plage est trop petite"

- si lors de l'enregistrement de la macro je copie (CTRL+C) / colle (CTRL+V) toute la ligne A7 sur toute la ligne A8 dans la feuille "cal_filtre_catégorie", à l'éxecution de la macro la formule n'est pas recopiée dans la feuille "cal_filtre_catégorie"

pour la 2nd macro :

-1- Dans la feuille "saisie des mouvements" je puisse supprimer n'importe quelle ligne de mouvement (entrée existante)

-2- Mais aussi en complément dans la feuille "cal_filtre_catégorie" supprimer la ligne correspondante pour que cette feuille soit à jour automatiquement par rapport au suppression de mouvements

-3- Le tout en restant Dans la feuille "saisie des mouvements", sur la ligne qui suit celle supprimée

Avec pour seule contrainte que la cellule de la colonne A (la date) de la ligne à supprimer soit sélectionnée

Ci joint le fichier de travail et ci dessous le script de la macro d'ajout de ligne de mouvement

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

Cdlt

Vivien

---------------------

/** @OnlyCurrentDoc */

function ajoutlignemouvement() {

var spreadsheet = SpreadsheetApp.getActive();

};

function ajoutlignemouvement1() {

var spreadsheet = SpreadsheetApp.getActive();

};

function Macrosanstitre() {

var spreadsheet = SpreadsheetApp.getActive();

var sheet = spreadsheet.getActiveSheet();

sheet.getRange(spreadsheet.getCurrentCell().getRow(), 1, 1, sheet.getMaxColumns()).activate();

sheet = spreadsheet.getActiveSheet();

sheet.getRange(spreadsheet.getCurrentCell().getRow() - 1, 1, 1, sheet.getMaxColumns()).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);

spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});

spreadsheet.setActiveSheet(spreadsheet.getSheetByName('cal_filtre_catégorie'), true);

var currentCell = spreadsheet.getCurrentCell().offset(-12, -2);

sheet = spreadsheet.getActiveSheet();

sheet.getRange(spreadsheet.getCurrentCell().getRow() - 12, 1, 1, sheet.getMaxColumns()).activate();

spreadsheet.setCurrentCell(currentCell);

sheet = spreadsheet.getActiveSheet();

sheet.getRange(spreadsheet.getCurrentCell().getRow() - 1, 1, 1, sheet.getMaxColumns()).copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);

spreadsheet.setActiveSheet(spreadsheet.getSheetByName('saisie des mouvements'), true);

spreadsheet.getCurrentCell().activate();

};

Bonjour,

il y a pas mal de choses,

avant tout, il est parfois plus intéressant de décrire les fonctions et l'objectif plutôt que de donner une recette à programmer car elle en permet pas de voir certines simplifications

à ce propos je prends déjà le premier alinéa

pour la 1ère macro :

-1- Dans la feuille "saisie des mouvements" je puisse ajouter une ligne de mouvement (une nouvelle entrée) sous la dernière ligne saisie, et ensuite effacer le contenu de la cellule A, B, C, D, F et H (ne garder que les formules qui ont été recopiée dans les cellules E et G).

je pense qu'il serait plus simple d'effacer toutes les formules de la colonne prix HT et mettre en E1 :

={"prix HT";arrayformula(if(H2:H="";"";H2:H/(1+F2:F/100)))}

idem en colonne G

cela peut déjà simplifier pas mal de choses

de quelle formule parles-tu ici ?

-2- Ensuite dans la feuille "cal_filtre_catégorie" je copie/colle la cellule A7 sur la cellule A8 (ce qui permet de recopier la formule en adaptant le n° de ligne)

image

bonjour,

tout d'abord merci pour votre 1er retour.

- en testant la macro que j'ai réalisé le contenu de la cellule A, B, C, D, F et H semble bien s'effacer, donc jusqu'à ce niveau cela semble bien fonctionner. c'est a partir de l'étape 2 que cela bloque

- le contenu de la cellule A7 est une formule

image

cdlt

vivien

Merci, j'avais loupé cette étape.

Pas facile de travailler avec des macros enregistrées, la lisibilité est faible.

Les macros avec GSheets sont intéressantes, mais je pense qu'il est toujours plus judicieux de les appeler que lorsque c'est indispensable ... et ici on peut totalement s'en passer.

Je suppose que tu connais bien excel ?

Le problème que tu tentes de contourner est celui des formules, mais il y a une solution

  • Efface la colonne E et en E1 mets
={"prix HT";arrayformula(if(H2:H="";"";H2:H/(1+F2:F/100)))}
  • Efface la colonne G et en G1 mets
={"montant TVA";arrayformula(if(H2:H="";"";H2:H-(H2:H/(1+F2:F/100))))}
  • Recopie les validations de données jusqu'à la fin de ta feuille (que tu peux limiter, pas la peine d'aller jusque 1000)
  • Recopie la formule colonne A de cal_filtre_catégorie jusqu'à la fin de ta feuille (que tu peux limiter, pas la peine d'aller jusque 1000)

Et puis c'est tout !

Une version copiée de ton fichier sur laquelle j'ai travaillé :

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

J'ai ajouté une couleur par alternance pour améliorer la lisibilité de la feuille.

Ok merci pour ton retour et aide,

Si la solution macro n'est pas possible, je vais faire comme tu dis (pré-renseigner les cellules et appliquer les formules dans les entêtes de colonnes)

Vu que c'est pour une personne pas trop initiée sur les tableurs et que c'est pour une utilisation éventuellement sur smartphone (avec petit écran) je souhaitais une présentation et utilisation proche d'une appli (d'où l'utilisation d'une macro par l'intermédiaire d'un bouton action). Mais si pas d'autres réponses sur le forum avec la solution macro alors ta solution me conviendra et je clôturerai le sujet.

Merci encore et bonne journée

vivien

Les macros sont toujours possibles, mais je ne vois pas l'intérêt. Et puis si c'est sur smartphone (android) les macros ne sont pas toujours activables, donc on risque d'avoir des incompatibilités.

Rechercher des sujets similaires à "duplication ligne precedente utilisant macro"