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 : comment ne pas bloquer le code appelant?


Sujet :

Macros et VBA Excel

  1. #21
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Il n'est pas nécessaire de mettre tout le code de la procédure de traitement dans le UserForm. L'appel à cette procédure suffit.

  2. #22
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    Ah OK! En fait, ce que tu dis, c'est de mettre le code du programme dans la UserForm, et pas appeler la UserForm depuis le programme, c'est ça?

  3. #23
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Oupsss.. pas penser à cette solution..
    dans le UF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub UserForm_Initialize()
        ProgressBar1.Min = 0
        ProgressBar1.Max = 6
        ProgressBar1.Value = 0
        CreationFichierLots
        Unload Me
    End Sub
    J'ai un peu modifier ta sub (alléger) et mis les appels du progressBar aux endroits que tu voulais.
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    'Procédure créant le fichier de lots, celui-ci sera référencé par la variable globale lots
    Sub CreationFichierLots()
    Dim Lots As Workbook
        'Appel à garder pendant la phase de développement, à déplacer dans le main
        Application.StatusBar = "Création du fichier des lots..."
        Progression.Caption = "Création du fichier des lots..."
        'Création du classeur et du fichier associé
        Workbooks.Add
        Set Lots = ActiveWorkbook
        Path = Application.GetSaveAsFilename("Lots.xls", "Fichiers Excel (*.xls), *.xls", , "Enregistrer le fichier de lots sous")
        ActiveWorkbook.SaveAs (Path)
        Set Lots = ActiveWorkbook
        'IncrementeProgression ("Organisation du classeur...")
        Progression.Caption = "Organisation du classeur..."
        Progression.ProgressBar1.Value = 1
        'Application.StatusBar = "Organisation du classeur..."
        'Configuration du classeur
        Lots.Sheets("Feuil1").Name = "Feuil1"
        Lots.Sheets("Feuil2").Name = "Feuil2"
        Lots.Sheets("Feuil3").Name = "Feuil3"
        Lots.Sheets("Feuil1").Select
        Application.StatusBar = "Formatage des cellules..."
        'IncrementeProgression ("Formatage des celulles...")
        Progression.ProgressBar1.Value = 2
        Progression.Caption = "Formatage des cellules"
        Lots.Sheets("Feuil1").Cells.Font.Size = 8
        Lots.Sheets("Feuil2").Cells.Font.Size = 8
        Lots.Sheets("Feuil1").Cells.Select
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlBottom
        End With
        Lots.Sheets("Feuil2").Select
        Cells.Select
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
        Lots.Sheets("Feuil1").Select
        Columns().ColumnWidth = 5.29
        Range("A1").Select
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
        '
        ' Appel à la méthode Range créé par enregistrement de macro
        '
        Range( _
            "AH2,C1:F1,C:C,G1:J1,G:G,K1:N1,K:K,O1:R1,O:O,S1:V1,S:S,W1:Z1,W:W,AA1:AD1,AA:AA,AE1:AH1,AE:AE" _
            ).Select
        Selection.Font.ColorIndex = 3
        Application.StatusBar = "Fusion des cellules de la page des lots..."
        'IncrementeProgression ("Fusion des cellules...")
        Progression.ProgressBar1.Value = 3
        Progression.Caption = "Fusion des cellules"
        Range("b1:b2").Merge
        Range("a1:a2").Merge
        Range("c1:f1").Merge
        Range("g1:j1").Merge
        Range("k1:n1").Merge
        Range("o1:r1").Merge
        Range("s1:v1").Merge
        Range("w1:z1").Merge
        Range("aa1:ad1").Merge
        Range("ae1:ah1").Merge
        Application.StatusBar = "Écriture des entêtes de colonnes de la page des lots..."
        'IncrementeProgression ("Écriture des entêtes de colonnes...")
        Progression.Caption = "Écriture des entêtes de colonnes..."
        Progression.ProgressBar1.Value = 4
     
        'Écriture des entêtes de colonnes
        Range("a1").Value = "N° lot"
        Range("b1").Value = "Vol"
        Range("c1").Value = "Arbre n°1"
        Range("g1").Value = "Arbre n°2"
        Range("k1").Value = "Arbre n°3"
        Range("o1").Value = "Arbre n°4"
        Range("s1").Value = "Arbre n°5"
        Range("w1").Value = "Arbre n°6"
        Range("aa1").Value = "Arbre n°7"
        Range("ae1").Value = "Arbre n°8"
        Range("c2").Value = "Plle"
        Range("d2").Value = "N°"
        Range("e2").Value = "Vol"
        Range("f2").Value = "Ess"
        Range("c2:f2").Copy
        Range("g2").Select
        ActiveSheet.Paste
        Range("k2").Select
        ActiveSheet.Paste
        Range("o2").Select
        ActiveSheet.Paste
        Range("r2").Select
        ActiveSheet.Paste
        Range("w2").Select
        ActiveSheet.Paste
        Range("aa2").Select
        ActiveSheet.Paste
        Range("ae2").Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Application.StatusBar = "Enregistrement de la matrice..."
        Progression.Caption = "Enregistrement de la matrice..."
        Progression.ProgressBar1.Value = 5
        Lots.Save
        Progression.ProgressBar1.Value = 6
        MsgBox "Copie et mise en forme terminée.", vbInformation, "Créer fichier Lots"
     
    End Sub
    Et l'appel doit être dans une autre sub..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub CreerLots()
        Progression.show
    End Sub

  4. #24
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    Maintenant, il bloque à "Variable objet ou variable de bloc With non défini" qu'il dit...



    Bon ben je vais me rabattre sur Application.StatusBar, parce que si je m'acharne sur ce truc, je vais perdre du temps sur le reste...

    Merci quand même d'avoir essayé de m'aider.


    PS : je ne sais pas si je dois marquer le sujet résolu ou clore le topic d'une manière ou d'une autre, dites-le moi, le cas échéant.

  5. #25
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Deux questions:

    Le UserForm s'appelle bien Progression?
    La ProgressBar s'appelle bien ProgressBar1?

    Pour débugger, tu peux mettre en commentaire tout ce qui se trouve dans UserForm_Initialize().
    Ca permet de savoir si c'est l'Initialize qui pose problème ou l'affichage du usf lui-même.

  6. #26
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Pour debugué un UF il faut prendre certaine précaution, si il y a une erreur dans le initialise, le debug (la ligne surlignée en jaune) revient sur la ligne d'appel, en l'occurence
    Et après tout le temps passer tu va quand même pas laisser tomber alors que tu arrive au but ??
    Comment faire... tu met le curseur sur la ligne d'appel en tu fait pas a pas en tapant F8..F8..F8.. etc. en regradant bien la ligne sur lequel il va arriver, quand la fonction en faute est actionnée c'est trop tard, il retourne immédiatement sur l'appel.
    A+

  7. #27
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    @ LeForestier : j'ai suivi ta méthode, et j'ai remarqué qu'il plante sur @ AlainTech :
    Le UserForm s'appelle bien Progression?
    La ProgressBar s'appelle bien ProgressBar1?
    Oui, c'est bien ça.

  8. #28
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 242
    Points : 484
    Points
    484
    Par défaut
    Bonjour,

    Mettre un Unload dans la procédure d'initialisation c'est un peu tôt. Lors de l'initialisation, le Userform n'est pas encore chargé et c'est donc normal que l'unload plante.
    En revanche, il est possible de le mettre dans Userform_Activate qui est exécutée après le chargement.

  9. #29
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    @ zempbb : En fait, il est là de manière à ce que le UserForm lance le code CreationFichierLots, car Unload Me servait à faire disparaître la fenêtre une fois qu'elle n'était plus utile. De toutes façons, Unload Me faisait se gauffrer le programme, donc je l'ai viré.

  10. #30
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bonjour à tous,

    Pour simplement faire disparaitre une fenêtre sans décharger l'USF utilise :

    Edit: Lu trop vite effectivement pas la solution pour le progress bar

  11. #31
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour tous,
    Aalex : si le UF est "hide" le progressBar ne serra plus visible !
    Penegal : Si ça plante sur le Unload.. c'est que la copie à été faite ?
    donc suffirait de déplacer le Unload dans l'appel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub CreerLots()
        Progression.show
        Unload Progression
    End Sub
    Tu dis...

  12. #32
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 242
    Points : 484
    Points
    484
    Par défaut
    Citation Envoyé par LeForestier Voir le message
    Aalex : si le UF est "hide" le progressBar ne serra plus visible !
    Hide ou pas, le UF n'est pas visible, dans la mesure ou le traitement est exécuté lors de l'initialisation (Private Sub Userform_Initialize), et donc avant l'affichage.
    Dans ce cas, le UF n'est affiché que lorsque le traitement est terminé !

    Il est préférable de déclencher le traitement CreationFichierLots lors de l'affichage, c'est à dire dans Private Sub UserForm_Activate() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub UserForm_Activate()
        ProgressBar1.Min = 0
        ProgressBar1.Max = 6
        ProgressBar1.Value = 0
        CreationFichierLots
        Unload Me
    End Sub
    Là on est sûr que le UF est affiché.
    Et le Unload fonctionne.

Discussions similaires

  1. Réponses: 53
    Dernier message: 05/06/2014, 19h42
  2. Comment ne pas bloquer un tOracleConnection en cas d'erreur
    Par minisys dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 29/04/2011, 17h25
  3. Réponses: 7
    Dernier message: 01/09/2010, 13h27
  4. [HTML] comment bloquer le code source en html
    Par leclone dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/10/2006, 22h17
  5. [API]Comment ne pas bloquer la fenêtre principal...
    Par X-K4l1 dans le forum Windows
    Réponses: 1
    Dernier message: 16/08/2005, 14h10

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