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 :

Userform d'attente pendant traitement [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut Userform d'attente pendant traitement
    Bonjour,

    Malgré les différents posts sur le sujet je n'arrive pas à mes fins.... je relance donc une discussion
    J'ai créé un Userform d'attente tout simple dont l'aspect change toutes les 0.5 s. Voici le code
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Option Explicit
     
    Private Sub UserForm_Initialize()
        animerUF_Attente = True
    End Sub
     
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        If CloseMode = vbFormControlMenu Then Cancel = True
    End Sub
     
    Sub Animation()
     
        Me.Label1.BackColor = RGB(255, 255, 255)
        Me.Label2.BackColor = RGB(255, 255, 255)
        Me.Label3.BackColor = RGB(255, 255, 255)
     
        Dim t0 As Single, t As Single, tt As Single, delta As Single, i As Long
        delta = 0.5: tt = 0
        t0 = Timer()
     
        While animerUF_Attente
            t = Timer() - t0
            If t - tt >= delta Then
                tt = t
                Select Case i Mod 3
                Case 0
                    Me.Label1.BackColor = RGB(0, 255, 0)
                    Me.Label2.BackColor = RGB(255, 255, 255)
                    Me.Label3.BackColor = RGB(255, 255, 255)
                Case 1
                    Me.Label2.BackColor = RGB(0, 255, 0)
                Case 2
                    Me.Label3.BackColor = RGB(0, 255, 0)
                End Select
                Me.Repaint
                i = i + 1
            End If
            DoEvents
        Wend
     
    End Sub
    j'aimerais que ce UserForm s'affiche parallèlement à des procédures de traitement (assez longues) et là je coince... Par exemple avec cette sub toute bête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public animerUF_Attente As Boolean
     
    'Ce que je souhaiterais faire: afficher le UF_attente pendant que la sub Calcul tourne
    Sub Test()
        UF_attente.Show 0
        UF_attente.Animation
        Calcul     'je ne parviens pas à passer à cette étape (thread obligatoire ?) 
    End Sub
     
    Sub Calcul()
        Application.Wait (Now + TimeValue("0:00:10"))
        Debug.Print "ok"
    End Sub
    J'espère que vous pourrez m'aider. Je joins un classeur de test au cas où...

    Merci d'avance et bonne soirée à ceux qui liront jusque là.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Je pense que tu doives mettre ta Sub Calcul à l'intérieur du UserForm.
    Autrement, ça prendrait du Multi-Thread et là, je ne suis pas certain que ça puisse se faire avec Excel...

    Et si quelqu'un sait comment gérer le multi-thread sous Excel, je suis preneur

  3. #3
    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 issoram,

    La propriété ShowModal de l'UserForm d'attente est-elle bien à False ?
    Citation Envoyé par parmi Voir le message
    Et si quelqu'un sait comment gérer le multi-thread sous Excel, je suis preneur
    Cela a été traité je crois bien dans un post très récent du début de semaine ou fin de semaine précédente …

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Si cela peut vous aider, j'ai soumis une solution qui utilise un fichier .HTA pour un cas similaire au vôtre.
    http://www.developpez.net/forums/d13...ecution-macro/

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    @PMO2017,

    Je n'ai pas encore tester, mais ça ne tardera pas.
    Mais selon ce que j'ai lu ça semble prometteur
    Merci beaucoup !

  6. #6
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Merci pour vos réponses!

    @Parmi je ne vois pas comment faire ce que tu décris:
    Je pense que tu dois mettre ta Sub Calcul à l'intérieur du UserForm
    @Marc-L, oui le Userform est bien non modal

    @PMO2017, merci pour le lien mais j'aurais aimé trouver quelque chose de plus simple. Je continue de chercher....

    J'ai essayé les threads via l'API CreateThread mais sans succès pour l'instant. Je me suis inspiré de cette discussion.
    Avec le code tout simple ci dessous, Excel plante violemment. Si quelqu'un peut m'aiguiller...
    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
    21
    22
    23
    24
    Option Explicit
     
    Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
     
    Public Sub Lanceur()
        Dim hThread As Long, hThreadID As Long
        hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf Calcul, ByVal 0&, ByVal 0&, hThreadID)
        Debug.Print "Le processus asynchrone a été créé."
        CloseHandle hThread
    End Sub
     
    Sub Calcul()
     
        Dim t As Single, i As Long
     
        t = Timer()
        For i = 1 To 500000
            ThisWorkbook.Worksheets(1).Cells(i, 1).Value = i Mod 5
        Next i
        ThisWorkbook.Worksheets(1).Cells.Clear
        Debug.Print "calcul terminé", Timer() - t
     
    End Sub
    Merci d'avance.

  7. #7
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut Thread
    Je pense avoir trouvé la raison du plantage sur le code précédent grâce à un peu de lecture. En effet la Sub Principale (Lanceur) se termine avant que le Thread chargé d’exécuter le calcul ne se termine!

    Dans le document (très bien fait) cité ci-dessus, l'auteur décrit une fonction C pour pallier à cela, qui suspend l’exécution de la tâche courante jusqu'à ce que le Thread soit terminé.
    Existe-t-il une fonction de l'API Windows permettant de faire la même chose?

    Merci d'avance.

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

Discussions similaires

  1. [XL-2003] Problème d'affichage avec un UserForm d'attente pendant une macro ?
    Par [ZiP] dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2010, 11h28
  2. Message d'attente pendant traitement côté serveur
    Par bouliz dans le forum ASP.NET
    Réponses: 13
    Dernier message: 09/07/2007, 11h55
  3. Afficher une fenetre d'attente pendant un long traitement (Swing)
    Par JavaBienOuMal dans le forum EDT/SwingWorker
    Réponses: 5
    Dernier message: 15/06/2007, 14h13
  4. [Système] page d'attente pendant traitement system
    Par Squyrrel dans le forum Langage
    Réponses: 1
    Dernier message: 24/03/2006, 22h09
  5. [JProgressBar] Afficher barre d'attente pendant traitement
    Par Regis.C dans le forum Composants
    Réponses: 10
    Dernier message: 02/09/2005, 16h43

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