IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

MATLAB Discussion :

[xlsread] Boucles for trop lentes


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut [xlsread] Boucles for trop lentes
    Bonjour à tous,

    Je me permets d'ouvrir ce topic pour un problème assez classique et que j'ai d'ailleurs pu voir souvent sur le forum. J'ai écrit le code suivant qui contient plusieurs boucles for :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    function calcul_pente_auto(repertoire)
     
    T0=strcat(repertoire, '_result');
     
    %on lit fichier excell avec les résultats à 1Hz pour un repertoire donné.
    %REMARQUES : Matlab ne récupère que les nombres de la feuille 'result' et pas les
    %chaînes de caractères.
     
    Y=xlsread(T0,'result');
    nl=size(Y,1);
     
    for i=1:nl %nl=evenement ie pour chaque evenement
     
     
    %on lit le début, fin et type du reflux considéré i.e. on récupère donc les
    %événements de reflux et leur type (liquide, mélange, gazeux).
     
        debut=Y(i,1);
        fin=Y(i,2);
        type=Y(i,5);
     
    %On examine ensuite chacune des 6 pistes d'impédance pour l'événement
    %en cours i.e. on parcourt les colonnes 6 à 11. On regarde les impédances
    %différentes du nombre 1E36 i.e. les impédances touchées par les reflux.
     
        for j=6:11 %pour chaque piste de cet evenement
     
            if (Y(i,j)~=1E36)
     
                piste=j-5;
     
                %On regarde la feuille ij où i=piste et j=type dans le xls
     
                feuille=strcat(num2str(piste),num2str(type));
     
                %Dans deb_fin on prends les données de début et fin pour
                %evenements_Impi_j pour i=piste, j=type
     
                deb_fin=xlsread(T0,feuille,'A:B');
     
                for k=1:size(deb_fin,1)
     
                %On stocke dans X le résultat de l'intersection [deb,fin],
                %événement provenant du tableau_final de reflux pour le fichier
                %à 1Hz avec deb_fin(k,:) qui désigne les événements [deb,fin]
                %evenements_Impi_j pour i=piste, j=type.
     
                    X=intersect([debut,fin],deb_fin(k,:));
     
                        if ~isempty(X)
                        ligne=k;
                        end
                end
     
                    %pour chaque ligne on cherche le début et la fin sur le fichier à
                    %50 Hz
                    %on cherche l'evenement qui correspond à 1Hz, ensuite l'événement à
                    %50 Hz (X)
     
                    debut=1 + 50*(deb_fin(ligne,1)-1);
                    fin=1 + 50*(deb_fin(ligne,2)-1);
                    rep_50=strcat(repertoire(1:end-2),'-50');
     
                    %on lit le fichier à 50 Hz (les int) entre debut et fin pour chaque piste
                    %avec lecture_int
     
                    X=lecture_int(rep_50,piste,debut,fin);
     
            end %if (R(i,j)~=1E36)
     
     
     
        end
    end
     
    end
    La fonction prend en paramètre un répertoire et j'utilise le fichier Excell portant le nom repertoire_result contenant plusieurs feuilles et sur chaque feuille il y a maximum 1000 lignes de nombres à peu près. j'effectue ensuite un certain nombres d'opérations lais le programme est bien trop long (environ 10 minutes). Je précise que j'appelle une courte fonction lecture_int dans le programme qui ne contient pas de boucles. Bref je voudrais savoir s'il est possible de raccourcir ce code et d'éviter les boucles for qui sont problématiques.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je te conseille d'utiliser la fonction xlsread1 du File Exchange qui permettra de n'ouvrir qu'une seule fois le fichier Excel et non l'ouvrir/fermer à chaque itération.

    Remarques :
    • T0=strcat(repertoire, '_result'); plutôt que strcat, préfère utiliser fullfile.
    • feuille=strcat(num2str(piste),num2str(type)); : un seul num2str est nécessaire (ex. num2str([1 2], '%d%d') % 12).

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci Winjerome, je veux tester cette fonction mais la fonction plante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Undefined function or variable 'Excel'.
     
    Error in ==> xlsread1 at 108
    Excel = evalin('base','Excel'); % added command (Brandao 12/09/2008)
     
    Error in ==> calcul_pente_auto at 9
    Y=xlsread1(T0,'result');
    Le fichier Excel est constitué de plusieurs feuilles et je veux donc lire la feuille result :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Y=xlsread1(T0,'result');

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Tu utilises mal la fonction.
    L'auteur donne des informations sur la page de la contribution.

    Tu dois transformer la fonction calcul_pente_auto comme ceci :

    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
    function calcul_pente_auto(repertoire)
     
    T0 = fullfile(repertoire, '_result');
     
    Excel = actxserver ('Excel.Application');
     
    if ~exist(T0,'file')
        ExcelWorkbook = Excel.Workbooks.Add;
        ExcelWorkbook.SaveAs(T0,1);
        ExcelWorkbook.Close(false);
    end
    Excel.Workbooks.Open(T0); 
     
    Y = xlsread1(T0,'result');
    nl = size(Y,1);
     
    for i = 1:nl
     
        ...
     
    end
     
    Excel.ActiveWorkbook.Save;
    Excel.Quit
    Excel.delete
    clear Excel
    Et si tu veux en savoir plus sur cette syntaxe : Contrôle d'Excel par MATLAB via Automation

    PS : arrête de mettre deux L à la fin de Excel... ça finit par piquer les yeux
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci Dut, je vais bien regarder tout ceci avant d'écrire une éventuelle réponse mais juste ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T0 = fullfile(repertoire, '_result');
    On m'a souvent fait remarqué qu'il était préférable d'utiliser fullfile plutôt que strcat, le problème est que avec fullfile, lorsque j'exécute la fonction comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calcul_pente_auto('5362-1-1');
    Ce qui est dans T0 c'est : 5362-1-1\_result au lieu de 5362-1-1_result qui est le fichier .xls que je veux lire.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    T0 doit contenir une chaine de caractère correspondant au nom complet du fichier (chemin + nom du fichier).

    Et j'ai supposé que la variable repertoire contenait bien le chemin d'un dossier.

    La fonction devrait peut s'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function calcul_pente_auto(chemin, prefixe)
     
    T0 = fullfile(chemin, [prefix '_result']);
     
    ...
    Non ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Bon, donc j'ai déjà des problème, j'ai donc simplement écrit la fonction comme suit et je la lance avec le debugger :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    function calcul_pente_auto(repertoire)
     
    T0=strcat(repertoire, '_result');
    Excel = actxserver ('Excel.Application');
     
    % T0 = fullfile(repertoire, '_result');
     
    %on lit fichier Excel avec les résultats à 1Hz pour un repertoire donné.
    %REMARQUES : Matlab ne récupère que les nombres de la feuille 'result' et pas les
    %chaînes de caractères.
     
    if ~exist(T0,'file')
        ExcelWorkbook = Excel.Workbooks.Add;
        ExcelWorkbook.SaveAs(T0,1);
        ExcelWorkbook.Close(false);
    end
    Excel.Workbooks.Open(T0); 
     
    Y = xlsread1(T0,'result');
    nl = size(Y,1);
     
     
    for i=1:nl %nl=evenement ie pour chaque evenement
       nl 
     
    %on lit le début, fin et type du reflux considéré i.e. on récupère donc les
    %événements de reflux et leur type (liquide, mélange, gazeux).
     
        debut=Y(i,1);
        fin=Y(i,2);
        type=Y(i,5);
     
    %On examine ensuite chacune des 6 pistes d'impédance pour l'événement
    %en cours i.e. on parcourt les colonnes 6 à 11. On regarde les impédances
    %différentes du nombre 1E36 i.e. les impédances touchées par les reflux.
     
        for j=6:11 %pour chaque piste de cet evenement
     
            if (Y(i,j)~=1E36)
     
                piste=j-5;
     
                %On regarde la feuille ij où i=piste et j=type dans le xls
     
                feuille=strcat(num2str(piste),num2str(type));
     
                %Dans deb_fin on prends les données de début et fin pour
                %evenements_Impi_j pour i=piste, j=type
     
                deb_fin=xlsread1(T0,feuille,'A:B');
     
                for k=1:size(deb_fin,1)
     
                %On stocke dans X le résultat de l'intersection [deb,fin],
                %événement provenant du tableau_final de reflux pour le fichier
                %à 1Hz avec deb_fin(k,:) qui désigne les événements [deb,fin]
                %evenements_Impi_j pour i=piste, j=type.
     
                    X=intersect([debut,fin],deb_fin(k,:));
     
                        if ~isempty(X)
                        ligne=k;
                        end
                end
     
                    %pour chaque ligne on cherche le début et la fin sur le fichier à
                    %50 Hz
                    %on cherche l'evenement qui correspond à 1Hz, ensuite l'événement à
                    %50 Hz (X)
     
                    debut=1 + 50*(deb_fin(ligne,1)-1);
                    fin=1 + 50*(deb_fin(ligne,2)-1);
                    rep_50=strcat(repertoire(1:end-2),'-50');
     
                    %on lit le fichier à 50 Hz (les int) entre debut et fin pour chaque piste
                    %avec lecture_int
     
                    X=lecture_int(rep_50,piste,debut,fin);
     
            end %if (R(i,j)~=1E36)
     
     
     
        end
    end
     
    Excel.ActiveWorkbook.Save;
    Excel.Quit
    Excel.delete
    clear Excel
     
    end
    Au début Excel semble bien trouvé, puis lorsqu'on entre dans le if, il m'est demandé si je veux remplacer le fichier '5362-1-1_result.xls', si je répond non le programme s'arrête, si je répond oui, la ligne ExcelWorkbook.SaveAs(T0,1); est exécutée puis je continue et j'ai à nouveau l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Undefined function or variable 'Excel'.
     
    Error in ==> xlsread1 at 108
    Excel = evalin('base','Excel'); % added command (Brandao 12/09/2008)
     
    Error in ==> calcul_pente_auto at 19
    Y = xlsread1(T0,'result');
    Bref, je mets le fichier Excel en PJ. En fait, celui-ci existe déjà et je ne comprends pas bien la vérification du if.

    EDIT:

    En fait ce n'est pas grave pour strcat, je ne pense pas que cette ligne va ralentir le code. Que ce soit meilleur avec fullfile ou pas finalement, je crois que la lenteur n'est que le fruit des for.
    Fichiers attachés Fichiers attachés

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci Dut, j'ai donc parcouru la page proposée. Que je mette le test ou non, l'éxécution plante au niveau de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Y = xlsread1(T0,'result');
    Le problème est donc bien que le contenu de "Excel" n'existe pas ou plus. Pourtant d'après ton lien, Excel contient au début un fichier COM et dans le gestionnaire des tâches je constate bien qu'Excel est lancé (apparemment). Mais le code suivant ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function calcul_pente_auto(repertoire)
     
    T0=strcat(repertoire, '_result');
    Excel = actxserver ('Excel.Application');
    if ~exist(T0,'file')
        ExcelWorkbook = Excel.Workbooks.Add;
    %     ExcelWorkbook.SaveAs(T0,1);
    %     ExcelWorkbook.Close(false);
    end
    Excel.Workbooks.Open(T0); 
    Y = xlsread1(T0,'result');
    Le test n'est pas nécéssaire je pense puisque T0 existe bien à l'avance : repertoire_result.xls existe et le debugger montre qu'il est trouvé. Avec ou sans le test j'ai le même message d'erreur sur Excel qui n'est pas reconnue et je ne comprends pas pourquoi. Peut-être que, tout simplement, Excel ne se lance pas. Cependant si j'écris juste après la ligne sur actserver :

    L’exécution de cette ligne lance bien Excel (vide). J’ai l'impression qu'il cherche des fichiers xlsx mais mes fichiers sont des xls simples.

  10. #10
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function calcul_pente_auto(repertoire)
     
    ...
    Excel = actxserver ('Excel.Application');
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Undefined function or variable 'Excel'.
    
    Error in ==> xlsread1 at 108
    Excel = evalin('base','Excel'); % added command (Brandao 12/09/2008)
    
    Error in ==> calcul_pente_auto at 19
    Y = xlsread1(T0,'result');
    en fait tu créé ton objet Excel dans une fonction, il appartient donc au workspace de cette fonction
    hors xlswrite cherche un objet Excel dans le worskpace de base

    je te conseille allors de créer ton objet excel en dehors de ta fonction et de la passer en paramètre de ta fonction

    tu peux aussi essayer de corriger xlsread1 en remplacant ligne 108 'base' par 'caller' (mais je suis pas sur que ca marchera dans tous les cas)

    fab

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci le fab pour cette réponse. J'ai donc essayé l'alternative la plus simple, en remplaçant base par caller mais il me donne l'exception suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Undefined function or variable "exception".
     
    Error in ==> xlsread1 at 332
    catch exception
     
    Error in ==> calcul_pente_auto at 19
    Y = xlsread1(T0,'result');
    Peut-être faudrait-il en conséquence corriger d'autres choses dans xlsread1 ? Cela me semble périlleux à mon niveau.

    Pour ce qui est de l'autre proposition, je ne vois pas trop comment la mettre en oeuvre. Si tu veux, j'ai crée antérieurement un certain nombre de fichiers .xls du type repertoire_result.xls où répertoire est le paramètre de ma fonction. Je voudrais, ailleurs, appeler cette fonction calcul_pente_auto sur tous les .xls de cette forme.

    Enfin, bon toute cette discussion concerne finalement l'emploi de xlsread1. Mais, en fait, peut-être que le fonction sera comme même lente en raison des trois boucles for !

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Bref, j'ai abandonné l'utilisation de xlsread1 (ainsi que xlswrite1) car cela semble compliqué à mettre en oeuvre. Par contre en raison des 3 boucles for la fonction est très longue et c'est cela le problème.

    Si vous voulez je récapitule : voici d'abord la fonction actuellement.

    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
    function calcul_pente_auto(repertoire)
     
    Y = xlsread(T0,'result');
    nl = size(Y,1);
     
     
    for i=1:nl %nl=evenement ie pour chaque evenement
     
        debut=Y(i,1);
        fin=Y(i,2);
        type=Y(i,5);
     
        for j=6:11 
     
            if (Y(i,j)~=1E36)
     
                piste=j-5;
     
                feuille=strcat(num2str(piste),num2str(type));
     
                deb_fin=xlsread(T0,feuille,'A:B');
     
                for k=1:size(deb_fin,1)
     
                    X=intersect([debut,fin],deb_fin(k,:));
     
                        if ~isempty(X)
                        ligne=k;
                        end
                end
     
     
                    if(ligne<=size(deb_fin,1))
                    debut=1 + 50*(deb_fin(ligne,1)-1);
                    fin=1 + 50*(deb_fin(ligne,2)-1);
                    rep_50=strcat(repertoire(1:end-2),'-50');
     
     
                    X=lecture_int(rep_50,piste,debut,fin);
                    end
            end 
     
     
     
        end
    end
     
     
    end

    Voici en gros le fonctionnement de cette fonction : on lit la feuille 'result' d'un fichier xls passé en paramètre, cette feuille est constitué d'une matrice de 11 colonnes. Elle est stockée dans Y ; on parcourt donc toute la matrice Y (première boucle for sur l'indice i), on récupère des informations (debut,fin,type) pour chaque ligne de cette matrice, et on a donc un événement [debut, fin] pour un rang i ; pour chaque événement à l'indice i, on parcourt les 6 dernières colonnes de Y pour cette i-ème ligne (deuxième boucle for sur l'indice j) et s'il n'y a pas le nombre '1E36' dans l'une d'elle, on stocke dans feuille le nom d'une autre feuille du xls initial qu'on va parcourir : (troisième boucle for sur l'indice k) et on fait alors des intersections entre l'événement en cours et tous les éléments trouvés dans deb_fin ect. Bref c'est compliqué comme cela mais pensez-vous qu'on puisse se passer d'une ou plusieurs boucles for ?

Discussions similaires

  1. [XL-2007] Boucles for imbriquées, macro trop lente
    Par Jambonpurée dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/06/2011, 18h25
  2. [XL-2003] Macro boucle for next trop lente
    Par sixtm dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/06/2011, 17h08
  3. boucle while loop trop lente et pennible
    Par jm_force dans le forum Access
    Réponses: 3
    Dernier message: 10/08/2006, 17h36
  4. [Numarray]Lenteur! Trop de boucle For peut etre????
    Par parp1 dans le forum Calcul scientifique
    Réponses: 5
    Dernier message: 19/05/2006, 08h31
  5. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35

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