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/alternative boucle for next


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut Accélération/alternative boucle for next
    Bonjour,

    afin d'automatiser un reporting, j'extrait des tables de notre système de gestion et les importe sur excel. Je dispose donc d'un onglet "CONTRAT" qui contient environ 15000 lignes (ensemble des contrats depuis 2008).
    Pour chaque contrat, on a une colonne "nom (ID)", une colonne "date de début" et une colonne "date de fin".

    Pour chaque nom (ID) je souhaiterais connaitre les mois pour lesquels il était présent. Pour cela, un usf me permet de saisir une année et lance la boucle suivante :


    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
    annee = cbox_1.Value
     
    taille_essai = Application.WorksheetFunction.CountA(Sheets("TABLEAUX").Range("$A:$A"))
     
    taille_contrat = Application.WorksheetFunction.CountA(Sheets("CONTRAT").Range("$A:$A"))
     
    For i = 2 To taille_essai
    ste = Sheets("TABLEAUX").Range("A" & i).Value & Sheets("TABLEAUX").Range("B" & i).Value
        For j = 2 To taille_contrat
        societe = Sheets("CONTRAT").Range("T" & j).Value & Sheets("CONTRAT").Range("W" & j).Value
        annee_debut = Year(Cells(j, 21)) ' test annee date de debut du contrat
        mois_debut = Month(Cells(j, 21)) ' test mois date de debut du contrat
        annee_fin = Year(Cells(j, 22)) ' test annee date de fin du contrat
        mois_fin = Month(Cells(j, 22)) ' test mois date de fin du contrat
        duree = mois_fin - mois_debut ' on compte combien de mois dure la mission
            If societe = ste And annee_debut = annee Then
                Sheets("TABLEAUX").Activate
                For m = 0 To duree
                Sheets("TABLEAUX").Cells(i, mois_debut + 2 + m).Value = 1
                Next m
                Sheets("CONTRAT").Activate
            End If
        Next j
    Next i
    Seulement voilà, le temps d'execution de cette boucle est extremement long. Elle me donne le résultat voulu sur des données moins conséquente mais avec le temps le volume des données aura plutot tendance a grossir qu'a réduire.
    Je souhaiterais donc avoir des conseils pour optimiser cette boucle voir une autre technique pour arriver a mes fins!
    Merci a tout ceux qui s pencheront sur mon problème

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 179
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu peux traiter les données dans un tableau
    Ex pour une plage A2;I106
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim maTable()
     maTable = Range("A2:I106")
    Voir Tuto ici et
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Merci pour ta réponse corona,

    J'avoue ne pas trop me servir des variables tableaux (meme jamais, car elles me paraissent un poil complexes...) mais je vais preter attention a ces deux tutos et essayer de trouver des exemples pour voir si ca peut m'apporter quelque chose!

  4. #4
    Membre éclairé Avatar de nchal
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 512
    Par défaut
    Bonjour

    Comme à chaque fois qu'il y a une question de performance, je propose de faire un petit Application.ScreenUpdating = False en début de script.
    J'ai cru voir dans ton code, des .activate et des cells.value, des commandes qui nécessitent un rafraichissement de l'écran et donc du temps.
    Peut-être que dans ton cas, le ScreenUpdating ne va pas convenir mais sa ne coute rien d'essayer.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Bonjour nchal, merci pour ta réponse
    Je n'ai pas mis l'intégralité de mon code dans mon post mais j'utilise bien un application.screenupdating en début de procédure. etant donné que je travaille sur deux onglets distincts je ne pouvais eviter l'utilisation des .activate!

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Citation Envoyé par olivier41 Voir le message
    etant donné que je travaille sur deux onglets distincts je ne pouvais eviter l'utilisation des .activate!
    C'est faux!
    Il est parfaitement possible de traiter des onglets et des cellules sans Select ni Activate.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

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

Discussions similaires

  1. les boucles for..next
    Par dispa dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/06/2007, 14h23
  2. boucle for next ? peut être mais comment
    Par caro2552 dans le forum VBA Access
    Réponses: 11
    Dernier message: 07/02/2007, 20h26
  3. [VB.net] Boucle for next avec un tableau
    Par grand_prophete dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h08
  4. [VB6] Problème contrôle Timer et boucle For-Next ...
    Par Stéphane BEHMENBURG dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/12/2005, 17h36
  5. Réponses: 3
    Dernier message: 03/11/2005, 19h22

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