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.
Version imprimable
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.
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?
Oupsss.. :oops: pas penser à cette solution..
dans le UF
J'ai un peu modifier ta sub (alléger) et mis les appels du progressBar aux endroits que tu voulais.Code:
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
Et l'appel doit être dans une autre sub..Code:
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
Code:
1
2
3 Sub CreerLots() Progression.show End Sub
Maintenant, il bloque à"Variable objet ou variable de bloc With non défini" qu'il dit...Code:Progression.Show
:arf:
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.
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.
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 ??Code:Progression.Show
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+
@ LeForestier : j'ai suivi ta méthode, et j'ai remarqué qu'il plante sur@ AlainTech :Code:Unload Me
Oui, c'est bien ça.Citation:
Le UserForm s'appelle bien Progression?
La ProgressBar s'appelle bien ProgressBar1?
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.
@ 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é.
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 barCode:.hide
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.
Tu dis...Code:
1
2
3
4 Sub CreerLots() Progression.show Unload Progression End Sub
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() :
Là on est sûr que le UF est affiché.Code:
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
Et le Unload fonctionne.