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 :

Exécution VBA 5 fois plus rapide si on clique en dehors de la fenêtre Excel [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut Exécution VBA 5 fois plus rapide si on clique en dehors de la fenêtre Excel
    Bonjour,

    Un utilisateur m'a soumis ce cas. Une macro met 8 - 10 sec pour s'exécuter et 1,5 sec si on clique en dehors de la fenêtre Excel. Le code est le suivant (tel quel, mais le problème est le même après optimisation) :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    Sub Aplatisseur()
     
      Dim f As String
      Dim pos, Diviseur As Double
     
      f = "SAISIE DONNÉES"
      pos = 2  'la ligne où on écrit dans DATA
     
      Sheets("DATA").Activate
      Rows("2:1000000").Delete
      ActiveSheet.UsedRange
     
      Application.ScreenUpdating = False
      Application.Calculation = xlCalculationManual
      Application.EnableEvents = False
     
      For i = 5 To Sheets(f).Range("C1000000").End(xlUp).Row
     
        Application.StatusBar = "Compilation..." & Round((i / Sheets(f).Range("C1000000").End(xlUp).Row) * 100, 0) & "%"
     
        For j = 26 To 175 'colonnes numériques
     
         'Pour les lignes avec classifications et sans erreur, quand il y a un montant (volume, tarif, $$)
          If Sheets(f).Columns(j).EntireColumn.Hidden = False And _
             Sheets(f).Cells(i, j) <> 0 And Sheets(f).Cells(i, j) <> "" And _
             Sheets(f).Range("FV" & i) <> "" And Sheets(f).Range("FT" & i) = "" Then
     
            Range("V" & pos) = IIf(Sheets(f).Range("Y" & i) = "Flux monétaire", "FLUX MONÉTAIRE", "IMPACT RÉSULTATS") 'Vue
     
            Range("W" & pos) = Sheets(f).Cells(4, j) 'Année du montant
     
            If j >= 26 And j <= 50 Then
              Range("X" & pos) = Sheets(f).Cells(i, j) 'volumes
            End If
     
            If j >= 51 And j <= 75 Then Range("Y" & pos) = Sheets(f).Cells(i, j) 'tarif
     
            If j >= 76 And j <= 100 Then                 'mois projet
              Range("Z" & pos) = "PROJET"
              Range("AA" & pos) = Sheets(f).Cells(i, j)
            End If
     
            If j >= 101 And j <= 125 Then                '$$ projet
              Range("Z" & pos) = "PROJET"
              Range("AB" & pos) = Sheets(f).Cells(i, j)
            End If
     
            If j >= 126 And j <= 150 Then                'mois oper
              Range("Z" & pos) = "OPÉRATIONNEL"
              Range("AA" & pos) = Sheets(f).Cells(i, j)
            End If
     
            If j >= 151 And j <= 175 Then                '$$ oper
              Range("Z" & pos) = "OPÉRATIONNEL"
              Range("AB" & pos) = Sheets(f).Cells(i, j)
            End If
     
           'Récupérer le reste de la ligne
            For k = 4 To 24
              Cells(pos, k - 3) = Sheets(f).Cells(i, k).Value
            Next
     
            Range("C" & pos) = Sheets(f).Range("FV" & i)
     
            pos = pos + 1
     
          End If
     
        Next
     
      Next
     
      Application.Calculation = xlCalculationAutomatic
      Application.ScreenUpdating = True
      Application.EnableEvents = True
     
      Application.StatusBar = ""
     
    End Sub
    Avez-vous jamais rencontré un tel cas ?

    Cordialement.

    Daniel

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    oui j'ai deja vu ca

    screenupdating false fait gagner du temps mais le buffer (tampon )lui est occupé tandis que la fenetre déactivé le buffer doit rester vide

    ca fait comme une sorte de screenupdating=xlveryFalse
    d'ailleur tu le constate aussi quand tu minimise l'application juste avant
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonsoir Patrick,

    Merci de ta réponse. Mais c'est hyper-violent, ça devrait être obligatoire !

    Cordialement.

    Daniel

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    oui je supose que le fait de figer l'ecran avec screenupdating doit manger un peu de ressource si en plus la fenetre est déactivée

    j'ai fait quelques recherche je suis tombé sur certaines explications qui me parraissent logique de mon point de vue

    mais ca remettrait en cause l'utilisation de cette astuce

    en effet selon le PC memoire graphique dédiée ou pas le comportement serait different et pas que pour excel
    a creuser
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    il y avait eu un fil sur ce pb constaté sur excel 2016.
    De mémoire changer le curseur souris en sablier le temps de la macro permettait de retrouver un temps correct, à l'identique que de sortir la souris de la fenêtre (le clic ne semblait pas nécessaire).
    eric

    edit :
    j'ai retrouvé, c'était sur un autre forum.
    En résumé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Cursor = xlWait
    Rétablir avec Application.Cursor = xlDefault

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour eriic
    interessant mais attention au leure masquer le visuel du probleme ne veux pas dire que ca tourne pas en arriere plans il faut verifier avec une macro un peu lourde et un timer
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. Réponses: 34
    Dernier message: 05/01/2011, 09h00
  2. Réponses: 0
    Dernier message: 19/02/2010, 10h13
  3. Réponses: 1
    Dernier message: 09/11/2009, 09h53
  4. MySQL pourrait être 8 fois plus rapide selon une étude de AppsLab
    Par Gordon Fowler dans le forum Actualités
    Réponses: 0
    Dernier message: 06/11/2009, 11h06
  5. Réponses: 14
    Dernier message: 08/01/2009, 10h29

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