Macro remplissage automatique et déplacement ligne

Bonsoir,

J'ai quelques fois sollicité l'aide du forum pour Excel, et depuis peu, je suis passer pour des besoins professionnels sur Sheet.

Je me permets cette fois de vous solliciter pour une aide liée à la gestion d'équipements.

J'ai un document avec plusieurs feuilles, toutes constituées de la même manière (plus ou moins). Une partie identification du matériel dans les colonnes B à H, puis des éléments liés à l'état du matériel et à son contrôle.

Ce qui me ferait gagner beaucoup de temps est la chose suivante (je vais prendre l'exemple de la feuille "Harnais" mais cela sera le même mécanisme sur les autres feuilles) :

- Remplir automatiquement, par appui sur un bouton, pour chaque ligne correspondant à un équipement et pour lesquelles il n'y aurait pas de cellule "Inapte" déjà remplie, les colonnes J à N par "Apte",

- Remplir automatiquement la colonne S par ce qu'il y a écrit dans la cellule K2

- Remplir automatiquement la colonne U par ce qu'il y a dans la cellule M2

J'aimerais également, que pour chaque ligne "Inapte", celle-ci, lors du clique sur le fameux bouton, se déplace dans la feuille "rebus". La difficulté, est que chaque feuille à un entête un peu différent et un nombre de colonne différent :/ Je ne sais pas s'il existe une solution ...

Enfin, sur un version Excel, j'avais créé un userform pour ajouter un nouvel équipement, pas certain qu'on retrouve cette fonctionnalité dans Sheets ?

Un modèle de fichier ci-joint : https://docs.google.com/spreadsheets/d/1qk1MyDABwYXTRJQIS7hjk5-YzjNDeu5_dlBgODoqnZ0/edit?usp=sharing

Je vous remercie de votre aide !

Jujuski

Bonjour juju

Tu as plein de posts encore ouverts, du reste un de ceux auquel j'avais répondu. Merci de commencer par solder tes anciens posts. Tu donnes l'impression que les réponses ne servent pas.

Bonsoir,

Toutes mes excuses, à chaque fois j'ai été très bien aidé et mes sujets résolus, j'ai juste zappé de cocher le bon post.
Normalement tout est corrigé, n'hésite pas à me dire si ce n'est pas le cas.

Juju

pour ceci

- Remplir automatiquement la colonne S par ce qu'il y a écrit dans la cellule K2

- Remplir automatiquement la colonne U par ce qu'il y a dans la cellule M2

en S6

={"Date du contrôle";arrayformula(if(B7:B="";;K2))}

en U6

={"Contrôleur";arrayformula(if(B7:B="";;M2))}

J'aimerais également, que pour chaque ligne "Inapte", celle-ci, lors du clique sur le fameux bouton, se déplace dans la feuille "rebus". La difficulté, est que chaque feuille à un entête un peu différent et un nombre de colonne différent :/ Je ne sais pas s'il existe une solution ...

mais tu dis plus haut que toutes les feuilles sont identiques !!

je regarde une solution dans la journée sans tenir compte des différences

je n'aime pas les boutons, ce sera pour moi un menu

Enfin, sur un version Excel, j'avais créé un userform pour ajouter un nouvel équipement, pas certain qu'on retrouve cette fonctionnalité dans Sheets ?

je ne vois pas quel problème cela pose avec GSheets ! c'est possible

- Remplir automatiquement, par appui sur un bouton, pour chaque ligne correspondant à un équipement et pour lesquelles il n'y aurait pas de cellule "Inapte" déjà remplie, les colonnes J à N par "Apte",

dans la même action que le "rebut" ou à part ?

au passage ... REBUTS et non REBUS

pourquoi J à N et pas les autres qui comportent aussi la notion d'aptitude ?

- Remplir automatiquement, par appui sur un bouton, pour chaque ligne correspondant à un équipement et pour lesquelles il n'y aurait pas de cellule "Inapte" déjà remplie, les colonnes J à N par "Apte",

et du coup comment déterminer pour chaque feuille ? je veux bien travailler si au moins tes feuilles respectent un état standard comme tu le disais au début, ce n'est pas le cas

pour tenir compte de la variabilité des colonnes, place en ligne 1 une étoile là où tu souhaites mettre 'Apte'

image

le bouton je ne m'en sers pas, je me sers du menu

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 Renseigner par défaut les valeurs à Apte', 'apte')
    .addItem('👉 Déplacer les équipements inaptes', 'rebut')
    .addToUi();
}
function apte(){
  var f = SpreadsheetApp.getActiveSheet()
  var flag = f.getRange(1,1,1,f.getLastColumn()).getValues()
  var data = f.getRange(7,1,f.getLastRow()-6,f.getLastColumn()).getValues()
  for (var i=0;i<data.length;i++){
    for (var j=0;j<data[0].length;j++){
      if (data[i][j]=="" && flag[0][j]=="*") {f.getRange(i+7,j+1).setValue('Apte')}
    }
  }
}
function rebut(){
  var f = SpreadsheetApp.getActiveSheet()
  var rng = f.getRange(7,1,f.getLastRow()-6,f.getLastColumn())
  var data = rng.getValues()
  var flag = []
  for (var i=0;i<data.length;i++){
    for (var j=0;j<data[0].length;j++){
      if (data[i][j]=="Inapte") {flag.push(i+7)}
    }
  }
  var fRebuts = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rebuts')
  flag.filter(onlyUnique).reverse().forEach(x => {
    fRebuts.insertRowBefore(7)
    var plage = f.getRange(x,1,1,f.getLastColumn())
    plage.copyTo(fRebuts.getRange("A7"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    f.deleteRow(x)
  });
}
function onlyUnique(value, index, self) {
  return self.indexOf(value) === index;
}

Bonjour,

Merci pour ce retour.

Pour le nom et la date du contrôle, c'est simple mais efficace :)

Vous avez raison, bien que les feuilles soient toutes constituées de la même manière, elles comportent néanmoins quelques différences (nombre de colonne qui peut différer par exemple).

Pour le rebut, et le déplacement de la ligne, si tout est effectué dans la même action ce n'est pas gênant pour moi.

Je ne trouve pas le fichier que vous utilisez "copie de copie". Est-il en local ou sur un drive ?

Merci par avance :)

il est en local et déjà à la poubelle

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

il te suffit

  • de recopier le script
  • de mettre en ligne 1 les étoiles permettant de repérer les colonnes à remplir
  • tu fermes et tu rouvres le fichier pour avoir le menu -ou- tu lances onOpen à partir de l'éditeur de script, il te donnera une erreur (c'est pas grave) mais cela devrait te permettre de donner les autorisations à google

Excellent, ça fonctionne très bien.

Juste une question : complémentaire. Dans la colonne bilan, j'ai une formule qui fait la synthèse des "aptes" et "inaptes". Je peux utiliser le même style de formule :

={"Date du contrôle";arrayformula(SI(B7:B="";;$K$2))}

Mais en ={"BILAN";arrayformula(SI(B7:B="";;SI(H7<ANNEE(AUJOURDHUI());"Inapte";SI(NB.SI(I7:P7;"Inapte")>0;"Inapte";"Apte"))}

Cela m'indique une erreur de formule que je n'arrive pas à identifier.

Encore merci :)

non, arrayformula n'est pas compatible avec une autre formule en tableau comme nb.si

il faut imaginer autre chose, avec notamment la fonction MMULT

on n'est plus sur le même sujet, ouvre-s-en un autre car cela peut interpeler d'autres contributeurs et intéresser d'autres personnes

Merci !

Avant de clôturer définitivement, une remarque sur le déplacement de la ligne dans Rebuts.

Compte tenu du nombre de colonne différents de chaque feuille, la feuille rebuts ne ressemble plus à grand chose. Entre la feuille harnais qui comporte 8 critères et la feuille "poulie" qui en comporte 10, les titres de la feuille Rebuts ne correspondent plus.

Aussi, et par exemple, est-ce possible, pour la feuille casque, de déplacer :

- Colonne B à H en colonne B à H : ok (toutes les feuilles vont comporter ces mêmes éléments donc pas de sujet)
- Colonne I à L en colonne N à Q de la feuille rebus
- Colonne M en colonne AI de la feuille rebus, ...

Belle journée,

jujuski

je m'attendais à ce genre de remarque ... mais non, moi je ne bricole pas sauf à trouver comment paramétrer sans avoir à modifier le script

de toute façon, si le format de change pas, tu peux retrouver de quelle colonne il s'agit

et autre solution, serait de laisser les données dans la feuille principale et de masquer les lignes obsolètes

Peut-être peut-on laisser les rebuts dans la feuille de base mais grâce à un tri, les mettre en bas de la liste ?

on peut donc faire un tri ... sur quelle colonne ?

Ca dépend de la feuille ... j'imagine que ce n'est pas la réponse attendue.

Pour la feuille Harnais : colonne Q

Pour la feuille Poulies : colonne S

Par exemple.

Dans ce cas, mets un T sur la première ligne de la colonne à trier ...

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 Renseigner par défaut les valeurs à Apte', 'apte')
    .addItem('👉 Déplacer les équipements inaptes', 'tri')
    .addToUi();
}
function apte(){
  var f = SpreadsheetApp.getActiveSheet()
  var flag = f.getRange(1,1,1,f.getLastColumn()).getValues()
  var data = f.getRange(7,1,f.getLastRow()-6,f.getLastColumn()).getValues()
  for (var i=0;i<data.length;i++){
    for (var j=0;j<data[0].length;j++){
      if (data[i][j]=="" && flag[0][j]=="*") {f.getRange(i+7,j+1).setValue('Apte')}
    }
  }
}
function tri(){
  var f = SpreadsheetApp.getActiveSheet()
  var indic = f.getRange(1,1,1,f.getLastColumn()).getValues()
  var col = indic.flat().indexOf('T') + 1
  if (col!=0){
    var range = f.getRange(7,1,f.getLastRow()-6,f.getLastColumn())
    range.sort({column: col, ascending: true})
  }
}

Magnifiquement efficace !! Merci.

Excellent week-end,

Jujuski

Une dernière question :

j'ai copier-modifier ce code pour indiquer la date dans la colonne où il y a un C à partir de la cellule M2.

function controle(){
  var f = SpreadsheetApp.getActiveSheet()
  var flag = f.getRange(1,1,1,f.getLastColumn()).getValues()
  var data = f.getRange(7,1,f.getLastRow()-6,f.getLastColumn()).getValues()
  for (var i=0;i<data.length;i++){
    for (var j=0;j<data[0].length;j++){
      if (data[i][j]=="" && flag[0][j]=="C") {f.getRange(i+7,j+1).setValue("M2")}
      if (data[i][j]=="" && flag[0][j]=="D") {f.getRange(i+7,j+1).setValue("K2")}
    }
  }
}

Mais cela m'écrit M2. Je ne trouve nulle part la solution pour copier non pas le mot M2 mais la valeur de la cellule M2.

Merci :)

Après tout sera terminé !

Jujuski

Rechercher des sujets similaires à "macro remplissage automatique deplacement ligne"