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 :

Macro qui ralentit [XL-2000]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de TomDuBouchon
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2009
    Messages
    3 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 343
    Par défaut Macro qui ralentit
    Bonjour,

    Je me tourne vers vous car j'ai un souci avec une macro. Le but de celle-ci est simplement d'afficher et masquer des lignes en fonction de la présence de données dans certaines cellules.
    En elle-même, elle fonctionne très bien et, au début, elle fonctionnait rapidement (qq secondes), mais maintenant, elle met près de 3mn à tourner alors qu'elle est franchement basique. Je vous laisse en juger :

    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
    Private Sub Workbook_Open()
    Dim i As Long
    i = 3
    Do While i <= 89
    ThisWorkbook.Sheets("ACTIVITE COMMERCIALE").Cells(i, 1).EntireRow.Hidden = False
    i = i + 1
    Loop
    i = 3
    Do While i <= 29
    If ThisWorkbook.Sheets("ACTIVITE COMMERCIALE").Cells(i, 1).Value = "" Then
        ThisWorkbook.Sheets("ACTIVITE COMMERCIALE").Cells(i, 1).EntireRow.Hidden = True
    End If
    i = i + 1
    Loop
    i = 33
    Do While i <= 59
    If ThisWorkbook.Sheets("ACTIVITE COMMERCIALE").Cells(i, 1).Value = "" Then
        ThisWorkbook.Sheets("ACTIVITE COMMERCIALE").Cells(i, 1).EntireRow.Hidden = True
    End If
    i = i + 1
    Loop
    i = 63
    Do While i <= 89
    If ThisWorkbook.Sheets("ACTIVITE COMMERCIALE").Cells(i, 1).Value = "" Then
        ThisWorkbook.Sheets("ACTIVITE COMMERCIALE").Cells(i, 1).EntireRow.Hidden = True
    End If
    i = i + 1
    Loop
    End Sub
    Je ne m'explique pas pourquoi elle est devenue si lente. Aucune modification n'a été apportée sur ce fichier. La seule modification de près ou de loin est que le répertoire dans lequel il se trouve a été sécurisé : Il n'est plus en accès public mais je suis désormais le seul autorisé (en sus des administrateurs) à pouvoir le visualiser et le modifier.

    A noter que la première instruction, sur laquelle il n'y a pas de condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Do While i <= 89
    ThisWorkbook.Sheets("ACTIVITE COMMERCIALE").Cells(i, 1).EntireRow.Hidden = False
    i = i + 1
    Loop
    met déjà plus d'une minute à touner

    Si quelqu'un a une idée...

    Merci d'avance
    Pensez à consulter les FAQs BI, les Tutoriels BI et à effectuer des Recherches.
    Un message vous a aidé ? Votez en cliquant sur
    Votre problème est résolu ? Merci de l'indiquer en cliquant sur le bouton

  2. #2
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    As-tu réessayé de mettre une copie du fichier sur un répertoire normal et voir si la vitesse redevient normale, ça te donnera déjà la raison ou non de la cause à rechercher...

    Pour ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Do While i <= 89
    ThisWorkbook.Sheets("ACTIVITE COMMERCIALE").Cells(i, 1).EntireRow.Hidden = False
    i = i + 1
    Loop
    la boucle est inutile, vois directement du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ....Range("A3:A88").EntireRow.Hidden = False
    cordialement,

    Didier

  3. #3
    Rédacteur
    Avatar de TomDuBouchon
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2009
    Messages
    3 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 343
    Par défaut
    Bonjour Ormonth,

    Tout d'abord, merci pour la première instruction, c'est vrai que c'est plus simple et à l'exécution c'est instantané. Je gagne donc au moins ça.

    Pour ce qui est des droits, le problème c'est que les cellules sur lesquelles sont effectuées les tests sont alimentés par d'autres fichiers excel. Il faut donc que je vois avec l'administrateur réseau pour qu'il repasse le dossier en public.

    Je fais donc ça, je teste et je reviens sur le forum.
    Pensez à consulter les FAQs BI, les Tutoriels BI et à effectuer des Recherches.
    Un message vous a aidé ? Votez en cliquant sur
    Votre problème est résolu ? Merci de l'indiquer en cliquant sur le bouton

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Bonjour,
    avec ça tu vas aussi gagner beaucoup de temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_Open()
    Application.ScreenUpdating = False
     
    ... ton code
     
    Application.ScreenUpdating = True
    End Sub

  5. #5
    Rédacteur
    Avatar de TomDuBouchon
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2009
    Messages
    3 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 343
    Par défaut
    Bonjour,

    J'aurais dû précisé que j'avais déjà testé cette option... Sans succès.

    Mais merci pour cette proposition.
    Pensez à consulter les FAQs BI, les Tutoriels BI et à effectuer des Recherches.
    Un message vous a aidé ? Votez en cliquant sur
    Votre problème est résolu ? Merci de l'indiquer en cliquant sur le bouton

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    Bonjour

    En passant par un tableau et en faisant le hidden=false et hidden=true d'un coups et non un par un tu devrais gagner beaucoup de temps.

    je l'ai testé et c'est instantané
    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
     
    Private Sub Workbook_Open()
    Dim tab1() As Variant, plage As Range, i As Long
    Rows("1:89").EntireRow.Hidden = False
    With ThisWorkbook.Sheets("ACTIVITE COMMERCIALE")
      tab1 = .Range("A1:A89").Value
      For i = LBound(tab1) To UBound(tab1)
        If (i > 2 And i <= 29) Or (i > 32 And i <= 59) Or (i > 62 And i <= 89) Then
          If tab1(i, 1) = "" Then
            If plage Is Nothing Then
              Set plage = .Cells(i, 1)
            Else
              Set plage = Union(plage, .Cells(i, 1))
            End If
          End If
        End If
      Next
      .Range(plage.Address).EntireRow.Hidden = True
    End With
    End Sub

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

Discussions similaires

  1. Réaliser une macro qui enregistre le résultat d'une requête
    Par boulette85 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 22/02/2007, 18h36
  2. Macro qui ne s'exécute pas dans formulaire
    Par picatchou dans le forum Access
    Réponses: 10
    Dernier message: 18/09/2006, 17h27
  3. [VBA-E] Macro qui confond "1" et "11"
    Par SybVicious dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/08/2006, 17h03
  4. [VBA-E] macro qui se lance avec un commandbutton
    Par ricachu dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/07/2006, 09h52
  5. [Access 2003] Macro qui fait planter Access
    Par nuriel2 dans le forum Access
    Réponses: 5
    Dernier message: 10/05/2006, 14h00

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