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

Macros et VBA Excel Discussion :

Accélération de macro avec boucles imbriquées


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Accélération de macro avec boucles imbriquées
    Bonjour à tous, c'est mon premier message sur ce forum !

    Voilà ma question :
    J'ai un Array d'integers, DataInt(), de n lignes et t colonnes. Ces colonnes sont remplies de 1, 2 et 3. Je souhaite comparer toutes les colonnes 2 à 2 en comptant les 9 combinaisons possibles (11, 12, 13, 21, 22, 23, 31, 32, 33) pour chaque paire possible de colonnes.

    J'ai fait une macro, elle fonctionne parfaitement, mais l'exécution est trop lente car j'ai souvent des valeurs autour de t = 10 000 et n = 200, ce qui me fait 100 000 000 x 200 opérations...

    Je souhaiterais savoir si quelqu'un connaît le moyen d'accélérer significativement ma macro, sachant que i, n et t sont déclarés en Long (plus rapide que Integer), ainsi que DataInt().

    Un grand merci d'avance !

    Ma macro :
    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
    Sub Compute_Combinaisons()
    'DataInt est un Array d'integers, de n lignes et t colonnes.
    For x = 1 To t
        For y = x + 1 To t
            N1 = 0: N2 = 0: N3 = 0: N4 = 0: N5 = 0: N6 = 0: N7 = 0: N8 = 0: N9 = 0 'initialisation les effectifs de chaque combinaison
            For i = 1 To N
                If DataInt(i, x) = 1 Then
                    If DataInt(i, y) = 1 Then
                        N1 = N1 + 1
                    ElseIf DataInt(i, y) = 2 Then
                        N2 = N2 + 1
                    ElseIf DataInt(i, y) = 3 Then
                        N3 = N3 + 1
                    End If
                ElseIf DataInt(i, x) = 2 Then
                    If DataInt(i, y) = 1 Then
                        N4 = N4 + 1
                    ElseIf DataInt(i, y) = 2 Then
                        N5 = N5 + 1
                    ElseIf DataInt(i, y) = 3 Then
                        N6 = N6 + 1
                    End If
                ElseIf DataInt(i, x) = 3 Then
                    If DataInt(i, y) = 1 Then
                        N7 = N7 + 1
                    ElseIf DataInt(i, y) = 2 Then
                        N8 = N8 + 1
                    ElseIf DataInt(i, y) = 3 Then
                        N9 = N9 + 1
                    End If
                End If
                'ici je calcule une formule qui est une fonction des 9 effectifs et mets le résultat dans un tableau
            Next i
        Next y
    Next x
    End Sub

  2. #2
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 061
    Points
    32 061
    Par défaut
    Citation Envoyé par Mathias_L Voir le message
    J'ai fait une macro, elle fonctionne parfaitement, mais l'exécution est trop lente car j'ai souvent des valeurs autour de t = 10 000 et n = 200, ce qui me fait 100 000 000 x 200 opérations...(.../...)
    La réponse est dans la question. Si tu as 10 milliards de fois la même opération, fatalement, ça ne se fera pas d'un claquement de doigts.

    Si tu souhaites quand même rester sur cet algorithme, alors la seule optimisation possible, c'est ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                'ici je calcule une formule qui est une fonction des 9 effectifs et mets le résultat dans un tableau
    Mais il ne faudra pas en attendre de miracles. De toutes façons, tu la ferais 10 milliards de fois, donc, ça va bouffer du temps de calcul. C'est à ça que sert un dual-core, d'ailleurs : pendant que ton traitement tourne sur un core, tu peux travailelr sur autre chose avec l'autre core.

    Ou alors tu reformules ton problème. Ou alors tu accèptes que certains traitements prennent du temps. En bancaire, on a pas mal de batches qui tournent la nuit, parcequ'ils prennent plusieurs heures. Dans le code que tu nous a donné, je ne vois rien de scandaleux d'un point de vue de la performance.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour Slapper, et merci de ta réponse, même si elle confirme mes craintes...

    Bonne journée

Discussions similaires

  1. Selectionner toutes les CheckBoxs avec boucle imbriquée.
    Par Azaxx dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/07/2011, 14h51
  2. [XL-2003] Créer une macro avec boucle sur sélection
    Par ostik dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/03/2011, 16h47
  3. [XL-2003] Macro avec boucle sur une colonne et condition sur une autre
    Par Isabelle86 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/10/2010, 10h31
  4. [Débutant]Boucle imbriquée avec des bornes différentes
    Par Hayato dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/08/2005, 16h23
  5. [XSL]boucle imbriquée avec condition
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/01/2005, 14h19

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