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 :

ProgressBar dans un Thread


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut ProgressBar dans un Thread
    Salut,

    je rencontre quelques soucis pour gérer une progressBar dans un Thread.
    Je rencontre deux types d'erreur :

    - Si je charge le UserForm au sein du Thread, Excel se plante violemment (rapport d'erreur à envoyer chez Bill etc).

    - Si Je charge le UserForm dans le Module parent du Thread, et que le Thread essaie de mettre à jour la progressBar de ce UserForm, j'ai une erreur 7 Mémoire insuffisante (en fait je pense plutôt qu'il s'agit d'une violation de mémoire car le UserForm n'a pas été crée dans la même stack)

    Rien ne parle plus qu'une exemple simple :

    Cas 1 qui génére le rapport d'erreur :
    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
     
    Option Explicit
     
    Private Declare Function CreateThread Lib "kernel32" (ByVal 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 TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
     
    Private Sub execThread()
     
        Dim i As Integer
        Dim t As Single
     
        UserForm1.Show vbModeless
        DoEvents
        For i = UserForm1.ProgressBar1.Min To UserForm1.ProgressBar1.Max
            UserForm1.ProgressBar1.Value = i
            t = Timer
            Do While Timer < (t + 0.1!)
                DoEvents
            Loop
        Next
     
        Unload UserForm1
    End Sub
     
     
    Public Sub main()
        Dim lL_handle As Long
        Dim lL_threadId As Long
     
        lL_handle = CreateThread(ByVal 0&, ByVal 0&, AddressOf execThread, ByVal 0&, 0, lL_threadId)
     
    End Sub
    Cas 2 qui génère l'erreur 7 Mémoire insuffisante :
    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
     
    Option Explicit
     
    Private Declare Function CreateThread Lib "kernel32" (ByVal 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 TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
     
    Private Sub execThread()
     
        Dim i As Integer
        Dim t As Single
     
     
        For i = UserForm1.ProgressBar1.Min To UserForm1.ProgressBar1.Max
            UserForm1.ProgressBar1.Value = i
            t = Timer
            Do While Timer < (t + 0.1!)
                DoEvents
            Loop
        Next
     
        Unload UserForm1
    End Sub
     
     
    Public Sub main()
        Dim lL_handle As Long
        Dim lL_threadId As Long
     
        UserForm1.Show vbModeless
        DoEvents
     
        lL_handle = CreateThread(ByVal 0&, ByVal 0&, AddressOf execThread, ByVal 0&, 0, lL_threadId)
     
    End Sub
    D'avance merci à tous ceux qui se pencheront sur le problème.

  2. #2
    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
    A tout hasard, tu as quelle version d'Excel ? AddressOff ne fonctionne pas sur VBA 97...
    A tout hasard... ai-je dit

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Salut,

    J'ai essayé sur une version 2003 et 2007.
    Mais en fait la création du Thread fonctionne.
    Si au sein du Thread, je lance des MsgBox au lieu mettre à jour la ProgressBar d'un UserForm, ça fonctionne.
    Si je mets à jour un labelText ça fonctionne.

    Le problème est bien relatif à ce contrôle.

Discussions similaires

  1. [AC-2003] Lancer mon formulaire d'attente (ProgressBar) dans un thread
    Par dut-dut dans le forum VBA Access
    Réponses: 3
    Dernier message: 02/09/2011, 13h31
  2. [MFC] afficher une ProgressBar dans une barre d'etat
    Par guillaume21 dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2007, 11h16
  3. [Process]Execution de process dans un thread
    Par devjava dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2004, 10h34
  4. erreur d'un timer declaré dans un thread
    Par hak5 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/04/2004, 09h20
  5. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25

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