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 :

Ajout d'une progress bar lors d'un rafraichissement


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut Ajout d'une progress bar lors d'un rafraichissement
    Bonjour a tous et a toutes,

    apres une semaine de tentative et ayant consulter tous les exemples du forum concernant les progress bar, je n'arrive pas a inserer aucun modele ou methode de progressbar qui fonctionnerait avec ce que je souhaite.

    Tous ce que je fais est de simplement recuperer dans une feuille excel des données d'une base de donnée externe via odbc. Cela prend environ 5 min avant que les données ne soit générer dans ma feuille et j'aimerais donc inclure un progress bar qui definit le temps qui reste avant que les données soit completement récupérer dans ma feuille. Ma derniere tentative a été d'essayer celle proposé par excel de microsoft mais sans resultat.

    Est-ce possible de faire cela et si oui, merci de me guider vers une solution.

    En ce moment, j'utilise un messagebox qui fontionne bien mais qui previent seulement l'utilisateur de patienter un moment...

    Un progressbar si cela est possible de faire, serait plus convivial et opermettrai a l'utilisateur de savoir combien de temps il reste car le temps n'est pas toujours fixe et dépend des données qui sont récupérer. Avec le temps, cette base sera plus grande et la récupération, donc plus lente.

    Merci pour votre aide d'avance et conseils.

    Ma macro a laquel je souhaiterais inclure la progressbar :
    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
    On Error Resume Next
        With ActiveSheet.QueryTables.Add(Connection:= _
            "ODBC;DSN=khalix_odbcBI_TST2;UID=z70914;;DBQ=C:\Program Files\Khalix\KlxTst2\cache\;CODEPAGE=1252;" _
            , Destination:=ActiveCell)
            .CommandText = Array( _
            "SELECT USERS.USER_NAME, USERS.USER_DESC, USER_ACCESS.ACCESS_SYM, USER_ACCESS.ACCESS_TYPE, USER_GROUP.GROUP_NAME, USERS.USER_SPEC" & Chr(13) & "" & Chr(10) & "FROM USER_ACCESS USER_ACCESS, USER_GROUP USER_GROUP, USERS USERS" & Chr(13) & "" & Chr(10) & "WHER" _
            , _
            "E USER_ACCESS.USER_NAME = USER_GROUP.USER_NAME AND USER_GROUP.USER_NAME = USERS.USER_NAME AND ((USERS.USER_SPEC='#all'))" _
            )
            .Name = "khalix_odbcBI_TST2 (not sharable)_1"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .SourceConnectionFile = _
            "C:\Program Files\Common Files\ODBC\Data Sources\khalix_odbcBI_TST2 (not sharable).DSN"
            .Refresh BackgroundQuery:=False
        End With

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir,

    Le plus simple, dans ce genre d'affaire, est encore de mémoriser la durée de la dernière ouverture/chargement...

    Cela a le mérite de ne pas pénaliser et ralentir encore ce qui est déjà assez lourd tout seul.

    Enregistre cette durée où tu veux (une cellule, un fichier texte, la base de registre, etc...) ... lis-là au lancement/chargement suivant et sers-t-en comme base d'apréciation de la nouvelle durée... tout simplement ... nul n'en sera, dans cette affaire, à pinailler sur une dizaine de secondes (écart à apprécier entre deux lancemen,ts, en fonction de la fréquence des lancements et de l'évolution du volume des saisies faites entre-temps) de plus ou de moins que la durée annoncée...

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    Salut ucfoutu,

    ton idée est très intéressante mais comment mémoriser la durée de la derniére ouverture ? manuellement ? ou ya t-l une facon de récupérer la durée lors du dernier rafraichissement via un code vba ?

    Merci

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Tu mets dans une variable l'heure de départ
    tu mets dans une autre variable l'heure de fin de chargement (lorsque tes données sont toutes sur ta feuille)
    Il te reste à faire la différence (par datediff) et à l'enregistrer où tu veux pour t'en servir comme base d'information lors du prochain chargement...
    Rien ne t'empêche de surcroît de corriger (par règle de trois) cette durée en fonction du dernier "poids" de la base et de son nouveau "poids" (il te faut alors également mémoriser ce poids,...)

    Bonne étude sur ces bases.

  5. #5
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 257
    Par défaut
    Ok je comprends ce que tu propose et je vais m'y mettre la dessus. Cependant, pour ce qui est de la progressbar meme, comment la faire fonctionner. Je veux dire comment l'incrementer (barre bleu qui evolue) en meme temps que ma macro rafraichissement presente plus haut roule.

    Supposons que je connais la duree de ma macro de rafraichissement, comment integré cela maintenant a ma macro. C'est la ma vrai difficulté. Moi, j'utilise ce code trouver sur ce forum pour faire ceci. Dans un module, j'ai :
    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
    Option Explicit
    Public Const Duree = 300 'secondes
     
    Sub MiseAJour()
     
        If UserForm3.ProgressBar1.Value = Duree Then
            Unload UserForm3
            Exit Sub
            Else
            UserForm3.ProgressBar1.Value = UserForm3.ProgressBar1.Value + 1
        End If
     
        Call Macro_ODBC_TST2
    End Sub
    End Sub
    et vous avez ma macro de rafraichissement dans le premier message. Comment je fais donc pour integrer ce progressbar dans ma macro afin que les deux roule simultanement. Tout ce que j'arrive a faire est lorsque je lance MseAJour(), une barre bleu s'affiche et Macro_ODBC_TST2 est lancé. Et la aucune evolution de la barre bleu jusqu'a la fin.
    Je sais que c'est normal avec le code que j'ai ecris que la barre bleu n'evolue plus jusqu'a la fin de la marco Macro_ODBC_TST2 mais comment faire donc pour les faire simultanement.

    Je te remercie encore pour ton aide ucfoutu et toute autre personne pouvant apporter lerus idées.

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Dès lors que tu connais la durée approximative (au besoin corrigée commu vu plus haut par application d'une règle de trois), il te suffit d'utitiliser tout bêtement un Timer pour faire progresser ta barre (augmenter sa propriété Value).

    VBA ne t'offrant pas de contrôle Timer, il va te falloir utiliser un substitut de ce contrôle (utilisation de l'Api de Windows). Tu as sur ce forum des exemples de création d'un Timer de cette manière.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/03/2013, 21h09
  2. [winAPI] Comment créer une progress bar ownerdraw ?
    Par kidpaddle2 dans le forum Windows
    Réponses: 1
    Dernier message: 01/08/2006, 11h02
  3. [MFC] Utilisation d'une progress bar
    Par nmarf dans le forum MFC
    Réponses: 2
    Dernier message: 12/09/2005, 10h42
  4. [VB.NET] Mise en place d'une progress bar
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 14
    Dernier message: 19/10/2004, 09h23

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