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 évenement dure longtemps, après un copier / coller [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 637
    Par défaut Macro évenement dure longtemps, après un copier / coller
    Bonjour,
    Je travaille sur un planning qui répartit des activités en fonction de certains critères pour un goupe de personnes. Ce travail se fait sur un fichier annexe.
    Le fichier Planning contient une macro évènementielle qui empêche l'écriture de données les jours fériés et les we. Tout cela fonctionne fort bien, mais à la fin, je dois aller copier les activités réparties et les copier dans mon planning.
    Or cette dernière opération dure près de 2 mn, pour moi c'est une éternité
    Il y a près de 3000 cellules à copier coller
    Voici la macro évènement
    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
    ''''''''''''''EMPECHER L ECRITURE LES WE & FERIES
    Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
    Application.ScreenUpdating = False      'Empêche l'actualisation de l'écran
    Application.EnableAnimations = False    'Cache le déroulement => Accélère
    Dim c As Range
    On Error Resume Next
        Static noEvents As Boolean
        If noEvents Then Exit Sub
        Set plg = Intersect(Intersect(Target, [C:AG]), [3:120])
        For Each c In plg
            If Weekday(Cells(3, c.Column), vbMonday) > 5 Or Application.CountIf([FERIES], Cells(3, c.Column)) > 0 Then
                noEvents = True
                c.Value = Empty
                noEvents = False
            End If
        Next c
    On Error Resume Next
    Application.ScreenUpdating = True
    Application.EnableAnimations = True
    End Sub
    Est-ce quelqu'un a une solution pour accéler la chose svp, d'autant que si l'utilisateur s'impatiente et echap, le fichier des activités ne se ferme pas et l'utilisateur ne doit pas le voir et s'il l'enregistre, je perds toutes les formules...
    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Bonjour,

    déjà voir l'intruction On Error Resume Next fait penser à un problème de conception …
    S'il y a des erreurs, forcément cela ne peut aller vite !

    Envisager une conception avec un filtre ou encore un filtre avancé
    Et sans On Error, cela aide à voir les erreurs !

    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  3. #3
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 637
    Par défaut
    Bonjour Marc,
    Merci de ta réponse.
    Je ne maitrise pas bien les modalités de la gestion d'erreur (malgré le tuto http://silkyroad.developpez.com/VBA/...eurs/#LIII-A-3).
    J'ai essayé de les retirer, mais j'ai un message d'erreur sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plg = Intersect(Intersect(Target, [C:AG]), [3:120])
    qui dit "l'élément portant ce nom est introuvable). Je ne suis pas plus avancée.

    Je ne vois pas non plus comment utiliser des filtres ou filtres avancés pour récupérer des données.
    Merci

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,
    cette ligne m'a l'air un peu tirée par les cheveux.

    tu veux assigner à la variable plg l'intersection entre tes cellules modifiées et la zone C3:AG120 ?
    une autre approche pour rester sur ta version ... mais une bonne conception de ta feuille de planning en termes de disposition doit pouvoir éviter ce contrôle évènementiel.

    mais ça je ne peux pas t'aider, nous ne l'avons pas sous les yeux

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Cell As Range
    Dim Plage As Range
     
    Application.ScreenUpdating = False
        Set Plage = Intersect(Target, Cells(3, 1).Resize(120, 33))
        If Not Plage Is Nothing Then
            For Each Cell In Plage.Cells
                If Weekday(Cells(3, Cell.Column), vbMonday) > 5 _
                Or Application.CountIf([FERIES], Cells(3, Cell.Column)) > 0 Then
                    Application.EnableEvents = False
                    Cell.ClearContents
                    Application.EnableEvents = True
                End If
            Next Cell
        End If
    Application.ScreenUpdating = True
     
    End Sub

  5. #5
    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 heu...
    je suis d'accords avec marc

    pour moi c'est plutot un soucis de conception

    tu resize une plage de 120 ligne sur 33 colonne
    pour en tester que la ligne 3
    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

  6. #6
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 637
    Par défaut
    Bonjour Joe et Patrick,
    Merci pour votre aide.

    Patrick, je ne vois pas ce que tu veux dire par
    tu resize une plage de 120 ligne sur 33 colonne, pour en tester que la ligne 3
    Ma procédure fonctionne sur toute la plage, si j'écrits quelque chose un weekend de la lige 100, le texte s'efface.

    Joe, j'ai remplacé ma procédure ci-dessus par la tienne [juste en rectifiant Set Plage = Intersect(Target, Cells(3, 1).Resize(120, 33)) par Set Plage = Intersect(Target, Cells(3, 3).Resize(120, 33))].
    Mais le temps reste exactement le même.
    quand tu dis
    mais une bonne conception de ta feuille de planning en termes de disposition doit pouvoir éviter ce contrôle évènementiel.
    A quoi penses-tu ? As-tu un exemple ?

    Merci

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

Discussions similaires

  1. Macro de recherche suivi d'un copier/coller
    Par Laura-c dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/10/2008, 14h23
  2. déselectionner des cellules après un copier coller
    Par arkorrigan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/06/2008, 17h45
  3. Réponses: 4
    Dernier message: 06/06/2008, 11h24
  4. [VBA-E] Eviter l'affichage de certains messages après un copier/coller
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/03/2007, 18h13
  5. [VB2005]Problème après du copier/coller
    Par cd090580 dans le forum Visual Studio
    Réponses: 1
    Dernier message: 06/12/2006, 20h45

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