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 :

Code très lent avec boucle while


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Code très lent avec boucle while
    Bonjour j'ai une lenteur inimagnable (5 seconde) avec ce code, quelqu'un voit l'erreur par pur hasard ?

    ' Fonction qui change des que tu change la colonne
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
     
    Dim iENT As Integer
    Dim iRET As Integer
    Dim ENT As Worksheet
    Dim RET As Worksheet
     
    Set ENT = Worksheets("ENT_BET")
    Set RET = Worksheets("Retenue")
     
     
        ' NETOYER LA PLAGE RETENUE
        Worksheets("Retenue").Range("A3:G150").Clear
        ' NETOYER LA PLAGE AMT
        If Target.Column = 6 Then
            iRET = 3
            iENT = 3
            While ENT.Cells(iENT, 6).Value <> ""
     
     
                If ENT.Cells(iENT, 6).Value = "Oui" Then
                     'Copier dans retenue
                    ENT.Range(iENT & ":" & iENT).Copy RET.Cells(iRET, 1)
                    iRET = iRET + 1
     
                     'TODO Copier dans AMT
     
     
                End If
                'Copi
                iENT = iENT + 1
            Wend
     
            Application.CutCopyMode = False
     
     
      End If
        Application.EnableEvents = True
    End Sub

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 683
    Par défaut
    Salut,

    manipuler des cellules dans le worksheet_change, c'est pas l'idéal, aussi il faudrait a minima désactiver les évènements, ce que tu as fait, mais il y a également des problématiques de calculs, avec des formules dans tous les sens...
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel (3e édition)
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre confirmé
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2019
    Messages : 22
    Par défaut
    Bonjour,

    Ton code s'exécute à chaque fois que tu changes de cellule avec une boucle while ?! Obligé d'avoir While dans ton code ?
    Peux-tu expliquer ce que tu tentes de faire ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ca sert juste a ne pas aller jusqu'a la dernière colonne d'excel 129000 où un truc du genre donc c'est pour juste copier la derniere ligne non vide
    sauf erreur de ma part

  5. #5
    Membre confirmé
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2019
    Messages : 22
    Par défaut
    Tu veux copier la dernière ligne en te basant sur une colonne ?
    Peux-tu donner un exemple avec une capture d'écran ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour oui bien sur !

    Je t'ai fait un exemple dans la capture d’écran ci-dessous,
    en fait des que quelqu'un se met sur la colonne 6 le code s'execute
    Nom : Capture3.PNG
Affichages : 424
Taille : 121,1 Ko
    Dans l'objectif de copier tous dans l'autre feuille pour continuer uniquement avec les entreprises retenues

  7. #7
    Membre confirmé
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2019
    Messages : 22
    Par défaut
    Tu es obligé de passer par un SelectionChange ? Tu ne peux pas créer un bouton qui copie tout dans une autre feuille et vire tout ce qui n'est pas "retenue : oui" ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut. Tu es sûr que range("a1").currentregion va jusque F1? Attention que sans préfixe, Range("a1") pointe vers la feuille de calcul active.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre confirmé
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2019
    Messages : 22
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut. Tu es sûr que range("a1").currentregion va jusque F1? Attention que sans préfixe, Range("a1") pointe vers la feuille de calcul active.
    Range("A1").currentRegion prenait la première ligne de cellules fusionnées. J'ai du changer cela, car ne doit pas faire partie du tri.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Comme tu utilises une référence mixte (absolue sur la colonne et relative sur la ligne), Excel comprend ta formule de la même manière et interprète donc la mise en forme conditionnelle en utilisant un décalage de lignes relatif à la cellule active au moment de la création de la MFC.

    Si, lorsque tu utilises ta formule =ESTTEXTE($A3) pour créer la mfc, ta cellule active est sur la ligne 20 par exemple, cela signifie qu'Excel doit tester la cellule en colonne A 17 lignes plus haut... Tu dois donc être très attentif à la cellule active au moment de la création de la mfc si tu utilises des références relatives.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Invité
    Invité(e)
    Par défaut
    Oui effectivement je l'ai déja fait sur une autre feuille et cela foncitonne parfaitement !

    la j'ai la mfc qui se supprime complètement des que j'appuie sur Valider j'ai essayé plusieurs fois je suis sur, ce n'est pas une question de mauvaise formule , je crains que ce soit une ligne affecté à la macro de Allan06,

  12. #12
    Invité
    Invité(e)
    Par défaut
    C'est bon une simple boucle imbriqué suffisait .

    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
    Option Compare Text
    Sub Valider_Cliquer()
    Application.ScreenUpdating = False
    Dim NbYes As Integer
    Dim Debut, Fin As Long
    Sheets("ENT_BET").Activate
    NbYes = Application.WorksheetFunction.CountIf(Columns("F"), "Oui")
    Select Case NbYes
    Case Is > 0
        'On nettoie la feuille retenue
        Sheets("Retenue").Activate
        Range("A3", "D1000").Clear
        Sheets("ENT_BET").Activate
        'On demande un tri sur la colonne F
        Range("A2", Cells(Range("A2").End(xlDown).Row, "G").Address).Sort _
        key1:=Range("F2"), order1:=xlDescending, dataoption1:=xlSortNormal, Header:=xlYes
        Debut = Columns("F").Find("Oui", , xlValues, xlWhole).Row
        Fin = Debut + NbYes - 1
        Union(Range(Cells(Debut, 1).Address, Cells(Fin, 3).Address), Range(Cells(Debut, 7).Address, Cells(Fin, 7).Address)).Copy
        Sheets("Retenue").Activate
        Range("A3").PasteSpecial xlPasteValues
     
    End Select
    With Range("A3:D150")
        .HorizontalAlignment = xlHAlignCenter 'ou xlHAlignLeft ou xlHAlignRight
        .VerticalAlignment = xlVAlignCenter 'ou xlVAlignTop ou xlVAlignBottom
    End With
    For i = 3 To 100   'Pour bordure
    If Not IsEmpty(Cells(i, 1)) Then
    For j = 1 To 4 'Colonne
      Cells(i, j).Borders(xlEdgeLeft).LineStyle = xlContinuous
        Cells(i, j).Borders(xlEdgeRight).LineStyle = xlContinuous
        Cells(i, j).Borders(xlEdgeTop).LineStyle = xlContinuous
        Cells(i, j).Borders(xlEdgeBottom).LineStyle = xlContinuous
        Next
     
    End If
    Next
     
    End Sub
    En tout cas merci a vous !

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    il serait tout de même pertinent, à mon avis, de travailler avec des tables de données. Elles permettent notamment de définir proprement les plages utilisées.

    Le code Range("A3", "D100000").ClearContents laisse penser qu'on a placé la MFC sur 100000 lignes "pour avoir de la réserve"... Or, une MFC sur 100000 lignes, c'est 100000 calculs pour Excel. Si le tableau fait 5000 lignes, c'est 95000 calculs de trop... Inévitablement, ça ralentit le classeur. C'est notamment pour cela que je demandais d'en savoir plus sur la conception du classeur

    Comme je l'explique dans mon tuto, la MFC s'adapte à l'ajout et la suppression de lignes dans la table.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre confirmé
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2019
    Messages : 22
    Par défaut
    Le code Range("A3", "D100000").ClearContents sert uniquement à effacer le contenu d'une plage, il ne touche en rien à la mise en forme.
    A voir sur la MFC saute en lançant le code.

    • Suppression = .Delete
    • Effacement de tout = .Clear
    • Effacement du contenu = .ClearContents



    Bonne journée

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Ok. Mais de toute façon, l'utilisation d'une table de données permet d'en supprimer les lignes (et uniquement les lignes) sans avoir besoin prévoir "de la réserve". L'utilisation des tables de données a plus que largement simplifié la manipulation des données avec Excel et VBA. Dès lors, pourquoi s'en priver?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Membre confirmé
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2019
    Messages : 22
    Par défaut
    Sur VBA, un tableau de données (Ctrl + L) est un objet.
    Je ne voulais pas compliquer le code et éviter toute source d'erreur
    Après, je suis d'accord avec toi, c'est une manière plus simple de travailler.

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Allan06 Voir le message
    Sur VBA, un tableau de données (Ctrl + L) est un objet.
    Une plage aussi. Je ne comprends pas bien ton argument


    Citation Envoyé par Allan06 Voir le message
    Je ne voulais pas compliquer le code et éviter toute source d'erreur
    L'utilisation d'un listobject simplifie le code plutôt que le compliquer, et évite les erreurs


    Citation Envoyé par Allan06 Voir le message
    Après, je suis d'accord avec toi, c'est une manière plus simple de travailler.
    C'est LA manière de travailler les données avec les versions actuelles d'Excel. On m'accusera de pensée unique mais je m'en fous. Travailler les données et les stocker autrement que dans des tables de données est un aujourd'hui une ineptie
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Membre confirmé
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2019
    Messages : 22
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Une plage aussi. Je ne comprends pas bien ton argument
    Si le tableau structuré venait à être transformé en plage de données, l'objet ne serait plus le même ?

    Citation Envoyé par Pierre Fauconnier Voir le message
    L'utilisation d'un listobject simplifie le code plutôt que le compliquer, et évite les erreurs
    .Showalldata ne fontionne pas avec les tableaux structurés

    Citation Envoyé par Pierre Fauconnier Voir le message
    C'est LA manière de travailler les données avec les versions actuelles d'Excel. On m'accusera de pensée unique mais je m'en fous. Travailler les données et les stocker autrement que dans des tables de données est un aujourd'hui une ineptie
    Complétement d'accord Je ne voulais juste pas mettre le fichier de walido en tableau structuré, j'aide, je ne fais pas :p

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Allan06 Voir le message
    [...]j'aide, je ne fais pas :p
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. JButton avec boucle while contenant thread.sleep(1000)
    Par v4np13 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/10/2007, 21h31
  2. export oracle 9.2.0.7 trés lent avec un user
    Par deadoralive dans le forum Outils
    Réponses: 2
    Dernier message: 10/10/2007, 19h11
  3. [MySQL] Probleme UPDATE avec boucle WHILE
    Par iverson_mac dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 18h07
  4. Réponses: 2
    Dernier message: 19/11/2006, 11h54
  5. [Debutant/WinAPI] Souci avec boucle While et GetMessage()
    Par SnowStyle dans le forum Windows
    Réponses: 11
    Dernier message: 15/10/2005, 20h19

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