Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    Homme Profil pro
    VDI
    Inscrit en
    mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : VDI

    Informations forums :
    Inscription : mars 2015
    Messages : 9
    Points : 6
    Points
    6

    Par défaut Exécution boucle trop longue

    Bonjour, j’espère être sur le bon forum.

    je débute depuis peu sur les macros dans les tableaux Google Sheet, j'ai écrit un code pour automatisé l'un de mes tableurs et le code fonctionne parfaitement, MAIS il est très long à s’exécuter. cela se passe au niveau de la boucle For quand je recherche une valeur dans le tableau. si la valeur rechercher se trouve au début du tableau cava mais si elle est à la fin cela mes presque 1min pour la trouver. est il possible d'optimisé cela?? peut être existe il une fonction qui recherche directement une valeur dans un tableau???

    merci de votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    function ChoixPokestop() {
      var spreadsheet = SpreadsheetApp.getActive();
      var app = SpreadsheetApp;
      var classeur = app.getActiveSpreadsheet(); 
      var feuille = classeur.getActiveSheet();
      var lastrow = feuille.getLastRow();
      var ville = feuille.getRange('Feuil1!A2').getValue();
      var pokestop = feuille.getRange('Feuil1!B2').getValue();
      var quete = feuille.getRange('Feuil1!C2').getValue();
      var currentstop = "";
     
    if (pokestop != "")
      {
        if (quete != "")
        {
     
          pokestop = ville + ': ' + pokestop;
          // app.getUi().alert(pokestop);
     
          for(var i=4; i<=lastrow; i++)
          {
            currentstop = feuille.getRange(i, 1).getValue();
            //app.getUi().alert(currentstop);
     
            if (currentstop == pokestop)
            {
              feuille.getRange(i, 2).setValue(quete);
              Exit();
            }
     
          else
            {
              //app.getUi().alert("Vous devez d'abord choisir un Pokestop");
              feuille.getRange('Feuil1!C2').clearContent();
              feuille.getRange('Feuil1!B2').clearContent();
            }
         }
    feuille.getRange('Feuil1!B2').clearContent();
    feuille.getRange('Feuil1!C2').clearContent();
       }
     
     
      }

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 987
    Points : 6 475
    Points
    6 475

    Par défaut

    Bonjour,
    j’imagine que ce sera plus efficace, en effet, en utilisant une fonction de l’API. Essaye Range.createTextFinder()
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    VDI
    Inscrit en
    mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : VDI

    Informations forums :
    Inscription : mars 2015
    Messages : 9
    Points : 6
    Points
    6

    Par défaut

    bonjour Watilin,

    je ne comprend pas grand chose a cette fonction. Pour commencer j'imagine qu'elle vient en remplacement de ma boucle For!!?
    qu'est ce qu'est censé renvoyé firstOccurence? un String? un Range?
    la ligne app.getUi().alert(firstOccurrence); me renvoie "Range"

    et ma variable range est elle bien renseignée?

    je suis un peu perdu la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    function ChoixPokestop() {
      var spreadsheet = SpreadsheetApp.getActive();
      var app = SpreadsheetApp;
      var classeur = app.getActiveSpreadsheet();  
      var feuille = classeur.getActiveSheet();
      var lastrow = feuille.getLastRow();
      var ville = feuille.getRange('Feuil1!A2').getValue();
      var pokestop = feuille.getRange('Feuil1!B2').getValue();
      var quete = feuille.getRange('Feuil1!C2').getValue();
      var currentstop = "";
      var range = feuille.getRange('A4:A'+lastrow);
     
    if (pokestop != "")
      {
        if (quete != "")
        {
     
          pokestop = ville + ': ' + pokestop;
          // app.getUi().alert(pokestop);
     
          var textFinder = range.createTextFinder(pokestop);
          var firstOccurrence = textFinder.findNext();
          app.getUi().alert(firstOccurrence);
     
    //      for(var i=4; i<=lastrow; i++)
    //      {
    //        currentstop = feuille.getRange(i, 1).getValue();
    //        //app.getUi().alert(currentstop);
    //        
    //        if (currentstop == pokestop)
    //        {
    //          feuille.getRange(i, 2).setValue(quete);
    //          Exit();
    //        }
     
    //      else
    //        {
    //          //app.getUi().alert("Vous devez d'abord choisir un Pokestop");
    //          feuille.getRange('Feuil1!C2').clearContent();
    //          feuille.getRange('Feuil1!B2').clearContent();
    //        }
           }
     
    //feuille.getRange('Feuil1!B2').clearContent();
    //feuille.getRange('Feuil1!C2').clearContent();
       }
     
     
      //}
     
     
     
     
    }

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 987
    Points : 6 475
    Points
    6 475

    Par défaut

    Citation Envoyé par ju89100 Voir le message
    je ne comprend pas grand chose a cette fonction. Pour commencer j'imagine qu'elle vient en remplacement de ma boucle For!!?
    Oui.
    qu'est ce qu'est censé renvoyé firstOccurence? un String? un Range?
    Un Range, comme indiqué dans la doc de findNext().

    et ma variable range est elle bien renseignée?
    Ta variable range doit correspondre à l’ensemble des cellules que ta boucle for visitait. Le textFinder va te renvoyer la première ou toutes les cellules contenant le texte recherché, selon que tu utilises findNext() ou findAll(). Avec cette dernière méthode, la valeur renvoyée est un tableau, il faut boucler dessus.

    Tu auras peut-être besoin de Range.getColumn() ou Range.getRow(). N’oublie pas que tu peux utiliser la notation R1C1, qui s’avère plus pratique que A1 dans certains cas.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Ameliorer code : Boucle trop longue
    Par diego45 dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/12/2014, 10h55
  2. Boucle trop longue
    Par Vivien57 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 11/05/2011, 08h49
  3. [Tableaux] Boucle trop longue entraîne arrêt de script
    Par vonwolf dans le forum Fonctions
    Réponses: 9
    Dernier message: 24/12/2007, 11h27
  4. [debutant] boucle trop longue?
    Par dolu02 dans le forum Langage
    Réponses: 3
    Dernier message: 30/04/2007, 16h17
  5. Requete trop longue à exécuter
    Par fguilbert dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/06/2006, 10h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo