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 éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    245
    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 : 245
    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 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    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 éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    245
    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 : 245
    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 Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 203
    Par défaut
    Hello,

    vous pouvez nous donner un fichier d'exemples (sans données confidentielles) ?

  5. #5
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    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 974
    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 = ""

  6. #6
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    245
    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 : 245
    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
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    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 682
    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 :
    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
    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

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

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

    Informations forums :
    Inscription : Janvier 2016
    Messages : 509
    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.

  9. #9
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    245
    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 : 245
    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 Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 203
    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

  11. #11
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2019
    Messages
    245
    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 : 245
    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