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 :

Procedure trop longue


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 34
    Par défaut Procedure trop longue
    Bonjour a tous!

    Je souhaiterai comprendre pourquoi ce petit bout de code met aussi longtemps a s'executer et du coup l'ameliorer si possible!
    Il faut savoir que je mets dans la colonne A environ 11000 dates (que je copie/colle d'un autre fichier generalement)

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
    Dim LastLine As Long
    LastLine = Range("a65536").End(xlUp).Row
     
    For i = 6 To LastLine
        If Not Application.Intersect(Target, Cells(i, 1)) Is Nothing Then
            Cells(i, 2).Value = Year(Cells(i, 1).Value)
            Cells(i, 3).Value = Month(Cells(i, 1).Value)
            Cells(i, 4).Value = Day(Cells(i, 1).Value)
        End If
    Next i
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    End Sub
    Merci beaucoup de votre aide!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Si tu ne parcours que les lignes qui ont été modifiées ça devrait être plus rapide:
    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
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
      Application.EnableEvents = False
     
      Dim C As Range
     
      For Each C In Target.Cells.Rows
        If C.Row > 5 Then
          Cells(C.Row, 2).Value = Year(Cells(C.Row, 1).Value)
          Cells(C.Row, 3).Value = Month(Cells(C.Row, 1).Value)
          Cells(C.Row, 4).Value = Day(Cells(C.Row, 1).Value)
        End If
      Next C
     
      Application.EnableEvents = True
     
    End Sub
    Et il faut désactiver les événements sinon ton code tourne en boucle.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    Je n'ai pas du tout testé mais comme tu change les valeurs dans les cellules sur l'évènement "Change", cette proc évènementielle est appelée à chaque fois. Si tu mets "Application.ScreenUpdating = False" ceci va donc accélérer la proc :
    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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
        Application.EnableEvents = False
     
        Dim LastLine As Long
     
        LastLine = Range("a65536").End(xlUp).Row
     
        For i = 6 To LastLine
     
            If Not Application.Intersect(Target, Cells(i, 1)) Is Nothing Then
     
                Cells(i, 2).Value = Year(Cells(i, 1).Value)
                Cells(i, 3).Value = Month(Cells(i, 1).Value)
                Cells(i, 4).Value = Day(Cells(i, 1).Value)
     
            End If
     
        Next i
     
        Application.ScreenUpdating = True
        Application.Calculation = xlCalculationAutomatic
        Application.EnableEvents = True
     
    End Sub
    Hervé.

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 34
    Par défaut
    Merci beaucoup Theze! Je ne connaissais pas cette petite manoeuvre mais je sens qu'elle va pas mal me servir! Ca me convient tout a fait!

    PS : je changeais l'integralite des lignes d'un coup vcottineau...

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Je viens de voir à l'instant que j'ai fais une erreur en faisant le copier/coller, je voulais parler de "Application.EnableEvents = False" et bien évidemment pas de "Application.ScreenUpdating = False"

    Hervé.

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

Discussions similaires

  1. Ligne de code trop longue !!!
    Par botcharoff dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/09/2005, 08h59
  2. Erreur ORA-01704 : constante de chaine trop longue
    Par verrec_s dans le forum Oracle
    Réponses: 22
    Dernier message: 13/12/2004, 15h30
  3. [TP]Probleme de ligne trop longue
    Par poppels dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 24/09/2004, 06h36
  4. chaine trop longue pour envoyer en socket?
    Par jeje.r dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/06/2003, 16h36

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