Convertir des VBA google sheets

Bonjour à toutes et tous,

J'ai créé pour mon entreprise un document Excel avec plusieurs VBA que je souhaites pouvoir transposer sur Google sheets (drive), afin que plusieurs salariés puissent travailler sur ce document.

Novice avec sheets, je souhaiterai que l'ensemble des VBA créé sur mon Excel puissent être actif sous sheets.

Je vous joins le document réalisé sur Excel ainsi que le lien de ce même document sur sheets.

https://docs.google.com/spreadsheets/d/1P-a2fopCTJFcc04rxa4-hYi8UnnMjZwYXOTukKmcjUY/edit?usp=sharing

Merci à vous pour vos retours,

Belle journée,

Caro

18test2.xlsm (107.56 Ko)

Bonjour,

je vais regarder, mais avant cela il faut savoir 2 choses

  • en VBA tu as un langage "propriétaire" spécifique microsoft, en GSheets, tu as un langage différent, plus universel, issu d'une version de javascript
  • dans pas mal de cas, le script de GSheets peut être avantageusement remplacé par des formules (query, unique, filter, match etc.) très efficiente

je vais donc regarder tes macros à la lueur de ces remarques, et notamment la seconde

Tout ce qui est recopie des données (modules M1, M2, M3, RECAPFRUITSLEGUMES) peut se faire par simple formule et sera propagée immédiatement à moins que tu ne veuilles que "sur ordre" ?

Peux-tu expliquer un peu le fonctionnement ? de façon "littérale", pas les macros car je les comprends, mais plutôt quand et pourquoi telle ou telle action ?

Cela dit, dans ton cas, je pourrais en effet reproduire les macros quasiment à l'identique, mais cela n'optimisera pas le fichier. J'y réfléchis dans la journée.

Merci de ton retour rapide !

Pour répondre à ta question, nous souhaitons effectivement pouvoir réaliser les actions suivantes (sachant que pour les feuilles M1, M2, M3 il y aura le même fonctionnement) :

Ex pour M1 :

Nous souhaitons pouvoir saisir chaque jour un inventaire de nos fruits et légumes et avoir la possibilité d'effacer un un clic les saisies précédentes en différenciant les jours. C-a-d que, le jeudi, nous souhaitons pouvoir mettre nos retours et besoins sans modifier le reste du tableau tout en ayant la possibilité de supprimer la saisie du jeudi précédent en 1 clic. (et ce pour tous les jours du tableau et pour M1, M2 et M3)

Egalement, nous avons une liste de fruits et légumes très variables, nous souhaitons donc pouvoir mettre à jour cette liste régulièrement et que cette même liste puisse se mettre automatiquement à jour dans le reste du document : fiche recap, M1, M2, M3

Fiche récap :

Nous souhaitons que chaque saisie des besoins des tableaux M1, M2 et M3 se saisissent automatique dans le tableau récap. et que lorsque sur une cellule, le montant est égale à 0, la case sans titre puisse se mettre en gris.

Ex pour M1 : Mardi Besoin

Nous avons la liste des produits avec l'affichage automatique de la saisie de la fiche M1 de mardi Besoin.
Lorsque par exemple sur la ligne Ail nous avons 0, nous souhaitons que le petite colonne à côté de M1 apparaissent en gris.

J'espère que toutes mes explications sont assez clair pour toi.

N'hésites pas à revenir vers moi si besoin.

J'ai pas mal avancé, je terminerai ce soir

const doc = SpreadsheetApp.getActiveSpreadsheet();
const fBD = doc.getSheetByName('Listes');

function recopier(f){
  var legumes = fBD.getRange("A1:A66")
  var fruits = fBD.getRange("A68:A115")
  legumes.copyTo(f.getRange("B6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  legumes.copyTo(f.getRange("E6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  legumes.copyTo(f.getRange("H6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  legumes.copyTo(f.getRange("K6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  fruits.copyTo(f.getRange("B73"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  fruits.copyTo(f.getRange("E73"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  fruits.copyTo(f.getRange("H73"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  fruits.copyTo(f.getRange("K73"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
function m1(){
  var f = doc.getSheetByName('M1');
  recopier(f)
}
function m2(){
  var f = doc.getSheetByName('M2');
  recopier(f)
}
function m3(){
  var f = doc.getSheetByName('M3');
  recopier(f)
}
function recap(){
  var f = doc.getSheetByName('RECAP');
  recopier(f)
}

function initialiser(f,col){
  f.getRange(col+"6:"+col+"71").clearContent()
  f.getRange(col+"73:"+col+"120").clearContent()
}
function suppMardiBesoin(){
  var f = doc.getActiveSheet();
  var col = 'C'
  initialiser(f,col)
}
function suppMercrediBesoin(){
  var f = doc.getActiveSheet();
  var col = 'F'
  initialiser(f,col)
}
function suppJeudiBesoin(){
  var f = doc.getActiveSheet();
  var col = 'I'
  initialiser(f,col)
}
function suppVendrediBesoin(){
  var f = doc.getActiveSheet();
  var col = 'L'
  initialiser(f,col)
}
function suppSamediBesoin(){
  var f = doc.getActiveSheet();
  var col = 'O'
  initialiser(f,col)
}
function suppMardiRetour(){
  var f = doc.getActiveSheet();
  var col = 'D'
  initialiser(f,col)
}
function suppMercrediRetour(){
  var f = doc.getActiveSheet();
  var col = 'G'
  initialiser(f,col)
}
function suppJeudiRetour(){
  var f = doc.getActiveSheet();
  var col = 'J'
  initialiser(f,col)
}
function suppVendrediRetour(){
  var f = doc.getActiveSheet();
  var col = 'M'
  initialiser(f,col)
}
function suppSamediRetour(){
  var f = doc.getActiveSheet();
  var col = 'A'
  initialiser(f,col)
}

on aurait pu faire plus condensé, mais j'ai voulu respecter ta logique pour que tu puisses un jour faire évoluer toi-même

Regarde si c'est ok pour toi !

Désolée de mon retour plus que tardif, j'étais en congés !!

C'est top !! ca fonctionne super !

MERCI MERCI de ton aide !!!!!

J'aurais une toute derniere question, sur la feuille "Recap" est-il possible, de faire en sorte que lorsque la case M1 est égale à 0 la case d'à côté soit grise et non blanche ?

Merci de ton retour,

Bonne soirée

Tu peux le faire à l'aide d'une mise en forme conditionnelle. Et sauf erreur de ma part c'est déjà le cas.

Très bien merci !

Je vois que lorsque j'ouvre le document via mon téléphone, les scriptes installés ne fonctionne pas pour effacer les données.

Lorsque je clic sur la case "effacé besoin mardi" ça sélectionne la case et n'efface pas les données. Est-ce normal ?

Merci de ton retour

je ne connais pas les compatibilités avec android, mais c'est possible en effet !

je vais regarder de mon côté, mais sans certitude

Merci !

Bonjour,

Je me permets de revenir vers toi, je rencontre un problème lorsque je clic sur mise à jour de la liste recap (feuille1), la mise à jour ne se fait pas au bon endroit... j'ai essayé de regarder ce que tu as fait au niveau des scripts mais je n'arrive pas à savoir d'où vient le prb ?

Merci à toi !

J'ai corrigé en mettant les 4 feuilles dans la même structure de lignes, toutes commencent maintenant en ligne 75 pour la seconde partie

Merci, c'est parfait !!!

merci de vôtre aide

Bonjour,

C'est encore moi, je continue d'avancer sur mes recherches google sheets sur Android.

Un utilisateur du forum m'a donné ce conseil concernant l'utilisation de tout ce que tu m'as proposé sur mobile pour pouvoir valider les scripts...

Voici son retour :

Bonjour,

Vous ne pouvez pas exécuter les fonctions Google App Script (fonctions de gaz) via l'application mobile Google Sheets.

Une solution c'est de créer une application Web et d'utiliser l' API d'exécution de Google

Une autre solution pour déclencher un script sur un mobile

utiliser une case à cocher et la function onEdit(e)

code à tester mettre une case à cocher en D2 :

function test() {

var spreadsheet = SpreadsheetApp.getActive();

spreadsheet.getRange('C1').activate();

spreadsheet.getRange('C1').setValue('test bold'); spreadsheet.getActiveRangeList().

setFontWeight('Bold');

spreadsheet.getRange('C2').activate();

spreadsheet.getRange('C2').setValue('test italic');

spreadsheet.getActiveRangeList().setFontStyle('Italic');

spreadsheet.getRange('C3').setValue('mode normale');

};

function onEdit(e){

if(SpreadsheetApp.getActiveRange().getA1Notation()=="D2"&&SpreadsheetApp.getActiveRange().getValue()){

SpreadsheetApp.getActiveRange().setValue(false)

test()

}

}

La proposition de l'utilisateur de créer une application Web me semble un peu lourd pour l'utilisation de mon document.

Il semble donc plus opportun de créer une case à cocher. Mais si je comprends bien, il faut créer une case à cocher pour chaque script ?

Donc, peut-être remplacer les différents "carré" présent par une case à cocher ?

Dis-moi si je me trompe.

Dans le cas contraire, peux tu m'aider à nouveau ? Je dois copier le code donné plus haut entre chaque script ?

Merci de ton retour

Oui, en effet c'est là toute l'expérience précieuse de Gilbert, je l'ai répercutée auprès d'un autre forumer, mais j'avais omis ton cas

je regarde donc pour transformer ton fichier d'ici ce soir

Peux-tu avancer le travail comme je viens de le commencer en haut à gauche de M1 ?

Oui bien sur, je fais ca sur l'ensemble du document !!!

Merci

C'est fait !

Fais un test ...

const doc = SpreadsheetApp.getActiveSpreadsheet();
const fBD = doc.getSheetByName('Listes');

function onEdit(e){
  var feuille = e.source.getActiveSheet();
  var cellule = e.source.getActiveRange();
  if (feuille.getName()=='Listes' && cellule.getColumn()==4){
    if (cellule.getValue()==true){
      if (cellule.getRow()==50){recopier(doc.getSheetByName('M1'))}
      if (cellule.getRow()==55){recopier(doc.getSheetByName('M2'))}
      if (cellule.getRow()==60){recopier(doc.getSheetByName('M3'))}
      if (cellule.getRow()==65){recap()}
      cellule.setValue(false)
    }
  }
  if (feuille.getName().substring(0,1)=='M' && cellule.getRow()==3){
    if (cellule.getValue()==true){
      initialiser(doc.getActiveSheet(),columnToLetter(cellule.getColumn()))
      cellule.setValue(false)
    }
  }
}
function recap(){
  var f = doc.getSheetByName('RECAP');
  var legumes = fBD.getRange("A1:A66")
  var fruits = fBD.getRange("A68:A115")
  legumes.copyTo(f.getRange("A6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  fruits.copyTo(f.getRange("A75"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
function recopier(f){
  var legumes = fBD.getRange("A1:A66")
  var fruits = fBD.getRange("A68:A115")
  legumes.copyTo(f.getRange("B6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  legumes.copyTo(f.getRange("E6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  legumes.copyTo(f.getRange("H6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  legumes.copyTo(f.getRange("K6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  fruits.copyTo(f.getRange("B75"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  fruits.copyTo(f.getRange("E75"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  fruits.copyTo(f.getRange("H75"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  fruits.copyTo(f.getRange("K75"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
function initialiser(f,col){
  f.getRange(col+"6:"+col+"71").clearContent()
  f.getRange(col+"75:"+col+"122").clearContent()
}
function columnToLetter(column) {
  var temp, letter = '';
  while (column > 0) {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}
Rechercher des sujets similaires à "convertir vba google sheets"