XL 2013 Mise à jour UserForm pendant qu'Excel est occupé

TooFatBoy

XLDnaute Barbatruc
Bonjour,

J'ai encore et toujours des questions étranges pour vous. :eek:


J'ai un fichier Excel de deux onglets.

Le 1er onglet n'a que deux colonnes (seule la deuxième de ces deux colonnes m'est utile) qui contiennent des données sur 500 000 lignes. Ces deux colonnes sont au format TEXTE.

J'ai une macro qui fait des copies de groupes de lignes de cette deuxième colonne vers l'autre onglet.
Les données à copier dépendent de certains critères et l'endroit où les copier aussi.

Jusque là pas de problème, j'arrive à obtenir ce que je veux.
Le problème vient du temps d'exécution de la macro pour faire toutes ces copies (plus de 12 000 copies de groupes de lignes + des mises en forme + des MFC).
Ca dure plus de 35 minutes ! Donc pour faire patienter et surtout pour savoir où en est le travail, j'ai eu la génialissime idée de créer un UserForm qui se décrémente. Mais Excel est toujours dans l'état "Ne répond pas" jusqu'à ce qu'il ait terminé le boulot, donc je ne suis pas avancé...

En fait, je vois bien la valeur initiale se décrémenter mais seulement pendant quelques secondes. Après, l'affichage se fige.
J'ai tenté un "REPAINT" du UserForm à chaque fois que je décrémente la valeur, mais ce n'est pas mieux.

Quel est le problème ?
Cela vient-il du fait qu'Excel garde la main et ne la rend pas à Windows qui ne peut donc rafraîchir le UserForm ?
Quelle solution est-elle envisageable ?


Merci par avance à ceux qui pourront m'aiguiller.

PS : je ne peux anonymiser le fichier vu les 500 000 lignes... :(
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Re : Mise à jour UserForm pendant qu'Excel est occupé

Autrement dit, Excel occupe tellement le processeur du PC pendant ces copier/coller que ça bloque le rafraîchissement du UserForm.

Et ça fige aussi le contenu de la fenêtre d'un autre programme qui n'a rien à voir avec Excel...
Mais ça, ce n'est pas grave. Maintenant que je le sais, je fais avec. ;)
 

TooFatBoy

XLDnaute Barbatruc
Re : Mise à jour UserForm pendant qu'Excel est occupé

J'ai exécuté les quatre fonctionnements disponibles, et j'ai constaté qu'avec DoEvents je peux cliquer dans les cellules de la page, alors que sans le DoEvents je ne peux pas.

Du coup, je me dis que je me suis mal expliqué : je ne parle pas d'un affichage modal d'un UserForm.
Quand je dis que l'affichage se bloque, je veux dire que ça fait comme si Excel était planté : le ruban peut devenir tout blanc (ou en partie), et ça fige aussi l'affichage d'un autre programme (il semble figé, mais en réalité il continue de travailler) totalement indépendant d'Excel.
Mais avec votre fichier, que je choisisse avec ou sans UserForm, et avec ou sans DoEvents, jamais l'affichage ne fige de cette façon.
La différence vient peut-être du fait que j'utilise des "copier" et des "coller" et que le buffer qui stocke ces données semble être le presse-papier de Windows et donc commun à tous les programmes.


Je vais commencer par tenter de mettre un doEvents au bon endroit dans mon code.
En suite, je vais essayer de comprendre la totalité de votre code.

Je vous remercie vivement pour ce fichier, et pour vous être penché sur mon problème.



[edit]
Au temps pour moi : avec votre classeur aussi j'ai parfois le même problème d'affichage figé.

Ca vient d'arriver à l'instant et j'ai compris pourquoi ça arrive.
Cela vient d'un autre programme qui tourne en même temps, et qui n'a aucun rapport avec Excel (pas celui qui fige, mais encore un autre programme).

Le programme en question semble prendre "en partie" le focus. Je dis "en partie" parce que sa fenêtre ne passe pas au premier plan et elle ne devient même pas la fenêtre active, mais il fait lever la "Barre des tâches" de windows (et elle reste levée jusqu'à ce que je rende active la fenêtre de ce programme).

Maintenant que je sais pourquoi le rafraîchissement de mon UserForm se fige, je vais voir si le DoEvents peut m'être utile.
[/edit]
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Re : Mise à jour UserForm pendant qu'Excel est occupé

J'ai mis le DoEvents là où ça me semblait le plus logique puis j'ai lancé la macro, et tout fonctionnait à merveille jusqu'à ce que le programme dont je parlais précédemment vienne à nouveau figer l'affichage d'Excel.

Conclusion : d'une part le doEvents semble être utile (pour voir son impact exact il faut que je fasse d'autres tests, sans le programme générateur de problème), et d'autre part le problème ne vient en fait pas d'Excel mais de l'autre programme qui vient mettre le bazar.
Je crois qu'on ne pourra pas faire mieux tant que ce fameux programme tournera en même temps qu'Excel. :(


Merci infiniment MaPomme pour l'aide que vous m'avez apportée.


[edit]
Le DoEvents ralenti un peu la macro, puisqu'elle dure maintenant 32'25" au lieu de 28'38".
[/edit]
 
Dernière édition:

laetitia90

XLDnaute Barbatruc
Re : Mise à jour UserForm pendant qu'Excel est occupé

bonjour tous:):):)

normal que temps plus long

doevents rend la main au systeme exploitation & excel

repaint rafraichi seulement user...

a mon avis c'est ton code qui faut regarder

12 000 copies de groupes de lignes + des mises en forme + des MFC

copier 12000 groupes sans trop de conditions devrait etre assez rapides < a 2 minutes

ESSAYER DE FAIRE UN CODE DANS UN PREMIER TEMPS SANS mises en forme & mfc..... voir temps ????

les mises en formes & mcf peuvent penaliser mais sans exemple code ?????



ideal voir ton code pour optimiser tablo ect...
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Re : Mise à jour UserForm pendant qu'Excel est occupé

Merci pour ta réponse.
Oui, je sais tout ça, et j'ai d'ailleurs déjà réussi à diminuer le temps d'exécution de la macro, puisqu'avant elle durait 40 minutes.

Les MFC, au nombre de seulement 5, ne se font qu'à la fin de la macro, après les copies, et ça ne dure que quelques secondes (moins de 5 secondes), donc ce n'est pas ça qui fait que la macro dure si longtemps.

En fait les copies sont un peu plus nombreuses que ce que j'avais dit car j'avais oublié d'en compter.
De plus, j'ai énormément d'assignations de valeurs à des cellules, du genre Range("A1").Value=Chr(124).
 

Discussions similaires

Réponses
10
Affichages
228

Statistiques des forums

Discussions
312 337
Messages
2 087 392
Membres
103 536
dernier inscrit
komivi