Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Je suis en cours d'adaptation de la classe d'une barre de progression prévue pour Access en se basant sur l'excellent tutorial de 'Thierry GASPERMENT' sur Developpez.com. L'objective est de créer la même, mais pour Excel, et ça sera avec plaisir que je posterai cela sur le forum dès quelle est à point
Ceci dit, je me heurte à une erreur qui est la suivante :
J'ai créé l'USF 'FrmBar' et je la déclare dans la classe comme suit
Dim Frm as UserForm
.....
Set oFrm = New FrmBar
.....
lors des tests, je reçois, une erreur me signalant que la méthode Show n'est pas gérée par l'objet, Erreur numéro 438. En regardant de plus près, effectivement dans la liste des méthodes et propriétés 'Show' est absentes.
Comment puis-je déclarer un UserForm comme étant un objet et l'utiliser avec ses méthodes et propriétés via VBA ?
J'ai modifié la déclaration 'Dim oFrm as Userform' par ta proposition 'Dim oFrm as Object'.
ça fonctionne, plus de message d'erreur.
Toutefois, j'aurai aimer savoir quelle est la différence entre les deux déclarations.
Bon, pour le moment, je m'en contente, et je relègue la question à plus tard.
Object est un type générique susceptible de recevoir n'importe quel type d'objet. Il s'en suit une recherche dynamique, lors de l'exécution, des méthodes et propriétés invoquées (liaisons dites tardives) forcément moins rapides qu'avec l'utilisation d'un type d'objet explicite, permettant de les résoudre à la compilation (liaisons dites anticipées). Personnellement je déteste les liaisons tardives, et donc le type Object et la fonction CreateObject: je préfère me décarcasser un peu plus pour trouver la bibliothèque qui les définit. Mais il faut reconnaitre qu'elle peuvent à l'occasion être plus puissantes: il vous fait de toute façon aveuglément confiance à la compilation puisque vous n'avez pas eu d'assistance lors de la rédaction. Avec un Object, si vous avez déclaré un Public dans l'Userform, il vous le trouvera à l'exécution. En liaison anticipée avec un Userform il ne saurait résoudre des liens qu'avec des chose existant systématiquement dans n'importe quel Userform.
P.S. Après plus ample recherche: New FrmBar est une expression valide en VBA, si FrmBar est le nom d'un Userform, même si ce n'est vraiment pas du tout courant. Mais elle n'est pas de type Userform: elle est de type … FrmBar !
J'ai créé un Userform1 puis, dans un module :
VB:
Sub test()
Dim U1 As UserForm1, U2 As UserForm1
Set U1 = New UserForm1
Set U2 = New UserForm1
U1.Show 0
U2.Show 0
End Sub
Rigolo, ça marche, j'ai deux UserForm1 jumeaux affichés, chacun ignorant ce que fait l'autre ! Mais à quoi ça pourrait bien servir ??? …
En tout cas je me serai au moins clarifié un truc: le nom d'un Userform ne représente pas seulement, à lui seul, une seule instance possible de lui même, mais aussi un type de donnée objet.
Re : [Resolu] Ouverture USF et méthode Show - Barre de progression
Bonjour le forum;
Tout d'abord mes remercîments à Danreb, pour ses explications très utiles.
Comme promis, je joints un classeur qui contient l'utilisation d'une barre de progression d'attente de traitement.
Les explications sont dans le classeur lui-même avec un exemple d'utilisation.
Bien sur vos remarques et suggestions sont les bienvenues
Personnellement je résous toujours mes besoins de barre de progression avec ce même système qui se démarre par 1 appel à Tâche "Désignation tâche", NbPrévus, "Opé" puis NbPrévus appels à OùÇaEnEst.
Moi je sais à quoi cela va me servir : j'ai un userform qui m'aide à parcourir des classeurs et des feuilles et de temps en temps je souhaite faire des parcours parallèles. C'est génial, j'ai mis en moment aujourd'hui à trouver comment faire ça, avec une description simple, claire et précise !
J'ai adapté : pour ouvrir autant de fois l'USF que nécessaire il suffit d’exécuter la procédure AfficherMonUSF autant de fois que nécessaire. SIMPLISSIME !
VB:
Sub AfficherMonUSF()
Dim NouvUSF As MonUSF
Set NouvUSF = New MonUSF
NouvUSF .Show vbModeless
End Sub
Ça marche parce que MonUSF est une classe d'objets (donc MonUSF.show instancie la classe dans la variable objet MonUSF). Dans l'absolu, on devrait toujours appeler un USF comme cela, comme on le fait pour les autres classes.
Ce qui m’étonne est que la variable NouvUSF est détruite à la fin de la procédure mais que l'objet existe toujours dans Excel.
A bientôt
Guy
PS mots clefs pour faciliter la recherche : multiple plusieurs instances d'un Userform USF, ouvrir un Userform USF plusieurs fois simultanément
PPS : si show instancie, alors show n'est pas le contraire de hide (unload est le contraire puisqu'il détruit l'instance de l'objet).
C'est vrai que c'est un peu étonnant. Mais pas tant que ça: la méthode Show ajoute l'exemplaire à une collection UserForms. C'est Unload Me ou Me.Hide qui, en le supprimant de cette collection, va détruire cette dernière référence à l'objet.
c'est radical : élimination pure et simple même en mémoire !
De façon pratique :
.Load : charge le formulaire .Show : charge et affiche
Unload Me : décharge mais pas ne détruit pas l'objet (ainsi, les contrôles qui s'y trouvent sont vidés). Me.Hide : cache sans décharger (aussi, les contenus sont retrouvés après un nouvel affichage
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD