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 :

Problème de DoEvents


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut Problème de DoEvents
    Bonjour,
    Je travaille actuellement sur un traitement relativement simple de multiples fichiers (environ 900) au sein d'une arborescence.
    Le processus
    -Ouverture du fichier
    -Traitement
    -Fermeture du fichier
    ...est résolu dans une boucle sur un classeur témoin. (vide : 16 ko)
    Dans ce contexte, l'ensemble du processus et le traitement lui-même du classeur témoin est instantané .

    Le problème est que dans la réalité chaque fichier (.xlsx) cible fait 18 Mo...
    Même en mode de "Calcul sur ordre" l'ouverture, puis l'enregistrement puis la fermeture de chaque classeur prend une petite minute...
    J'imagine assez facilement que la lecture de la totalité mon programme sera largement terminé avant même que le premier fichier soit complètement ouvert...
    Je vais donc certainement être obligé d'intégrer dans ma boucle une (ou plusieurs...) instructions DoEvents permettant d'attendre :
    Que le classeur soit ouvert
    puis ...
    Que le classeur soit enregistré et fermé avant de continuer le traitement.
    Ce que je conceptualise de la manière suivante (en pseudo code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Workbooks.Open("blabla.xlsx")
    While "le classeur n'est pas prêt"
        DoEvents
    Wend
    ...Traitement proprement dit puis :
     
    While "le classeur actif n'est pas enregistré et fermé"
        DoEvents
    Wend
    Next ouverture de classeur.
    La question est :

    Comment conditionner l'exécution des boucles DoEvents jusqu'à ce que la macro puisse se poursuivre.
    C'est à dire en étant certain qu'aucun processus en cours ne bloque l'exécution...

    Hum... Suis-je clair ?

  2. #2
    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 re
    bpnjour

    transforme ta sub en fonction renvoyant un signal tu n'aura pas besoins de do loop

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub test()
    chemin="c:\blablabla\"
    fichier=dir(chemin &"*.xl"&"*")
    do while fichier<>""
    x=tafonction(chemin & fichier)
    fichier=dir
    loop
    end sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function fonction(chemin)as boolean
     
    set wb=workbook.open(chemin)
    'travail dessus
    '...
    wb.save
     
    tafonction=true
    end function
    bien sur ajouter des gestion d'erreur dans ton code au cas ou il y aurait un problème avec un fichier
    de cette manière le fichier2 ne sera en aucun cas ouvert avant que le fichier1 soit fermé car x attend la réponse de ta fonction
    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

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut
    Bonjour,
    La gestion d'erreur c'est déjà fait...
    Donc je pourrai éventuellement essayer de boucler avec DoEvents sur cette erreur précise mais j'aurai préféré prévenir en amont.
    Que puis-je mettre comme Fonction m'indiquant que la voie est libre et que je peux ouvrir un nouveau fichier.
    Un flag True juste après le Save me parait un peu short compte tenu du temps de sauvegarde et de fermeture...
    Et pour le délai de chargement ?
    Je pensais pouvoir tester que Excel est en position prêt... avec ReadyState ?
    Bon je vais tester toutes ces idées... avec les méga-fichiers !
    Merci
    A+

  4. #4
    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 re
    re
    a croire que mon Français n'est pas correcte

    je la fait courte

    le fait de séparer le traitement dans tes fichiers dans une fonction de la boucle fera exactement ce que tu souhaite
    puisque le tour suivant attend le retour de la fonction
    c'est pas difficile a comprendre
    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

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut
    Oui, oui ça j'avais compris mais je trouvais que renvoyer un True juste après .save ça me semblait vraiment court pour laisser la sauvegarde passer et le déchargement du fichier se dérouler.
    Mébon, j'avais tort sur tous les tableaux en fait je viens de tester sur mes méga-fichiers de la mort qui tuent mais le prog s'en fout : il encaisse sans broncher, il attend tout seul que le fichier soit ouvert, qu'il soit sauvegardé, qu'il soit bien refermé pour poursuivre le traitement...
    Bon c'est un peu longuet au moins 40 secondes par fichier selon la mise à jour à effectuer.
    Avec 900 fichiers ça me laisse une bonne nuit de repos...
    YA juste à mettre la clim en route pour refroidir le PC et la pièce : Le ventilo tourne plein pot !
    Bon ben... Je clos le sujet !
    Merci

  6. #6
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,

    Dans cas cité, avec une seule instance d'Excel, la boucle en cours (ouverture, traitement, sauvegarde) qui n'attends pas d'intervention utilisateur, DoEvents est totalement inutile !

    DoEvents sert à stopper temporairement l'exécution du VBA, à un moment précis, pour rendre la main au système d'exploitation afin qu'il traite d'autres taches (par exemple un autre programme en cours d'exécution ou une lecture clavier, ....).

    Cependant, le système est multitâche, il assure donc les tâches en cours (mais pas forcement au moment voulu).
    Par contre, dans une procédure donnée, VBA n'exécute pas une instruction avant d'avoir terminé la précédente.

    Le DoEvents est à utiliser avec parcimonie, il peut générer des problèmes, notamment au cours des procédures évènementielles.

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

Discussions similaires

  1. Problème fonction DoEvents !
    Par Amamiya dans le forum IHM
    Réponses: 2
    Dernier message: 08/07/2008, 08h14
  2. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  3. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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