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 :

[VBA-E] Liaisons qui ne se mettent pas à jour (macro trop rapide?)


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut [VBA-E] Liaisons qui ne se mettent pas à jour (macro trop rapide?)
    Bonjour,

    j'ai un fichier excel qui se compose d'une liste d'individus appartenant à 6 groupes différents ainsi que de toute une série de graphiques et de tableaux.

    1- J'ai créé un petit menu déroulant qui permet de sélectionner un groupe sur les 6 dans la feuille 'INDEX',
    2- le nom du groupe choisi apparait dans une cellule 'CONFIG_DATAS!B2',
    3- cette cellule est ensuite dupliquée dans tous les graphiques ainsi que dans tous les tableaux avec une liaison simple '=CONFIG_DATAS!B2' dans une cellule (en général A2) ou dans une zone de texte (pour les graphiques),
    4- j'ai un bouton dans la feuille 'INDEX' qui lance une macro,
    5- cette macro sert principalement à lancer un filtre élaboré sur la feuille 'GROUPE' sur la base du critére "nom du groupe" pour ne sélectionner que les individus appartenant à ce groupe et les copier un peu plus bas sur la feuille (ligne 1322),
    6- tous les titulaires concernés sont ensuite rapatriés dans une dizaine de tableaux en liaison directe,
    7- la macro effectue un autre filtre sur tous ces tableaux pour éliminer toutes les lignes vides.


    Tout marche trés bien sauf qu'une fois sur 2, une liaison par ci par là ou un filtre élaboré ne se met pas à jour...

    Est-ce un problème de mémoire, de macro mal défini, de limitation excel ou quoi?


    Merci d'avance de votre aide.

    Ci-joint, le code macro utilisé :

    Sub selection_groupe()
    '
    Sheets("GROUPE").Select
    Range("A2").Select

    'le If ne sert qu'à copier directement tous les titulaires sur les lignes 1322 et suivant si l'option "TOUS GROUPES" est sélectionné
    If ActiveCell.Value = ("TOUS GROUPES") Then
    ActiveSheet.ShowAllData
    Rows("1322:3000").Select
    Selection.ClearContents
    Rows("5:5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    ActiveWindow.SmallScroll Down:=17
    Rows("1322:1322").Select
    ActiveSheet.Paste

    'sinon, on fait un filtre élaboré sur la feuille et on colle les individus concernés sur les lignes 1322 et suivant
    Else
    Range("A4").Select
    Range("A4:N1310").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Range("A1:A2"), Unique:=False
    Rows("1322:3000").Select
    Selection.ClearContents
    Range("A4:N1310").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
    ("A1:A2"), CopyToRange:=Range("A1321:N1321"), Unique:=False
    End If

    'une fois fait, on fait des filtres sur toutes les feuilles qui sont en liaison avec les lignes 1322 et suivant de la feuille GROUPE pour virer les lignes vides
    Sheets("DOSSIER1").Select
    Range("A7:Q1313").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Range("B1:B2"), Unique:=False

    Sheets("DOSSIER2").Select
    Range("A7:Q1313").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Range("B1:B2"), Unique:=False

    Sheets("DOSSIER3").Select
    Range("A7:L1313").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Range("B1:B2"), Unique:=False

    Sheets("DOSSIER4").Select
    Range("A7:Q1313").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Range("B1:B2"), Unique:=False

    Sheets("INDEX").Select

    End Sub

  2. #2
    Tan
    Tan est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Points : 158
    Points
    158
    Par défaut
    C'est genre de truc qui n'est pas facile à débogguer:

    Je te conseille donc de réduire ton code, où d'y inséer des debug.print pour faire des tests (par exemple le nombre de lignes masquer, pour voir si ton filtre, filtre des élément où pas)

    Exécute en mode pas à pas (mais si tu pense que c'est parce que la macro est trop rapide, du coup en pas à pas ça prend beaucoup plus son temps, et tu ne devrait jamais avoir l'erreur, donc ce test n'est peut être pas adapté


    Je te conseille plutôt de simplifié le code: test d'abord ta macro sans filtrer et filtre en conséquent sur une feuille seulemenet.
    Si marche marche bien, filtre sur plusieurs feuille, si ça marche bien. le code en récupérant tous les groupe est bon.
    Refait ton code en ne filtrant que certain groupe en particulier, et en reportant que sur une feuille.

    Donc, méthode, tu vire tout, et tu ajoute petit à petit pour voir ce qui pose problème.


    Sinon, tu peut essayer un doEvents pour que vb laisse la main à tout ce qui doit être traiter

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Sinon, tu peut essayer un doEvents pour que vb laisse la main à tout ce qui doit être traiter
    J'allais proposer ça, en le plaçant entre chaque sheet (sans garantie)
    Sinon, as-tu essayé Application.screenUpdating = false avant de lancer ta macro ?
    Libère le µp de l'affichage.
    Tu le mets à true après (!)

    A+

  4. #4
    Tan
    Tan est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Points : 158
    Points
    158
    Par défaut
    Application.screenUpdating = false va lui accélérer sa macro, car il y a des filtre et des select, ce qui est très bien, mais je ne vois pas en quoi ça résoudrai son problème.

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Si, étant donné les select, le ralentissement devrait être suffisant. en supprimant le rafraichissement de l'affichage, tu libères le µp d'une tâche et lui laisse le temps de traiter "l'autre"... C'est sans doute discutable, mais je le vois comme ça. Il peut toujours essayer, ça ne coûte rien et si ça marche, toi et moi aurons la réponse...
    Comme tu vois, je ne suis sûr de rien.
    Enfin, souvent, de la discution jaillit la lumière...

    Je compte sur toi, minikisskool, pour nous tenir au courant.
    Si ça ne marche pas, et si tu es sûr que le problème provient de la rapidité d'exécution de ta macro, il restera toujours la possibilité de mettre une temporisation entre chaque feuille... (?)

    A+

  6. #6
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    euuuuh

    merci pour vos réponses

    j'ai juste oublié de préciser une chose : ces macros ont été bricolées avec l'enregistreur de macro, je n'y connais pas grand chose en VBA (juste quelques bases)

    donc, je ne sais pas trop quoi nettoyer pour que ce soit plus rapide et je ne sais pas du tout me servir des debug.print, Application.screenUpdating ou autre

    en fait, je pense que mon fichier et/ou mes macros sont trop lourdes

    il y a 1300 titulaires environ qui sont copiés en liaison sur 4 ou 5 feuilles, ça fait donc un paquet de cellules en liaison
    j'ai tout mis en liaison parce que je trouvais ça plus simple à construire via excel que via VBA

    et 50% du code de la macro (tout le début) ne sert qu'à gérer la situation où je choisis d'afficher tous les groupes (donc tout le monde) en même temps
    et comme tous mes tableaux sont en liaison sur 1500 lignes et que certains groupes ne sont composés que d'une centaine de titulaires, la fin de la macro masque les lignes vides pour qu'à l'impression, il n'y ait pas 30 feuilles d'imprimées (dont 29 vides)

    peut-être vaut-il mieux que je remplace mes cellules en liaison par des copier-coller via VBA? ou peut-être puis-je rajouter un bout de code qui vérifie que les liaisons se sont mises à jour (genre un rafraichissement)? ou alors effectivement, mettre des tempo entre chaque opération?

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    De mon point de vue, ce n'est pas un problème de rapidité de tes macros. Cet aprem, je jète un coup d'oeil à ton code... Là, tout de suite, je vais me restaurer...

    A tout'

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Déjà un truc :

    Quand tu fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Rows("5:5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Tu sélectionnes jusqu'à la ligne 65535. Est-ce bien ce que tu veux faire ?

    Je poursuis ma lecture...

    A tout'

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Ensuite - on voit que tu as enregistré ta macro... c'est bien - mais tu as des lignes inutiles

    ActiveWindow.SmallScroll Down:=17
    tu peux supprimer

    Ensuite, j'avais pas vu... quand tu fais ça,

    Rows("5:5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Non seulement tu sélectionnes jusqu'à la ligne 65535 mais tu sélectionnes les 256 colonnes... Tu es sûr que c'est nécessaire ?

    Je t'envoie déjà ça

    A+

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Pour le reste, si on veut t'aider, il faudrait nous donner la structure de tes feuilles (nombre de colonnes par exemple)
    Et puis, une chose qui peut t'intéresser : si tes données commence en A1, avant copie, Selection.currentRegion te fournit la plage renseignée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Cells(1, 1).Select
    MaPlage = ActiveCell.CurrentRegion.Address
    MsgBox MaPlage
    Précaution : Pas de ligne ni de colonne entièrement vide dans la plage.
    (Un tri sur une colonne évite les lignes vides mais pas les colonnes)
    Par contre, une fois la plage connu, le copier ne pose pas de problème, quant au Coller, il suffit que tu sélectionnes le cellule de la première ligne de la première colonne ou tu désires placer la copie pour faire ".paste". Pas besoin de sélectionner la plage.

    Ex : A la place de
    Rows("1322:1322").Select
    ActiveSheet.Paste
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Cells(1, 1).Select
    MaPlage = ActiveCell.CurrentRegion.Address
    Range(MaPlage).Copy
    Cells(1322, 1).Select
    ActiveSheet.Paste
    Juste pour voir.

    Avec ce code, tu copies en même temps les lignes 1 à 4 et comme je ne pense pas que tu souhaites coller ces lignes, tu corriges la plage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Cells(1,5).select
        DernièreLigne = Selection.CurrentRegion.End(xlDown).Row
        DernièreColonne = Selection.CurrentRegion.End(xlToRight).Column
        MaPlage = "A5:"+ Cells(DernièreLigne,DernièreColonne).address
        Range(MaPlage).Copy
        Cells(1322, 1).Select
        ActiveSheet.Paste
    Tu peux éviter les variables DernièreLigne et DernièreColonne, j'ai pis ça pour que ce soit plus clair. Ce qui donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        MaPlage = "A5:"+ Cells(Selection.CurrentRegion.End(xlDown).Row, _
              Selection.CurrentRegion.End(xlToRight).Column).address
        Range(MaPlage).Copy
        Cells(1322, 1).Select
        ActiveSheet.Paste
    Tu vois et tu nous dis

    A+

  11. #11
    Membre habitué
    Inscrit en
    Novembre 2005
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 130
    Points : 166
    Points
    166
    Par défaut
    Salut ouskel'n'or

    Il y a encore plus clair je pense.
    Si tu ne connais pas essaye ceci !

    Si la liste commence en A5 et pas de ligne vides comme tu l'a precisé

    Et si l'on ne veut pas selectionner les 5 premières lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Set Maplage = Range("A1").CurrentRegion
    Set Maplage = Maplage.Offset(5, 0).Resize(Maplage.Rows.Count - 5, Maplage.Columns.Count)
    Maplage.Select
    Qu'en penses-tu ?

    @+

  12. #12
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    voilà, tous ces trucs de Rows machin, c'est pour sélectionner et copier mes infos titulaires qui sont à la base sur la feuille "GROUPE" sur la zone A5:N1310

    donc non, je n'ai pas besoin de copier les colonnes O et suivant

    par contre, comme la sélection à copier dépend d'un 1er filtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("A4:N1310").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ 
    Range("A1:A2"), Unique:=False
    je ne veux copier-coller que les lignes filtrées et là, ça ne va pas jusqu'à 65535, ça s'arrête à la dernière ligne pleine, soit la ligne 1310

    enfin bref, avec le code que vous avez indiqué, ça sélectionne bien la zone A5:N1310 (filtre inclus) et ça la colle dans la même feuille sur la cellule A1322?

  13. #13
    Membre habitué
    Inscrit en
    Novembre 2005
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 130
    Points : 166
    Points
    166
    Par défaut
    Salut minikisskool,

    Pourquoi faire un filtre sur place plutot que dans une zone d'extraction qui commencerai en A1332.
    Tu ne serais plus obligé de faire un copier coller

    @+

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    enfin bref, avec le code que vous avez indiqué, ça sélectionne bien la zone A5:N1310 (filtre inclus) et ça la colle dans la même feuille sur la cellule A1322?
    Oui, en effet mais bouley a raison, tu peux effectuer un filtre hors place.

    Quant à la sélection d'une plage, bouley, il y a 36 manières, on peut aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("A5:"+ Cells(Selection.CurrentRegion.End(xlDown).Row, _ 
              Selection.CurrentRegion.End(xlToRight).Column).address).Copy
    ce qui évite d'avoir à la sélectionner et accélère la procédure...
    La sélection, c'est pratique, on sait où on est, mais ça alourdit

    A+

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Une précision :
    Quand tu effectues un filtre élaboré ou non, Currentregion ne sélelectionne que le résultat du filtre mais à partir de la ligne 1

    Je pense que là était ta question.

    A+

  16. #16
    Membre habitué
    Inscrit en
    Novembre 2005
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 130
    Points : 166
    Points
    166
    Par défaut
    Salut ouskel'n'or

    Pour répondre a :
    " La sélection, c'est pratique, on sait où on est, mais ça alourdit"

    Il suffit de faire Maplage.copy au lieu de Maplage.select

    Mais cela tu le sais !
    Le select etait la juste pour l'exemple !

    @+

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Excuse, Bouley, je sais que je répondais à quelque chose mais je ne sais plus à quoi... Mais bien sûr, ta méthode est la meilleure... sans le select...

    A+

    Salut Bouley,

    Tu sais où il est minikisskool ? Je crois qu'il s'est perdu
    Enfin, si tu le vois, fais-moi signe parce que la dernière fois que je l'ai vu il avait un problème...

    A+

Discussions similaires

  1. Index de formule qui ne se mettent pas à jour
    Par invivus dans le forum Excel
    Réponses: 1
    Dernier message: 22/11/2013, 15h37
  2. Formules qui ne se mettent pas à jour
    Par ANOVA dans le forum Excel
    Réponses: 5
    Dernier message: 08/04/2011, 09h09
  3. Réponses: 2
    Dernier message: 27/05/2008, 09h30
  4. [MySQL] Valeurs qui ne se mettent pas à jour dans un template
    Par divad dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/12/2007, 15h26
  5. [VBA-E] Fonction qui ne se recharge pas
    Par iupien78 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/01/2007, 21h23

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