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 :

procédure trop lente


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 19
    Points : 14
    Points
    14
    Par défaut procédure trop lente
    Bonjour,

    Voici 2 procédures :

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    Sub GestionCaseTest()
     
    ' déclaration de variables
     
    Dim equipe As String
    Dim unite As Integer 
    Dim var1 As Integer 'numero de ligne
    'Dim ligne As Variant
    Dim compt As Integer
    Dim feuille As Worksheet
    Dim temps_debut As Single
    Dim duree As Single
    temps_debut = Timer
    Set feuille = ThisWorkbook.Worksheets("Tableau")
    Dim ArrayTableau() As String
    Dim indice As Integer
    indice = 0
    Dim i As Integer
    Dim a As Integer
     
    ' améliorer vitesse d'excécution
    Dim ecran As Boolean, statutbarre As Boolean, even As Boolean
    ecran = Application.ScreenUpdating '= False
    statutbarre = Application.DisplayStatusBar '= False
    even = Application.EnableEvents '= False
    ' je mets tout sur OFF
    Application.ScreenUpdating = False
    Application.DisplayStatusBar = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
     
    ' initialisation variables
    unite = Worksheets("Data").Range("AC6").Value
    equipe = Worksheets("Data").Range("S6").Value
     
    If unite = 1 Then '
     Worksheets("Tableau").Select
     Worksheets("Tableau").Activate
     Select Case equipe
     
        Case 1
     
            Worksheets("Tableau").Rows("12:510").Hidden = True
            For compt = 12 To 510
                If Cells(compt, 2).Value = "O" Or Cells(compt, 3) = "Nord" Then
                    indice = indice + 1
                    ReDim Preserve ArrayTableau(indice)
                    ArrayTableau(indice) = compt
                End If
            Next compt
     
            ' afficher ArrayTableau
            For i = 1 To indice
                a = ArrayTableau(i)
                Worksheets("Tableau").Rows(a).Hidden = False
            Next i
     
            '----------------------------
     
     
        Case 2
            feuille.Rows("12:510").Hidden = True
     
     
            For compt = 12 To 510
                If feuille.Cells(compt, 4) = "Sil" Then
                    'feuille.Rows(compt).Hidden = True
                    indice = indice + 1
                    ReDim Preserve ArrayTableau(indice)
                    ArrayTableau(indice) = compt
                End If
            Next compt
     
            ' afficher ArrayTableau
            For i = 1 To indice
                a = ArrayTableau(i)
                Worksheets("Tableau").Rows(a).Hidden = False
            Next i
     
            'afficher et afficher la durée d'excucution :
            duree = Timer - temps_debut
            Worksheets("Tableau").Range("G2") = duree
            '----------------------------
            'résultats équipe
            Worksheets("Tableau").Rows("512:580").Hidden = True
            Worksheets("Tableau").Rows("512:515").Hidden = False
            Worksheets("Tableau").Rows("531:535").Hidden = False
            'afficher et afficher la durée d'excucution :
            duree = Timer - temps_debut
            Worksheets("Tableau").Range("G3") = duree
     
        Case 3
            feuille.Rows("12:510").Hidden = True
     
     
            For compt = 12 To 510
     
     
                If feuille.Cells(compt, 4) = "EM" Then
                    indice = indice + 1
                    ReDim Preserve ArrayTableau(indice)
                    ArrayTableau(indice) = compt
                End If
            Next compt
            ' afficher ArrayTableau
            For i = 1 To indice
                a = ArrayTableau(i)
                Worksheets("Tableau").Rows(a).Hidden = False
            Next i
            ' afficher et afficher la durée d'excucution :
            duree = Timer - temps_debut
            Worksheets("Tableau").Range("G2") = duree
            '----------------------------
     
            'afficher et afficher la durée d'excucution :
            duree = Timer - temps_debut
            Worksheets("Tableau").Range("G3") = duree
     
     
        Case Else '"tous les autres cas"
            MsgBox ("voir GestionCasautrecas")
            Exit Sub
     
     End Select
     
     '
     
     
     
    End If
     
     
     
    ' je restaure
    Application.ScreenUpdating = ecran
    Application.DisplayStatusBar = statutbarre
    Application.EnableEvents = even
    Application.Calculation = xlCalculationSemiautomatic
     
     
    End Sub
    Tout d'abord, cette procédure fonctionne correctement et j'obtiens mon affichage en moins d'1 seconde.

    Si par contre je lance la procédure suivante puis à nouveau celle que je viens de présenter, l'affichage devient hyper lent (jusqu'à 40 ou 50 secondes) en fonction de l'ordinateur utilisé. Bizarrement ce n'est pas l’ordinateur le mieux équipé qui est le plus rapide. Bien au contraire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub imprimer_global()
     
        ThisWorkbook.Worksheets("Tableau").PageSetup.PrintArea = "$E$9:$AH$572"
        ThisWorkbook.Worksheets("Tableau").PrintPreview
     
     
     
    End Sub
    Je ne comprends pas pourquoi. Pour moi ces 2 procédures sont complétement indépendantes.

    Merci à qui pourra m'éclairer.

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Bizarrement ce n'est pas l’ordinateur le mieux équipé qui est le plus rapide. Bien au contraire...
    tant de facteurs peuvent entrer en jeu ... !
    parmi lesquels et dans l'ordre :
    - la mémoire propre à l'imprimante. Elevée et libre, elle libère tout (si suffisante) ou partie (si moins élevée) - et alors partie par partie - de celle qu'occupent en mémoire/machine les octets à imprimer.
    - l'état du spooler d'impression
    - la configuration du fichier de pagination du système (qui intervient si débordement de mémoire virtuelle)
    etc .. etc ...

    Tant que les octets que tu veux imprimer n'ont pas tous été traités (envoyés au spooler), tes instructions ne libèrent pas la mémoire occupée par les octets dont tu as demandé l'impression, mais - aussi et surtout - provoquent l'impossibilité de modifier les données qu'elles n'ont pas fini d'envoyer au spooler.

    La mémoire propre de l'imprimante est sans aucun doute de la plus haute importance. Elle est (analogie) aussi importante que l'est la qualité des hauts-parleurs en matière de fidélité. Le matériel le plus fidèle et sophistiqué utilisé en amont n'est d'aucune efficacité si ce qu'il y a en aval est limité en matière de fidélité.

    EDIT : tu peux également envisager d'imprimer en postscrip -->> vidage vers un fichier d'impression en lieu et place de l'imprimante directement, puis d'utiliser ce postscript. A condition toutefois que ton imprimante soit compatible et puisse l'interprêter (il est devenu rare que tel ne soit pas le cas).
    Ce procédé permettra à tes procédures de "reprendre la main" beaucoup plus rapidement qu'elles ne pourraient le faire avec une imprimante dont la mémoire interne est faible.
    Tout cela ne relevant pas vraiment de connaissances VBA, il conviendrait, pour plus d'explications, que tu ouvres une discussion dans le forum approprié.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    et merci pour ces éléments de réponse.

    Dans le script que j'ai donné précédemment, peut-on vraiment parler de mémoire propre à l'imprimante ou d'état du spooler d'impression puisque je n'utilise que printpreview?

    Si c'est le cas existe t'il une possibilité pour vider la mémoire utilisée avant de quitter la procédure d'impression (ou plutôt la procédure permettant d'afficher l'aperçu). J'ai envisagé d'utiliser des objets VBA mais je ne sais comment faire.

    Sur quel forum me conseilles-tu de poster ce message ?

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    puisque je n'utilise que printpreview
    Ton imprimante est alors en effet hors de cause
    Restent les autres causes que j'ai évoquées + (sans en être totalement certain) les performances de la carte graphique et/ou de la manière dont Excel la gère.

    Quelle est ta version Office ?
    (je te pose cette question car il me semble me souvenir que j'ai lu un jour quelque part que quelques problèmes "Printpreview" existaient avec la version 2010.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Si une propriete de l'objet PageSetup a ete modifiee, par exemple en utilisant PrintPreview, il est recommande de désactiver l'affichage des sauts de page . Ce qui peut etre fait en ajoutant la ligne de code suivante au debut de votre macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Tableau").DisplayPageBreaks = False
    EDIT: Désactiver l'affichage des sauts de page est important surtout avant de supprimer des lignes.

    https://support.microsoft.com/en-ie/...sible-in-excel
    Cordialement

    Docmarti.

Discussions similaires

  1. [XL-2010] Procédure trop lente
    Par MatthieuT42 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/06/2015, 10h19
  2. Convolution trop lente...
    Par progfou dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 05/08/2006, 11h44
  3. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35
  4. [SAGE] ODBC trop lent
    Par tileffeleauzed dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/11/2004, 09h56
  5. Envoi de mail trop lent
    Par MASSAKA dans le forum ASP
    Réponses: 3
    Dernier message: 15/10/2004, 10h57

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