Module standard, module de classe et Userform

Module standard, module de classe et Userform - VB/VBA/VBS - Programmation

Marsh Posté le 16-03-2022 à 09:37:02    

Bonjour.
Dans un document Word, je crée un module standard nommé Module1, une UserForm nommée UserForm1 et un module de classe nommé Classe1.
Dans Module1, j'écris la procédure

Code :
  1. Sub MdCoucou()
  2.   Debug.Print "Coucou de Module1"
  3. End Sub


Dans UserForm1, j'écris la procédure  

Code :
  1. Sub UFCoucou()
  2.   Debug.Print "Coucou de UserForm1"
  3. End Sub


et dans Classe1 la procédure  

Code :
  1. Sub ClCoucou()
  2.   Debug.Print "Coucou de Classe1"
  3. End Sub


1. Dans l'éditeur VBE, si je mets le curseur dans la procédure MdCoucou, et tape F5, le message attendu s'affiche normalement dans la fenêtre Exécution.
2. Pour la procédure UFCoucou, la méthode précédente échoue.
   Je vais maintenant dans la fenêtre Exécution, et je tape  
 

Code :
  1. UserForm1.UFCoucou


   Le message attendu s'affiche.
3. Pour la procédure ClCoucou, la première méthode échoue, et si je tape  
 

Code :
  1. Classe1.ClCoucou


   dans la fenêtre exécution, un message me dit  
      Erreur dexécution '424' :
      Objet requis
   Je tape donc  
 

Code :
  1. Set cl = New Classe1


   puis
 

Code :
  1. cl.clCoucou


   et là, ça fonctionne.
Voici mes questions :
Comment expliquer ces différences de comportements ?
Pour le module de classe, il faut instancier la Classe1 pour utiliser la procédure ClCoucou.
Je croyais que les UserForm étaient des modules de classe spéciaux. Mais la méthode 2 montre que je suis dans l'erreur puisque l'instruction UserForm1.UFCoucou fonctionne sans avoir à instancier un objet Userform1.
Quelle est la nature exacte des UserForm ? Classe ou objet ?
Merci d'avance pour vos réponses

Reply

Marsh Posté le 16-03-2022 à 09:37:02   

Reply

Marsh Posté le 16-03-2022 à 22:46:35    

Ca vient de la portée des variables et des fonctions. C'est tout à fait normal.
UserForm est un objet qui instancie une classe. Les méthodes d'une classe ne peuvent être appelées sans qu'une la classe soit instanciée via un objet sauf si les méthodes sont "static".
Si tu n'as aucune notion de POO (programmation orientée objet), tu vas bien galérer pour comprendre qu'est-ce qui est accessible depuis où. :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 16-03-2022 à 23:27:09    

Merci pour ta réponse.
Le problème, c'est de savoir si un userform est une classe, ou un objet.
Dans la fenêtre exécution, si je tape

Code :
  1. UserForm1.UFCoucou

j'obtiens

Code :
  1. Coucou de UserForm1

Donc UserForm1 se comporte comme un objet.
 
Si je tape

Code :
  1. set uf = new UserForm1
  2. uf.UFCoucou

j'obtiens

Code :
  1. Coucou de UserForm1

et là, UserForm1 se comporte comme une classe.

Reply

Marsh Posté le 17-03-2022 à 07:56:39    

VBA étant un langage mal branlé, UserForm1 est peut-être à la fois une classe et un objet. Il est au moins une classe vu que tu peux faire un New.
J'ai un projet en VBA sous Outlook avec un UserForm : je vais regarder aujourd'hui.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-03-2022 à 19:11:30    

Reply

Marsh Posté le 19-03-2022 à 06:53:06    

Salut, si cela peut aider :
Office et les modules de classes
https://tissotemmanuel.developpez.c [...] de-classe/


Message édité par kiki29 le 19-03-2022 à 06:53:42

---------------
Myanmar 90/91 : http://gadaud.gerard.free.fr/publi [...] index.html
Reply

Marsh Posté le 19-03-2022 à 15:59:21    

Merci pour ta réponse très matinale

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed