Utilisation de la fonction While Le sujet est résolu

Y compris Google Docs, Slides et toute autre question en lien avec une application Google
B
Benjen
Jeune membre
Jeune membre
Messages : 26
Inscrit le : 26 avril 2019
Version d'Excel : Excel 2010

Message par Benjen » 20 juillet 2019, 14:44

Bonjour tout le monde!

Je rencontre une difficulté avec les scripts Google.

Pour faire simple, je souhaite réaliser une boucle qui s'exécute tant que la condition est fausse.

Jusque là, rien de bien compliqué.

Sauf que j'ai besoin que cette boucle se fasse en fonction de la valeur d'une cellule en particulier.

Voici les données :
Je détermine une variable Top.
Ma macro attribue des valeurs aléatoires à deux colonnes de cellules.
Ma condition : les valeurs aléatoires ne doivent pas appairer certaines cellules entre elles.
Donc, par une simple formule de conditions [si(C1 = G1; "Relance" ; "Ok")] , je détermine si l'appariement est ma convenance.
Je détermine une valeur en L9 : le nombre de "Ok".
Ma boucle doit tourner tant que le nombre en L9 ne correspond pas à ma variable Top.

Voici mon code actuel :
var alea = range.getCell(6, 9).getValue();
while (alea <> 'OK')
    for (var i = 1; i <= Top; i++) {
      var c = classeur.getRange('H' + i).setValue(Math.random());
      }
      spreadsheet.getActiveSheet().hideColumns(spreadsheet.getRange('G:H').getColumn(), spreadsheet.getRange('A:B').getNumColumns());
      spreadsheet.getRange('I1').setFormula( '=index($G$1:$G$' + Top + ';RANK($H1;$H$1:$H$' + Top + ');1)')
      spreadsheet.getRange('I1').autoFill(spreadsheet.getRange('I1:I' + Top), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
      spreadsheet.getRange('L1').setFormula( '=if(I1<>C1;"OK";"Relance")')
      spreadsheet.getRange('L1').autoFill(spreadsheet.getRange('L1:L' + Top), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
    spreadsheet.getRange('L9').setFormula( '=if(countif(L1:L' + Top + ';"OK")=' + Top + ';"OK";"Relance")')
    }
Le hic, c'est que la ligne
while (alea <> 'Ok')
renvoie une erreur de syntaxe que je ne trouve pas.

Des idées?

Vous remerciant par avance des vos réponses!!

Benjen
Avatar du membre
Sébastien
Administrateur
Administrateur
Messages : 2'044
Appréciations reçues : 202
Inscrit le : 4 décembre 2004
Version d'Excel : 2016 FR
Version de Sheets : FR
Contact :
Téléchargements : Mes applications

Message par Sébastien » 20 juillet 2019, 16:40

Bonjour,
Benjen a écrit :
20 juillet 2019, 14:44
Le hic, c'est que la ligne
while (alea <> 'Ok')
renvoie une erreur de syntaxe que je ne trouve pas.

Des idées?
Essaie avec :
while (alea != 'Ok')
Cordialement,
Sébastien
B
Benjen
Jeune membre
Jeune membre
Messages : 26
Inscrit le : 26 avril 2019
Version d'Excel : Excel 2010

Message par Benjen » 20 juillet 2019, 21:31

Merci Sébastien!

Rapide et clair, comme toujours!! (10/10)
B
Benjen
Jeune membre
Jeune membre
Messages : 26
Inscrit le : 26 avril 2019
Version d'Excel : Excel 2010

Message par Benjen » 22 juillet 2019, 12:22

Bon je rouvre le sujet, car c'est quand même en lien.

Ma boucle While ne fonctionne pas.
Je vous colle mon code ci-dessous.

Lorsque j'exécute mon script, la boucle While boucle sans exécuter les instructions dans la boucle.

Une idée pour m'éclairer?
 var classeur = SpreadsheetApp.getActiveSpreadsheet();
 var spreadsheet = SpreadsheetApp.getActive();
 var sheet = SpreadsheetApp.getActiveSheet();
 spreadsheet.getRange('L9').setFormula( '=if(countif(L1:L8;"OK")=' + Top + ';"OK";"Relance")');
 
  //Détermination de la position des premiers de poules
  for (var i = 1; i <= 8; i++) {
    var c = classeur.getRange('B' + i).setValue(Math.random());
  }
  spreadsheet.getRange('C1').setFormula( '=index($A$1:$A$8;RANK($B1;$B$1:$B$8);1)')
  spreadsheet.getRange('C1').autoFill(spreadsheet.getRange('C1:C8'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  var range = sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns());
  var alea = range.getCell(9, 12).getValue();
  while (alea != 'OK'){ 
  //Détermination de la position des secondes de poules
    for (var i = 1; i <= 8; i++) {
      var c = classeur.getRange('H' + i).setValue(Math.random());
    spreadsheet.getActiveSheet().hideColumns(spreadsheet.getRange('G:H').getColumn(), 
    spreadsheet.getRange('A:B').getNumColumns());
    spreadsheet.getRange('I' + i).setFormula( '=index($G$1:$G$8;RANK($H' + i + ';$H$1:$H$8);1)')
    spreadsheet.getRange('L' + i).setFormula( '=if(I' + i + '<>C' + i + ';"OK";"Relance")')
    }
  }
}
B
Benjen
Jeune membre
Jeune membre
Messages : 26
Inscrit le : 26 avril 2019
Version d'Excel : Excel 2010

Message par Benjen » 30 juillet 2019, 09:20

Bonjour tout le monde!

J'ai trouvé une solution à mon problème.
Plutôt que d'imbriquer mes boucles, je les ai scindées.

Ce qui donne ceci :
 //Détermination de la position des secondes de poules
    for (var i = 1; i <= Top; i++) {
    var c = classeur.getRange('I' + i).setValue(Math.random());
  }
    spreadsheet.getRange('J1').setFormula( '=index($H$1:$H$' + Top + ';RANK($I1;$I$1:$I$' + Top + ');1)');
    spreadsheet.getRange('J1').autoFill(spreadsheet.getRange('J1:J' + Top), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
    spreadsheet.getRange('M1').setFormula( '=if(D1<>J1;"OK";"Relance")');
    spreadsheet.getRange('M1').autoFill(spreadsheet.getRange('M1:M' + Top), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  
  //On vérifie que les seconds de poule n'affrontent pas les premiers de poules, si oui, on retire au sort
  while (spreadsheet.getRange('A1').getValue() != spreadsheet.getRange('N1').getValue()){
    for (var i = 1; i <= Top; i++) {
      var c = classeur.getRange('I' + i).setValue(Math.random());
    }
  }
Si ça peut servir à certaines personnes!
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message