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 :

Un code trop lent à s'exécuter [XL-MAC 2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 234
    Points : 92
    Points
    92
    Par défaut Un code trop lent à s'exécuter
    Bonjour, le forum!
    Le code ci-dessous fonctionne, mais prend trop de temps à s'exécuter. Y a-t-il un moyen de réduire le temps d'exécution de cette macro? Comment?

    Merci par 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Private Sub CmdValider_Click()
    Dim choix As String
     
    choix = vbYes
    If MsgBox("Voulez-vous enregistrer cette opération?", vbQuestion + vbYesNo, "Confirmation") = vbYes Then
     
    Dim derligne As Integer
    Dim WS As Worksheet
    Dim ligne As Integer
     
    Set WS = Sheets("Journaux")
    derligne = WS.Range("B5000").End(xlUp).Row
    If WS.Range("B5").Value = "" Then
    derligne = WS.Range("B5000").End(xlUp).Row
    Else
    derligne = WS.Range("B5000").End(xlUp).Row + 1
    End If
     
    For ligne = 19 To 40
    If Cells(ligne, 3).Value <> "" Then
    WS.Range("B" & derligne).Value = Range("G15").Value
    WS.Range("C" & derligne).Value = Range("G13").Value
    WS.Range("D" & derligne).Value = Range("D13").Value
    WS.Range("E" & derligne).Value = Cells(ligne, 3).Value
    WS.Range("F" & derligne).Value = Cells(ligne, 4).Value
    WS.Range("G" & derligne).Value = Cells(ligne, 5).Value
    WS.Range("H" & derligne).Value = Cells(ligne, 6).Value
    WS.Range("I" & derligne).Value = Range("D15").Value
    WS.Range("J" & derligne).Value = Cells(ligne, 7).Value
    WS.Range("K" & derligne).Value = Cells(ligne, 8).Value
     
    derligne = derligne + 1
     
    End If
    Next
    Range("G15").Value = Range("G15").Value + 1
    Range("G15").Value = ""
    Range("G13").Value = ""
    Range("D13").Value = ""
    Range("D15").Value = ""
    Range("E19").Value = ""
    Range("E20").Value = ""
    Range("E21").Value = ""
    Range("E22").Value = ""
    Range("F19").Value = ""
    Range("F20").Value = ""
    Range("F21").Value = ""
    Range("F22").Value = ""
    Range("G19").Value = ""
    Range("G20").Value = ""
    Range("G21").Value = ""
    Range("G22").Value = ""
    Range("H19").Value = ""
    Range("H20").Value = ""
    Range("H21").Value = ""
    Range("H22").Value = ""
     
    Sheets("Saisie").Range("C19:C40").ClearContents
    Sheets("Saisie").Range("E19:E40").ClearContents
    Sheets("Saisie").Range("F19:F40").ClearContents
    Sheets("Saisie").Range("G19:G40").ClearContents
    Sheets("Saisie").Range("H19:H40").ClearContents
     
    End If
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Ajoutez la ligne suivante au-dessus de "Choix=vbYes"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application.ScreenUpdating = False
    Cdlt

  3. #3
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 234
    Points : 92
    Points
    92
    Par défaut RE
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,

    Ajoutez la ligne suivante au-dessus de "Choix=vbYes"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application.ScreenUpdating = False
    Cdlt
    Salut,
    J'ai essayé mais ça ne résout pas le problème.

  4. #4
    Membre averti Avatar de Nain porte koi
    Homme Profil pro
    a
    Inscrit en
    Novembre 2023
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : a

    Informations forums :
    Inscription : Novembre 2023
    Messages : 234
    Points : 316
    Points
    316
    Par défaut
    Hello,

    vous pouvez nous donner un fichier d'exemples (sans données confidentielles) ?
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

  5. #5
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 914
    Points : 5 121
    Points
    5 121
    Par défaut
    bonjour
    je crois qu'il y a d'autres procédures qui ralentissent l'exécution du code
    toutefois et pour déterminer la dernière ligne non vide je recommande ce-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set ws = Sheets("Journaux")
    If ws.Range("B5").Value = "" Then
    derligne = ws.Range("A" & Rows.Count).End(xlUp).Row
    Else
    derligne = ws.Range("A" & Rows.Count).End(xlUp).Row + 1
    End If
    il y a une ligne je crois inutile ds votre code avant le if : derligne = WS.Range("B5000").End(xlUp).Row
    aussi tu peux vider les cellule en une seule ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws.Range("G15,D13,D15,E19,E20,E22").ClearContents
    au lieu de
    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
    Range("G15").Value = ""
    Range("G13").Value = ""
    Range("D13").Value = ""
    Range("D15").Value = ""
    Range("E19").Value = ""
    Range("E20").Value = ""
    Range("E21").Value = ""
    Range("E22").Value = ""
    Range("F19").Value = ""
    Range("F20").Value = ""
    Range("F21").Value = ""
    Range("F22").Value = ""
    Range("G19").Value = ""
    Range("G20").Value = ""
    Range("G21").Value = ""
    Range("G22").Value = ""
    Range("H19").Value = ""
    Range("H20").Value = ""
    Range("H21").Value = ""
    Range("H22").Value = ""
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  6. #6
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 234
    Points : 92
    Points
    92
    Par défaut RE
    Citation Envoyé par BENNASR Voir le message
    bonjour
    je crois qu'il y a d'autres procédures qui ralentissent l'exécution du code
    toutefois et pour déterminer la dernière ligne non vide je recommande ce-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set ws = Sheets("Journaux")
    If ws.Range("B5").Value = "" Then
    derligne = ws.Range("A" & Rows.Count).End(xlUp).Row
    Else
    derligne = ws.Range("A" & Rows.Count).End(xlUp).Row + 1
    End If
    il y a une ligne je crois inutile ds votre code avant le if : derligne = WS.Range("B5000").End(xlUp).Row
    aussi tu peux vider les cellule en une seule ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws.Range("G15,D13,D15,E19,E20,E22").ClearContents
    au lieu de
    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
    Range("G15").Value = ""
    Range("G13").Value = ""
    Range("D13").Value = ""
    Range("D15").Value = ""
    Range("E19").Value = ""
    Range("E20").Value = ""
    Range("E21").Value = ""
    Range("E22").Value = ""
    Range("F19").Value = ""
    Range("F20").Value = ""
    Range("F21").Value = ""
    Range("F22").Value = ""
    Range("G19").Value = ""
    Range("G20").Value = ""
    Range("G21").Value = ""
    Range("G22").Value = ""
    Range("H19").Value = ""
    Range("H20").Value = ""
    Range("H21").Value = ""
    Range("H22").Value = ""
    Bonjour
    J'ai essayé vos suggestions mais le problème reste entier.
    J'ai tenté de joindre une pièces mais ça ne passe pas.

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 596
    Points : 34 279
    Points
    34 279
    Par défaut
    Salut,

    quand tu dis trop de temps à s'exécuter, tu parles de quelle durée ? et tu espères l'accélérer jusqu'à quel point ?

    Tu n'es sensé avoir qu'un maximum de 22 occurrences (For ligne = 19 To 40), donc ce n'est pas sensé être long.
    Peux tu nous en dire plus stp ?

    As-tu des formules qui se rafraichissent ?
    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 :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    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

  8. #8
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 362
    Points : 644
    Points
    644
    Par défaut
    Bonjour,
    Et en complément de tout ce qui a été dit précédemment
    • La variable choix doit-être de type VbMsgBoxResult et non pas String (éventuellement de type Long)
    • choix = vbyes est inutile et doit être supprimer
    • Comme vous avez affecté la feuille cible avec WS vous devez affecter la feuille source. Range("G15").Value se réfère à la feuille active, mais il vaut mieux que cela soit explicite.
    • Vérifier qu'aucun code n'est exécuté dans les évènements Worksheet_SelectionChange et Worksheet_Change de la feuille cible sinon désactivez les évènements en tête de procédure CmdValider_Click.
    • Les variables derligne et ligne doivent être de type long. (Préférable avec les nouveaux processeurs)
    • Si les lignes 19 à 40 font parties du détail d'une facture par exemple et serait peu-être plus judicieux de les transformées en tableau.


    Un fichier serait peut-être le bienvenu.
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  9. #9
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 234
    Points : 92
    Points
    92
    Par défaut RE
    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    quand tu dis trop de temps à s'exécuter, tu parles de quelle durée ? et tu espères l'accélérer jusqu'à quel point ?

    Tu n'es sensé avoir qu'un maximum de 22 occurrences (For ligne = 19 To 40), donc ce n'est pas sensé être long.
    Peux tu nous en dire plus stp ?

    As-tu des formules qui se rafraichissent ?
    Oui effectivement j'ai des formules qui se rafraichissent.

  10. #10
    Membre averti Avatar de Nain porte koi
    Homme Profil pro
    a
    Inscrit en
    Novembre 2023
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : a

    Informations forums :
    Inscription : Novembre 2023
    Messages : 234
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par djibysadji Voir le message
    Oui effectivement j'ai des formules qui se rafraichissent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub CmdValider_Click()
    Application.Calculation = xlManual
    ...
    ...
    ...
    Calculate
    Application.Calculation = xlAutomatic
    End Sub
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

  11. #11
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 234
    Points : 92
    Points
    92
    Par défaut RE
    Citation Envoyé par Nain porte koi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub CmdValider_Click()
    Application.Calculation = xlManual
    ...
    ...
    ...
    Calculate
    Application.Calculation = xlAutomatic
    End Sub
    Bonsoir
    Merci. Cela va nettement mieux.

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

Discussions similaires

  1. Optimisation code trop lent
    Par Pynouz dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/02/2013, 14h44
  2. code trop lent
    Par dmoluc dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 17/12/2012, 18h16
  3. Code trop lent à optimiser
    Par deuche dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/10/2011, 16h18
  4. Code trop lent: recuperation de donnees dans un autre classeur
    Par nianko dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/01/2010, 10h43
  5. [Eclipse] Editeur de code trop lent
    Par Benzeghiba dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 10/11/2005, 14h02

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