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 :

Limite de la boucle for


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
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut Limite de la boucle for
    Bonjour a tous,

    Dernierement je me suis mis a devlopper avec VBA et des le debut j ai recomptre des problemes.
    Alors le programme est tres simple : il consiste dans deux boucles For imbriquees de 3 jusqu a 16000.
    lors de l execution, exel se plante et me dit "not responding"
    j ai essaye de diminuer les deux boucles alors j ai mis 1000 et ca marche. A partir de 1500 ou quelque chose comme ca il se plente avec le message d excel "not responding".
    est ce qu il y a une limite de memoire ????

    merci

  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 176
    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 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Avec ce type d'explication, tu as peu de chance d'obtenir une réponse adéquate.
    L'affichage de ton code permettrait certainement d'avancer.
    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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Voici le 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
     
    Sub Comparer()
        Dim i, j As Integer
        Dim nullDatum As String
        nullDatum = "00.00.0000"
        For i = 3 To Range("A65536").End(xlUp).Row
            If Range("c" & i).Value = nullDatum Then
                For j = 3 To Range("A65536").End(xlUp).Row
                    If Range("b" & i) = Range("c" & j) And i <> j Then
                        Range("c" & i) = Range("c" & j)
                    End If
                Next
            End If
        Next
     
    End Sub
    Pour info Range("A65536").End(xlUp).Row retourne 15767

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut,

    Le problème, c'est que le code VBA s'execute dans le même thread que le thread utilisateur (d'affichage et des commandes etc...). Alors, dès qu'une boucle dure plus d'environ 1 seconde, toutes les fenêtres d'affichages ne répondent plus et c'est le système d'exploitation qui prends le relais (et affiche un message dans la barre de titre).
    Utilise DoEvents (ou même GetInputeState) si tu veux que les commandes répondent pour les long calculs.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Declare PtrSafe Function GetInputState Lib "user32" () As Long
     
    Sub BoucleLongue()
        For i = 1 To 200000000
            'If GetInputState Then DoEvents ' Détecte l'état d'entrée des commandes clavier/souris
            If i Mod (100000) = 0 Then DoEvents ' Clique sur l'aide F1 pour des infos
        Next
    End Sub
    Il faut un DoEvents minimum toutes les 500 ms grosso-modo, alors le chiffre qui est dans la parenthèse après le Mod variera suivant ce qu'il y a dans la boucle. Généralement entre 100 et 10000.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Un grand merci !!!!!
    cela fonctionne de nouveau comme t'a dit

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Bonjour tout le monde,

    et bien la solution de "nouveau2" a bien fonctionner mais le probleme c est que je dois toujours travailler avec de grands tableaux et cette fois-ci j'ai deux tableaux excel dans chacun contient 60000 ligne.
    Et comme d habitude je dois parcourir les deux tableaux presque comme l exemple que j ai deja mentionner. Avec la solution donner par nouveau2 l exucution et tres lente !!!!!!
    Normalement c est un probleme d allocation de memoire ou quelque chose comme ca.
    Avez vous une idee comment pourrai je resoudre ce probleme ????

    Merci

  7. #7
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut Passer par une variable tableau pour accélérer le code
    Bonjour,

    vois ce sujet dans le tuto (55 000 lignes sur 256 colonnes...):

    Optimisation du code avec les variables tableau sous Excel

    Sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For j = 3 To Range("A65536").End(xlUp).Row
    ce genre de code avec la limite de ligne en dur est obsolète et dangereux depuis 2007, vois les fils sur ce sujet dans le forum

    cordialement,

    Didier

Discussions similaires

  1. [XL-2010] Boucle For limite haute variable
    Par YanBos dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/04/2014, 17h17
  2. Boucle for i++ limité
    Par ParMesSoins dans le forum Langage
    Réponses: 2
    Dernier message: 17/01/2014, 11h12
  3. Linux, boucle for qui s'arrête : limite mémoire ?
    Par ticad dans le forum Langage
    Réponses: 3
    Dernier message: 18/01/2012, 14h24
  4. utilisation de la STL pour limiter ma boucle for
    Par salseropom dans le forum C++
    Réponses: 5
    Dernier message: 06/02/2010, 14h03
  5. [Débutant] Modifier la limite d'une boucle For dynamiquement
    Par seiryujay dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 15/12/2006, 18h45

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