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 :

macro est bien trop longue a l’exécution (env 40 min ) // Reduction [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de Maintenance
    Inscrit en
    Juin 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de Maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 31
    Par défaut macro est bien trop longue a l’exécution (env 40 min ) // Reduction
    Bonsoir à tous,

    Le but de ma macro est de connaitre le nombre de fois que deux chiffres sont sortis en même temps sur un tirage et cela sur une période de plusieurs tirages définis dans ma macro.
    Mais son temps d’exécution est bien trop longue (env 40 min ).
    Je recherche a réduire son temps d’exécution.


    Mon exemple : combien de fois sont sortis 39 - 1 sur un même tirage pendant les 200 derniers tirages (Variable de nombre de tirage défini : Nb_TirageAnnee ), etc 39-2 , 39-... 70 ainsi de suite sur les valeurs 2, 37, 67, 41, 63, 4, 10, 66, 24.

    Pouvez-vous m'aider a réduire par une autre programmation à réduire se temps?

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Pouvez-vous m'aider a réduire par une autre programmation à réduire se temps?
    S'il faut pour cela télécharger et ouvrir ton classeur pour l'analyser, tu peux m'attendre longtemps.
    Lis ma signature...
    Si tu veux de l'aide (du moins de ma part), montre ton code (entre balises code).

  3. #3
    Membre averti
    Homme Profil pro
    Responsable de Maintenance
    Inscrit en
    Juin 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de Maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 31
    Par défaut
    J'en suis navré.... Ci-joint mon code

    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
    Sub Annonciateur()
    Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer, Nb_TirageAnnee As Integer, T As Double
    '
     
    ' Effacement des données du tableau
        Range("B4:K73").ClearContents
    'Affectation du nombre de tirage a comparer
        Nb_TirageAnnee = 200
     
    'Lancement du timer pour connaitre le temps d'execution de la recherche
    T = Timer
     
    'Lancement de la boucle pour connaitre les frequences entre deux chiffres sur un nombre de tirage donné
     
                For b = 3 To Nb_TirageAnnee
                  For d = 4 To 73
                    For c = 5 To 24
                        For e = 5 To 24
                              For a = 2 To 11
     
            If Cells(3, a) = Sheets("Tirages").Cells(b, c) And Cells(d, 1) = Sheets("Tirages").Cells(b, e) Then Cells(d, a) = Cells(d, a) + 1
     
                             Next a
                        Next e
                    Next c
                  Next d
               Next b
     
    'Affectation du timer pour connaitre le temps d'execution de la recherche
    Range("Q1") = Application.Round((Timer - T), 1) & " Sec"
    Range("Q2") = Round((Application.Round((Timer - T), 1) / 60), 2) & " Min"
    End Sub

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Houla ...
    L'examen et l'analyse de tes boucles met en exergue que tu fouilles toujours partout, tant pour un nombre que celui auquel tu l' "associes", ce qui donne à penser que tes nombres sont répatis sur une grille, mais pas toujours à la même place (dans la même colonne).
    C'est alors la conception elle-même, qui est à reconsidérer.
    Tu gagnerais énormément, par exemple, en utilisant 70 colonnes (de 1 à 70) et sur chaque ligne (chaque tirage, donc) inscrivant un "1" dans la colonne correspondant à un numéro "sorti"
    Le reste serait alors simple avec Worksheetfunction.sumifs *****
    Exemple avec les chiffres 39 et 1
    en boucle sur tes 200 tirages (sommer si 1 en colonne 39 et 1 en colonne 1)
    Voilà comment je vois les choses à ce stade (sans trop réfléchir)
    Un telle organisation te permettrait déjà d'éviter l'énorme multitude de boucles que tu gères actuellement ...
    Je te laisse voir déjà cela.
    Nous verrons ENSUITE comment boucler sur une matrice plutôt que sur tes cellules permettra de diminuer encore le temps de traitement.

    EDIT ***** Que dis-je ! tu pourrais encore mieux "cocher" par un "X" plutôt que par un "1" et utiliser alors Worksheetfunction.Countifs (plus rapide encore)



    EDIT 2 : En outre : y compris avec l'organisation (que je suppose) actuelle de tes données, je ne comprends pas tes égarements et le nombre induit (énorme) de cellules à parcourir.
    Pourquoi ?
    Tout simplement parce-que chaque tirage est un tirage de n nombres, apparemment 20 nombres, composé donc de 190 "paires" de nombres. En multipliant par 200 (le nombre de tes tirages), cela ne fait que 38000 déterminations (on est très loin de tes parcours).
    Et même ainsi, donc : ce serait plus lent que ce que je suggère plus haut (du fait des additions au lieu des countifs), mais mille fois plus rapide que ce que tu fais actuellement !

    EDIT 3 (en passant) : Rappel en ce jour de Pâques : le propre du hasard est d'être totalement aléatoire. Il est vain d'espérer déduire une probabilité future de tirages aléatoires sur la base des résultats de tirages aléatoires antérieurs.
    Tes "constats" n'auront donc de toutes manières aucune autre valeur que celle de constats et en aucun cas celle de détermination d'une "martingale", hein ...

  5. #5
    Membre averti
    Homme Profil pro
    Responsable de Maintenance
    Inscrit en
    Juin 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de Maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 31
    Par défaut
    Bonjour unparia,

    Merci pour tes explications :
    Tu gagnerais énormément, par exemple, en utilisant 70 colonnes (de 1 à 70) et sur chaque ligne (chaque tirage, donc) inscrivant un "1" dans la colonne correspondant à un numéro "sorti"
    Je me suis basé sur cette proposition en créant une nouvelle feuille tempo (Frequence_Tableau_Numero) pour établir le tableau a 70 colonnes et sous chaque colonne je lui ai affecté =NB.SI en vba =COUNTIF en inscrivant 1 lorsque le numéro est sorti sur la ligne du tirage en question.

    Apres je fais une rechercher a l'essentielle, c'est a dire que que recherche sur la colonne 39 et 1, 39 et 2 ... etc.
    Grace à cette nouvelle approche j'ai gagné énormément de temps , C.-à.-D temps d’exécution de la macro - 10 sec.

    Comme quoi des fois le regard d'autrui permet de faire des pas de géant dans notre projet.

    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
     
    Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer, Nb_TirageAnnee As Integer, t As Double
    '
    Sheets("Frequences").Select
    ' Effacement des données du tableau
        Range("B4:K73").ClearContents
    'Affectation du nombre de tirage a comparer
        Nb_TirageAnnee = 200
     
    'Lancement du timer pour connaitre le temps d'execution de la recherche
    t = Timer
     
    'Lancement de la boucle pour connaitre les frequences entre les chiffres sur un nombre de tirage donné
     
                For b = 2 To Nb_TirageAnnee + 1
                  For d = 2 To 71
                    For a = 2 To 11
     
                        x = Cells(3, a)
                        If Sheets("Frequence_Tableau_Numero").Cells(b, d) = 1 And Sheets("Frequence_Tableau_Numero").Cells(b, x + 1) = 1 Then Cells(d + 2, a) = Cells(d + 2, a) + 1
     
                     Next a
                   Next d
               Next b
     
     
    'Affectation du timer pour connaitre le temps d'execution de la recherche
    Range("Q1") = Application.Round((Timer - t), 1) & " Sec"
    Range("Q2") = Round((Application.Round((Timer - t), 1) / 60), 2) & " Min"
    End Sub


    Merci pour ton aide et tes explications.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bon. 10 secondes par rapport à 40 minutes, c'est déjà beaucoup mieux ...
    Ceci dit :
    1) tu gagnerais encore un peu de temps en inhibant l'affichage (application.screenupdating = false) au début de la procédure et en le rétablissant (application.screenupdating = true) à la fin de la procédure
    2) tu en gagnerais beaucoup encore plus en ne travaillant pas directement sur tes cellules, mais sur une matrice dressée sur la plage de tes cellules.
    Mais bon ... Compte tenu de ce que tu en fais et peux en faire utilement, tu peux également en rester là ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête HTTP via httpClient bien trop longue
    Par dumoulex dans le forum Entrée/Sortie
    Réponses: 39
    Dernier message: 17/10/2013, 16h31
  2. Réponses: 19
    Dernier message: 12/03/2010, 17h21
  3. [AC-2003] Tuer une macro trop longue à s'exécuter
    Par reeenooo dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/10/2009, 18h43
  4. cmd -> la ligne entrée est trop longue
    Par Kobe70 dans le forum Windows XP
    Réponses: 5
    Dernier message: 14/05/2008, 09h57
  5. Comment faire lorsque la requete est trop longue ?
    Par tabtab dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 26/03/2008, 14h55

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