OVH Cloud OVH Cloud

Problème sur une Userform

21 réponses
Avatar
JMM21
Bonjour à toutes et à tous,

Quand elle a beaucoup de travail, une macro peut mettre quelques secondes à
s’exécuter .
Pour le confort des utilisateurs qui ont horreur du « vide »,
j’ai tenté une Userform (MessMaj) avec un Contrôle /Label/Caption = « Mise à
jour en cours »
Cette Userform s’affiche à l’aide
d’un bouton dans une barre d’outil
comme ceci :

Sub Maj_Message()
MessMaj.Show
End Sub

Ensuite à l’événement « Activate » de la Userform
je lance la Macro(« MAJ ») de mise à jour et masque à la fin la Userform
comme cela :

Private Sub UserForm_Activate()
Application.Run "MAJ"
MessMaj.Hide
End Sub

L'ensemble fonctionne, à ceci près :
Le message contenu dans le Label ne s’affiche pas.
(la Useform est vide, le contrôle Label n’apparaît pas ???)

Je sais, je pourrais mettre le message d’information
dans la rubrique « Caption » de la UserForm mais bon, ce n’est pas très
esthétique.

J’aimerais bien savoir ce que j’ai oublié .

Il y a aussi sûrement d’autres méthodes pour informer l’utilisateur de
l’exécution d’une Macro.

Merci


« On ne trace pas de message sur un écran propre. »
[Robert Mallet]

10 réponses

1 2 3
Avatar
Geo


La surqualité serait de rajouter une /progressbar/
(contôle supplémentaire à cocher).


Amha ce n'est pas de la surqualité,
C'est un peu pour cela que je vous suggérais de remplacer votre liste
d'instruction par une boucle, ce qui vous permettrait d'afficher
facilement le taux de réalisation de votre boucle et plus tard une
barre d'avancement.
Le code ira un peu moins vite mais l'attente sera moins mal ressentie
par l'utilisateur.

--
A+

Avatar
JMM21



La surqualité serait de rajouter une /progressbar/
(contôle supplémentaire à cocher).


Amha ce n'est pas de la surqualité,
C'est un peu pour cela que je vous suggérais de remplacer votre liste
d'instruction par une boucle, ce qui vous permettrait d'afficher
facilement le taux de réalisation de votre boucle et plus tard une
barre d'avancement.
Le code ira un peu moins vite mais l'attente sera moins mal ressentie
par l'utilisateur.

--
A+



Bonjour,

Pas évident de créer une boucle quand elle n'es pas nécessaire...
(un code identique pour mettre à jour des champs -BookMarks et FormFields-
dans un ordre bien précis)
Néanmoins, j'ai tenté ceci :
http://cjoint.com/?kAfFvJTbWG

Merci de me dire si c'est optmisé et si il y avait plus simple...

a+
--


Avatar
Geo

Pas évident de créer une boucle quand elle n'est pas nécessaire...


Je ne voudrais pas qu'il y ait confusion :
je ne suis pas le professeur qui demande un travail à des élèves,
nous travaillons ensemble sur un même sujet.

(un code identique pour mettre à jour des champs -BookMarks et FormFields-
dans un ordre bien précis)
Néanmoins, j'ai tenté ceci :
http://cjoint.com/?kAfFvJTbWG


Ca m'ennuie de vous dire ça vu le travail effectué, mais on peut faire
nettement moins de lignes. Je vais y revenir, mais pourquoi 390 ?

--
A+

Avatar
Geo
Re

Je vous propose un autre code.
Le numéro de champ le plus élevé est mis dans une constante, ce qui
donne de la souplesse au code.
cette valeur est mise comme étant la valeur maximale de la barre, ainsi
elle suit réellement la progression du traitement.
On peut tricher un peu en mettant un peu moins ou un peu plus si on
veut donner l'illusion que ça va vite ou, au contraire, réserver une
bonne surprise à l'arrivée.

Le select case n'a pour objet que de sauter les numéros des champs non
utilisés. L'utilisation de cette forme de programmation a l'avantage
d'être très visuelle et facile à faire évoluer.

Si vous deviez par la suite utiliser des noms comme Texte124a,
Texte124b, une autre méthode serait de créer un tableau de caractères
avec tous les noms puis de balayer ce tableau.
Là aussi ça reste assez visuel et c'est facile à faire évoluer.
Si vous le souhaitez, je peux vous faire un exemple en ce sens.

Sub Maj_Champ()
Const NbChamps As Integer = 200
Dim i As Integer
ActiveDocument.Unprotect
Message_Maj.ProgressBar.Max = NbChamps
Application.ScreenUpdating = False
For i = 1 To NbChamps
Select Case i
Case 63, 100, 134, 136, 154
' pas de chmp pour ces numéros
Case Else
ActiveDocument.FormFields("Texte" & i).Range.Fields.Update
Message_Maj.ProgressBar.Value = i
End Select
DoEvents
Next i
ActiveDocument.Protect NoReset:=True, Type:= _
wdAllowOnlyFormFields

Application.ScreenUpdating = False

Message_Maj.Hide
End Sub

--
A+
Avatar
Geo
Si vous deviez par la suite utiliser des noms comme Texte124a, Texte124b, une autre
méthode serait de créer un tableau de caractères avec tous les noms puis de balayer ce
tableau.
Là aussi ça reste assez visuel et c'est facile à faire évoluer.
Si vous le souhaitez, je peux vous faire un exemple en ce sens.


Tant que je suis sur le sujet et vu que les vacances approchent à
grands pas :
http://cjoint.com/?kAlvoQs20L

--
A+

Avatar
JMM21


Je ne voudrais pas qu'il y ait confusion :
je ne suis pas le professeur qui demande un travail à des élèves,
nous travaillons ensemble sur un même sujet.

Aucune confusion possible, me sentant bien seul en VB WD dans la boîte où je

suis, j'ai trouvé sur ce forum une planche de salut pour progresser et
parceque j'aime cela aussi... (d'autres choses aussi, Dieu merci...)

Ca m'ennuie de vous dire ça vu le travail effectué, mais on peut faire
nettement moins de lignes. Je vais y revenir, mais pourquoi 390 ?


Pas vexé, je m'en doutais...
390, c'est le hazard (j'ai dupliqué les lignes sous excel qui incrémente
tout seul.
Je voulais juste être sûr que la progressbar dur un peu de temps, pour la
voir...

--
A+





Avatar
JMM21
"Geo" a concoté pou JMM21 :


Je vous propose un autre code.
Le numéro de champ le plus élevé est mis dans une constante, ce qui
donne de la souplesse au code.
cette valeur est mise comme étant la valeur maximale de la barre, ainsi
elle suit réellement la progression du traitement.
On peut tricher un peu en mettant un peu moins ou un peu plus si on
veut donner l'illusion que ça va vite ou, au contraire, réserver une
bonne surprise à l'arrivée.

Le select case n'a pour objet que de sauter les numéros des champs non
utilisés. L'utilisation de cette forme de programmation a l'avantage
d'être très visuelle et facile à faire évoluer.

Si vous deviez par la suite utiliser des noms comme Texte124a,
Texte124b, une autre méthode serait de créer un tableau de caractères
avec tous les noms puis de balayer ce tableau.
Là aussi ça reste assez visuel et c'est facile à faire évoluer.
Si vous le souhaitez, je peux vous faire un exemple en ce sens.

Sub Maj_Champ()
Const NbChamps As Integer = 200
Dim i As Integer /...
.../ Message_Maj.Hide
End Sub

--
A+




Un grand merci pour votre aide et votre pédagogie.
(Je suis un quinqua autodidacte en VB, les neurones sont moins vifs...) :>(

Je vais bien sûr essayer ce code pour lequel je n'ai aucun doute sur sa
fiabilité.

Je veux juste préciser que dans mon document réel, les noms de champ (un
coup de type FormFields, un coup de type BookMarks) sont des noms "parlants"
(pour moi) afin de m'y retrouver plus tard si je remets le "nez dedans".
Leur éxécution se fait dans un odre précis car la mise un jour de certains
doit être faite en amont de certains autres (200 signets environ)

Il faut donc que je crée un tableau (1 colonne et x lignes) avec les noms de
signets
et que la macro les lise en séquence ?

Re-merci forcément pour lvotre disponibilté, sans oublier les
"incontournables" : Anacoluthe, Circé pardon pour ceux que j'oublie

A+

Avatar
Geo

Je veux juste préciser que dans mon document réel, les noms de champ (un
coup de type FormFields, un coup de type BookMarks)


Argh ! Honte sur moi, ça m'a échappé, je ne comprenais pas pourquoi il
y avait deux fois la même chose.
On efface tout et on recommence.

Pour les neurones : euh, j'ai quitté le monde des quinquas et justement
je crois que le VBA est un bon moyen de les entretenir.

--
A+

Avatar
Geo
Re

Je veux juste préciser que dans mon document réel, les noms de champ (un
coup de type FormFields, un coup de type BookMarks) sont des noms "parlants"
(pour moi) afin de m'y retrouver plus tard si je remets le "nez dedans".


Sur le principe vous avez parfaitement raison, mais en re-regardant
j'ai un doute, même plusieurs :

Vous faites deux fois la même mise à jour, c'est peut-être logique,
mais peut-être un bout de code qui n'a pas suivi.
Pour faire deux fois la même chose, il est quand même plus simple de
faire une boucle
for j = 1 to 2
Ca prendra quelques nano secondes de plus, c'est supportable.

Vos noms de champs vont jusqu'à 210, or vous vous arrêtez à 200.

Ce sont juste deux interrogations.

Pour voir les noms de signets,
à la main : F5, Atteindre Signet, la liste est disponible à droite.
en vba il y a des macros dans la faq, elles ont destructrices, il faut
donc avoir fait une sauvegarde avant.
http://faqword.free.fr/articles.php?lng=fr&pga
http://faqword.free.fr/articles.php?lng=fr&pgq2

Il faut donc que je crée un tableau (1 colonne et x lignes)
avec les noms de signets et que la macro les lise en séquence ?


Disons un tableau à un seul indice, c'est ce que j'ai fait dans le
dernier code joint, en utilisant la fonction Array qui permet de passer
d'une simple liste à un tableau.
L'avantage de la liste c'est qu'elle est lisible et aisément
modifiable.
Petite contrainte : le tableau doit être déclaré en Variant.

Je le corrigerai en fonction de vos remarques sur les fields et
bookmarks.

--
A+

Avatar
JMM21

Re

Je veux juste préciser que dans mon document réel, les noms de champ (un
coup de type FormFields, un coup de type BookMarks) sont des noms "parlants"
(pour moi) afin de m'y retrouver plus tard si je remets le "nez dedans".


Sur le principe vous avez parfaitement raison, mais en re-regardant
j'ai un doute, même plusieurs :

Vous faites deux fois la même mise à jour, c'est peut-être logique,
mais peut-être un bout de code qui n'a pas suivi.
Pour faire deux fois la même chose, il est quand même plus simple de
faire une boucle
for j = 1 to 2
Ca prendra quelques nano secondes de plus, c'est supportable.

Vos noms de champs vont jusqu'à 210, or vous vous arrêtez à 200.

Ce sont juste deux interrogations.



Re

J'ai créé ce modèle uniquement pour le déposer dans cjoint.com.
Donc il y a eu un copié/collé pour faire du code afin de faire durer cette
belle "ProgressBar"... Donc pas de mise à jour en double.
Pour le nombre, il ya eu quelques ruptures dans l'incrémentation (le CTRL/C
CTRL/V du signet dans le tableau à eu des ratés) ceci expliquant la
différence de numérotation.
Il y a donc dans mon document réel un certain nombre de champs (200 environ,
il faut que je les liste avec la macro qui va bien...) de type FormFields ou
BookMarks (x BookMarks suivi de x FormFields, suivi de, etc...) et il faut
que je les Update tous.

J'espère avoir été clair ?

Merci

Cordialement

JMM21


1 2 3