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 :

Durée de boucles 102mn, pour 147000 lignes [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Août 2018
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Août 2018
    Messages : 84
    Par défaut Durée de boucles 102mn, pour 147000 lignes
    Bonjour,

    J'ai un petit soucis de temps sur une boucle qui marche très bien mais nécessite beaucoup de patience. J'ai cru comprendre que les modules de classes m'aideraient pour ça mais après lu et relu la doc il faut avouer que c'est assez obscure pour moi.
    Si quelqu'un a une bonne idée, je serais reconnaissant.

    Merci d'avance
    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
     
        If Feuil2.Range("I8") = "ACIER" Or Feuil2.Range("I8") = "ALU" Then
            Col = "G" 'Colonne G de l'onglet source pour Acier Alu
            NbLar = 8
            Nb_Ouv = 24500
            Nb_Ress = 122500
            Nb_Cumul = 147000
        Else
            Col = "H" 'Colonne H de l'onglet source pour le ZCI
            NbLar = 7
            Nb_Ouv = 21000
            Nb_Ress = 105000
            Nb_Cumul = 126000
        End If
        Lign = 7
        LinCol = 13
        Feuil2.Range("A" & Lign & ":T" & Lign + 5).Select
        Selection.Copy
        For NbLar = NbLar To 2 Step -1
            DevLar = Sheets("Source Produit").Range(Col & NbLar).Value
            For NbLong = 2 To 15
                DevLon = Sheets("Source Produit").Range("I" & NbLong).Value  'Feuil2.Range("A7:G7").Select
                For NbPli = 1 To 10
                    For Mol = 0 To 4
                        For Enc = 0 To 4
                            Feuil2.Range("A" & LinCol).PasteSpecial (xlPasteAll)
                            Feuil2.Range("C" & LinCol).Value = NbPli
                            Feuil2.Range("D" & LinCol).Value = DevLar
                            Feuil2.Range("E" & LinCol).Value = DevLon
                            Feuil2.Range("F" & LinCol).Value = Mol
                            Feuil2.Range("G" & LinCol).Value = Enc
                            LinCol = LinCol + 6
                            Lign = Lign + 6
                        Next Enc
                    Next Mol
                Next NbPli
            Next NbLong
        Next NbLar
        Application.CutCopyMode = False

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour,

    Pour mieux comprendre ton souci en tentant de bypasser les boucles.

    Pourrais exprimer en français le but de tes boucles, il me semble qu'un filtrage élaboré et collage des résultat pourrait faire le job, mais t'avoue me perdre dans tes boucles imbriquées

  3. #3
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

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

    Pouvez-vous joindre un fichier exemple ? Je pense savoir comment accélérer tout ça.

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,

    Au lieu d'écrire dans des cellules tu devrais construire un tableau VBA à 2 dimensions puis transférer le tableau sur la feuille.
    Comme la plage à écrire semble de dimension prédéfinie, ça simplifie le code.
    Ça ne devrais durer que quelques fractions de secondes.

  5. #5
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour
    ,

    Essaies comme ça (sans tableau) :
    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
        If Feuil2.Range("I8") = "ACIER" Or Feuil2.Range("I8") = "ALU" Then
            Col = "G" 'Colonne G de l'onglet source pour Acier Alu
            NbLar = 8
            Nb_Ouv = 24500
            Nb_Ress = 122500
            Nb_Cumul = 147000
        Else
            Col = "H" 'Colonne H de l'onglet source pour le ZCI
            NbLar = 7
            Nb_Ouv = 21000
            Nb_Ress = 105000
            Nb_Cumul = 126000
        End If
        Lign = 7
        LinCol = 13
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
        Feuil2.Range("A" & Lign & ":T" & Lign + 5).Copy Feuil2.Range("A" & Lign & ":T" & Lign + 126005)
        For NbLar = NbLar To 2 Step -1
            DevLar = Sheets("Source Produit").Range(Col & NbLar).Value
            For NbLong = 2 To 15
                DevLon = Sheets("Source Produit").Range("I" & NbLong).Value  'Feuil2.Range("A7:G7").Select
                For NbPli = 1 To 10
                    For Mol = 0 To 4
                        For Enc = 0 To 4
                            Feuil2.Range("C" & LinCol).Value = NbPli
                            Feuil2.Range("D" & LinCol).Value = DevLar
                            Feuil2.Range("E" & LinCol).Value = DevLon
                            Feuil2.Range("F" & LinCol).Value = Mol
                            Feuil2.Range("G" & LinCol).Value = Enc
                            LinCol = LinCol + 6
                            Lign = Lign + 6
                        Next Enc
                    Next Mol
                Next NbPli
            Next NbLong
        Next NbLar
        Application.CutCopyMode = False
        Application.ScreenUpdating = True
        Application.Calculation = xlCalculationAutomatic

  6. #6
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 586
    Par défaut
    Citation Envoyé par Patrice740 Voir le message
    Bonjour,

    Au lieu d'écrire dans des cellules tu devrais construire un tableau VBA à 2 dimensions puis transférer le tableau sur la feuille.
    Comme la plage à écrire semble de dimension prédéfinie, ça simplifie le code.
    Ça ne devrais durer que quelques fractions de secondes.
    Oui, c'est ce que je suis en train de faire.

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Citation Envoyé par Alex020181 Voir le message
    Oui, c'est ce que je suis en train de faire.
    Je l'ai fait et je ne l'ai pas proposé car c'est moins rapide, du fait de la nécessité de copier les formats de la plage à copier.

  8. #8
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 586
    Par défaut
    Voici un exemple de code pour créer votre tableau final.

    Testez et dites-moi.

    Par contre j'obtiens 126 000 lignes environ et pas 147 000. Même avec votre code d'origine.
    Fichiers attachés Fichiers attachés

  9. #9
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Citation Envoyé par Alex020181 Voir le message
    Voici un exemple de code pour créer votre tableau final.
    Testez et dites-moi.
    Par contre j'obtiens 126 000 lignes environ et pas 147 000. Même avec votre code d'origine.
    Il manque la copie des formats ..., sinon c'est a peu près ce j'avais testé : c'est plus lent que ce que j'ai proposé (j'ai aussi 126 005 lignes).

  10. #10
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Août 2018
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Août 2018
    Messages : 84
    Par défaut
    Citation Envoyé par Patrice740 Voir le message
    Bonjour
    ,

    Essaies comme ça (sans tableau) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
    Bonjour,
    J'ai en effet trouvé cette solution en un peu plus poussé encore sur un cours hier et qui porte les 147000 lignes à 7mn. C'est plutôt efficace
    Pour la question des lignes:
    Quand NbLar = 7 alors 126000 et 147 pour Nblar = 8
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Application.ScreenUpdating = False
    Application.DisplayStatusBar = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False

  11. #11
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Août 2018
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Août 2018
    Messages : 84
    Par défaut
    Citation Envoyé par Alex020181 Voir le message
    Voici un exemple de code pour créer votre tableau final.
    Testez et dites-moi
    5 secondes et 16 centièmes.

    C'est efficace. Seul problème, et c'est ma faute j'aurais du préciser, il me colle que du texte en faisant sauter les formules. Je suis en train d'essayer de regarder.

    Merci encore

  12. #12
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 586
    Par défaut
    Citation Envoyé par Floyd-44 Voir le message

    il me colle que du texte en faisant sauter les formules.
    Pouvez-vous joindre un fichier exemple contenant vos formules ?
    En résultat voulez-vous que les formules soient gardées ou que seuls leurs résultats soient affichés ?

  13. #13
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Août 2018
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Août 2018
    Messages : 84
    Par défaut
    Citation Envoyé par Alex020181 Voir le message
    Voici un exemple de code pour créer votre tableau final.
    Testez et dites-moi.
    Par contre j'obtiens 126 000 lignes environ et pas 147 000. Même avec votre code d'origine.
    J'ai passé pas mal de temps dessus pour adapter toutes les données à intégrer mais ça en valait largement la peine.

    A peine plus de 7 secondes... Merci beaucoup pour ton aide

    Sinon : NB_Lar = 7 dans ton exemple c'est pour ça, quant il est = à 8 tu trouveras les 147kLignes

    Allez bon confinement...!

  14. #14
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Citation Envoyé par Floyd-44 Voir le message
    J'ai en effet trouvé cette solution en un peu plus poussé encore sur un cours hier et qui porte les 147000 lignes à 7mn. C'est plutôt efficace
    7 mn ????
    Chez moi le code que j'ai proposé ne met que 5 secondes (avec une UC 32 bits qui a 10 ans)

  15. #15
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Août 2018
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Août 2018
    Messages : 84
    Par défaut
    Citation Envoyé par Patrice740 Voir le message
    7 mn ????
    Chez moi le code que j'ai proposé ne met que 5 secondes (avec une UC 32 bits qui a 10 ans)
    Parce que tu copie uniquement des valeurs tandis que le tableau (5,19) copié contient beaucoup de formules de type INDEX EQUIV, SOMME et PRODUIT avec des conditions SI etc...
    Sur ta base, j'ai donc intégré la définition des valeurs dans le code et non dans la feuille, 6.54 secondes ce matin. Je te remercie

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

Discussions similaires

  1. Boucle : pour chaque ligne du tableau !
    Par IceCrime752 dans le forum VBA Access
    Réponses: 12
    Dernier message: 16/03/2016, 11h19
  2. Boucle copier coller entre 2 fichiers pour chaque ligne
    Par cheerleaders dans le forum Excel
    Réponses: 3
    Dernier message: 19/05/2015, 19h09
  3. [Batch] Deux boucles FOR pour comparer deux fichiers ligne par ligne et une condition IF
    Par Christophe.G dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 19/11/2014, 00h10
  4. sortir d'une boucle et reprendre pour la ligne suivante
    Par gueridonbis dans le forum PL/SQL
    Réponses: 4
    Dernier message: 21/07/2009, 23h06
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 16h23

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