DoEvents Explication ?

WILFRIED

XLDnaute Impliqué
Bonjour à Tous (Toutes),

J'ai retrouver dans les archives des programmes télécharger sur ce forum une progressbar de THIERRY qui utilise la fonction DoEvents et un controle progressbar.

J'ai deux souci avec cette progressbar :

- Je ne peu pas l'insérer dans mon prog (Excel me dit qu'il n'est pas enregistrer)....

- Cet USF utilise la fonction DoEvents, je vois ce qu'elle fait mais je ne la comprend pas :
- Où placer l'instruction,
- Doit elle être associé à un autre Doevents,
-etc...

A+
 

MichelXld

XLDnaute Barbatruc
bonjour Wilfried

ci dessous un copier coller de l'aide en ligne Excel , concernant DoEvents


pour résumer
permet d'attendre qu'une action soit totalement terminée avant de poursuivre la procedure


*************************

Arrête momentanément l'exécution afin que le système d'exploitation puisse traiter d'autres événements.

Syntaxe

DoEvents( )

Remarques

La fonction DoEvents renvoie une valeur de type Integer représentant le nombre de feuilles ouvertes dans les versions autonomes de Visual Basic (Visual Basic Édition professionnelle, par exemple). DoEvents renvoie un zéro dans toutes les autres applications.

DoEvents passe la main au système d'exploitation jusqu'à ce que ce dernier ait terminé de traiter les événements de sa file d'attente et que tous les codes de la file d'attente SendKeys aient été transmis.

La fonction DoEvents est particulièrement indiquée pour les opérations simples que l'utilisateur veut annuler juste après les avoir lancées, comme par exemple la recherche d'un fichier. Pour les opérations nécessitant une exécution plus longue, l'opérateur pourra plus aisément rendre la main au processeur s'il a recours à un contrôle Timer ou à un composant EXE ActiveX. Dans ce cas, la tâche s'effectue de manière complètement indépendante, hors de votre application, le système d'exploitation gérant à la fois le multitâche et le partage du temps.

Attention Lorsque vous rendez la main de manière temporaire à votre processeur dans une procédure d'événement, veillez à ce que la procédure ne soit pas exécutée à nouveau par une autre portion de votre programme, avant que le résultat du premier appel ne soit renvoyé ; cette situation peut avoir des conséquences inattendues. En outre, n'utilisez pas DoEvents s'il existe un risque d'interaction imprévisible entre d'autres applications et votre procédure pendant que l'exécution est suspendue.



bonne journée
MichelXld
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour cher Ami José, Michel, Wilfried

TIens en buvant mon BarbaCafé j'ai fouillé mon sac à 'BarbaTrucs'...

=> Démo Téléchargeable Lien supprimé

Comme ça il y a la démonstration en Real Time pour ilustrer ce que vous avez très bien expliqué.

Bonne Journée
@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
re Bonjour José, le fil

Arf mets de l'huile !!!

En fait cette démo à été faite à l'époque où je développais sur mon vieux copain depuis au moins 4 ans, un bon vieux PII 400 sous Win NT, superbe machine que mon admin réseau a finit par me confisquer par un mois de décembre 2003 pluvieux... Pour me mettre un PIV sous Win 2000 qui à déjà été remplacé depuis !!

Enfin mettez de l'huile ici => BoucleBidon1 1, 15000 !!!!

Bonne Journée
@+Thierry
 

WILFRIED

XLDnaute Impliqué
Tous d'abrod merci a vous pour ces explications.

En faite je cherche à faire une progress bar pour que l'utilisateur ne ce demande pas si le PC à planter. (la macro peu duré plusieur minute en fonction du nombre de ligne.

J'ai récuperé des exemples en faisant rechercher sur ce forum dont une avec des labels qui apparraisse sucessivement. Mon souci est que cela fonctionne dans l'appli d'origine mais pas dans la mienne. D'où ma question sur les DoEvents.

L'explication de l'aides ne m'apporte pas grand chose car je ne la comprend pas ( je dois être mal réveiller ce matin :eek: )

Jmps :

J'essaye de faire un copier/coller de la progressbar de thierry depuis son USF vers le mien mais au moment de coller il me mets le message suivant :

Impossible de coller le contrôle. Le contrôle n'as pas été créé parce qu'il n'est pas correctement licencié.

Dommage car il avait l'air d'être simple à gérer.

En résumé :

Si j'ai bien comprit, dans mon appli :
1° j'affiche mon usf progressbar,
2° je lance ma procédure de traitement en acollant ': DoEvents' en fin ?

C'est ça???

A+
 
M

MrExcel

Guest
Salut Wilfried,

Je bypass l'explication du DoEvents (fort bien expliqué au demeurant par mes collègues animateurs) pour aborder le sujet de l'optimization du code !
Comme tu parles de 'longue' durée pour ta (tes) procédures de traitments, avant d'alourdir ton code et ton programme par une progressbar, as-tu bien pensé à l'optimization de ton code ?

Alors, je te confie quelques tips de programmation qui permettent d'accélerer le temps de traitement:

- Nettoyer son code de toute ligne 'morte'
- Dimensionner ses variables -> toujours rechercher le plus petit dénominateur commun (pourquoi utiliser un Réel si on peux utiliser un Entier.
- Supprimer TOUTES les variables inutiles
- Vérfier les boucles (en sortir plutôt si possible)
- Utiliser des Select Case en lieu et place de multiple If imbriqués.
- Utiliser les With...End With avec les objets
- Travailler avec la mémoire plutôt que les cellules
- Optimiser ton code c'est aussi écrire
If MaVariable Then Exit en lieu et place de
If MaVariable=True Then...
Utiliser Option Explicit en entête de module pour être certain de déclarer toutes ses variables
Ne pas oublier de libérer la mémoire si l'on utilise des objets (MonObjet=Nothing)
Utilise For Each...Next au lieu de For...Next
Désactiver l'affichage pendant l'exécution du code Application.Screenupdating=False
Désactiver le calcul des feuilles pendant l'exécution Apllication.Calculation=xlManual
Décomposer son code en ayant recours à des Sub ou Function afin de ne pas l'alourdir. Attention, appeler trop fréquement des sous porcédure aura l'effet inverse à celui recherché.

Voili voilou. Quand on développe il ne faut jamais perdre de vue l'optimisation de son code, d'une part parce que ça force à penser à code propre ;) et pis c'est l'utilisateur final qui en sera satisfait (pas de bug, rapidité du code...).

HTH

Message édité par: MrExcel, à: 08/03/2005 14:06
 

WILFRIED

XLDnaute Impliqué
Salut MrExcel,

En fait mon programme est dévelloper pour une partitipante du forum :

Lien supprimé

Cette appli a grandi énormément 7 USF 2 module de calcul,

J'ai essayer d'optimisé au maximum les variables et code.

J'utilise déja des sous-programme dés qu'une action compliqué (plus de 10 ligne de code) doit revenir plus de 3 fois, de même j'ai essayer d'éviter de faire tourner des boucles pour rien (je pense qu'il me reste encore à creusé dans ce sens). Mais voila le fichier peu faire plus de 5000 Lignes donc quand il s'agit de scrutter toutes les cellule d'une colonnes donnés cela prend du temps.

Je masque déjà le rafriachissement car le sintillement de l'ecran est trés désagréable...

J'ai réussi à adapter la progressbar (utilisation de label afficher au fur et à mesure) pour que l'utilisateur se rende compte que le pc travail (lui! :p ) et donc n'est pas planté.

Une fois que ce projet ce terminé je pense l'envoyé à notre cher DAVIDXLD pour qu'il le mette sur le forum car je pense qu'il pourra être utile à d'autre car on retrouve des fichiers d'aides avec scroll, des listes déroulante, la fameuse progressBar,, des tries sur 5 critères personnalisable des scrolls sur des labels....

Mais bon il me reste encore deux trois détails à pofiné...

Encore merci. A+
 

Jam

XLDnaute Accro
Salut Wilfried,

J'ai jeté un coup d'oeil au sujet sur lequel tu travailles.
Miam, ça m'intéresse :lol:

Si éventuellement t'as envie de m'envoyer le projet (même pas finalisé) j'y jetterai un coup d'oeil avec plaisir.

Au besoin, envoi juste les modules si le fichier est trop gros ;)

A+
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Wilfried, José, HTH, le Fil, le Forum

1) Pur la ProgressBar... de quelle démo ProgressBar de moi s'agit-il pour avoir un message 'Le contrôle n'as pas été créé parce qu'il n'est pas correctement licencié' ??

2) Toujours par rapport à 1) Quelle Version d'Excel / Office / Win utilises-tu ?

3) Pour l'optimisation du code... en plus des B.A.BAs que te re-mémore gentillement MrExcel, ce qui ira vraiment plus vite sur 5000 lignes c'est de tout mettre en Variable Array (Tableau) et de travailler directement sur ce tableau et plus sur les Ranges.

Bon Aprèm
@+Thierry
 
M

MrExcel

Guest
Salut Wilfried,

Voici une fonction adaptée à la colonne P qui contient des caractères avant et après qu'il faut Trimmer !

Le code ci-après démontre la rapidité des tableaux.
NB.: A copier dans un module. Sélectionner la plage et lancer la macro ! Résultat quasi instantané même avec 5000 lignes !

Code:
'================================================================
'Supprime les espaces à gauche et à droite de toute une sélection
'================================================================
Sub TrimGD()
Dim i As Long
Dim j As Long
Dim nbColonnes As Long
Dim MyArray As Variant
Dim MyRange As Range

With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With

Set MyRange = Selection
With MyRange
    nbColonnes = .Columns.Count
    MyArray = .Value
End With
    For i = 1 To nbColonnes
        For j = 1 To UBound(MyArray, 1)
            On Error Resume Next
            MyArray(j, i) = LTrim(RTrim(MyArray(j, i)))
        Next
    Next
MyRange.Value = MyArray
With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
End With

End Sub

HTH
 

_Thierry

XLDnaute Barbatruc
Repose en paix
re Bonjour HTH, Wilfried

Arf c'est vrai tu l'as dit, mais tu as mis une telle tartine à ce pauvre Wilfried que ça m'a échappé !! Surtout que pour ma part je l'aurais mis dans les premiers points recommandés.

Par contre tu as raison aussi d'insister sur les B.A.BAs, car souvent il faut obliger les gens à prendre de bonnes habitudes avant que les mauvaises soient ancrées.

Bon Aprèm
@+Thierry
 

Jam

XLDnaute Accro
Ok, j'recommence...

C'est un code que j'avais pas regardé depuis...ouuuuf, trop longtemps, donc en voici une version un ch'touile + optimisée :

Code:
Sub TrimGD()
Dim i As Long
Dim j As Long
Dim nbColonnes As Long
Dim MyArray As Variant
Dim MyRange As Range

With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With

Set MyRange = Selection
With MyRange
    nbColonnes = .Columns.Count
    MyArray = .Value
    For i = 1 To nbColonnes
        For j = 1 To UBound(MyArray, 1)
            On Error Resume Next
            MyArray(j, i) = LTrim(RTrim(MyArray(j, i)))
        Next
    Next
    .Value = MyArray
End With

MyRange = Nothing

With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
End With

End Sub
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re MrExcel, Wilfried

Une démo pour te convaincre Wilfried... Hé Hé !!

=> Lien supprimé

Traitement sur 15000 lignes 6 colonnes...

En travaillant sur la range directe, Sans le sans le ScreenUpdating False = près de 2 minutes

Toujours sur Range mais avec le ScreenUpdating False = près de 1 minute

Tout en Array et Dynamic Array = 0 seconde 20 Centièmes...

Bonne Fin de Journée
@+Thierry
 

WILFRIED

XLDnaute Impliqué
Tous d'abord merci encore pour vos lumière.

Je vais creusé un peu au niveau du Array et dinamyc array que je ne connaissait pas.

Pour l'usf de thierry voir PJ.

MrEXCEL :

La taille est fonction direct du nombre d'usf. Deplus j'utilise des pages comme tempo de valeurs (stockage de certaine données) là aussi il faut que je travail sur ces points pour optimiser.

VoiliVoilou....
A+ :woohoo: [file name=USF_ProgressBar.zip size=19774]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/USF_ProgressBar.zip[/file]
 

Pièces jointes

  • USF_ProgressBar.zip
    19.3 KB · Affichages: 274
  • USF_ProgressBar.zip
    19.3 KB · Affichages: 271
  • USF_ProgressBar.zip
    19.3 KB · Affichages: 287

Discussions similaires