Icône de la ressource

VBA - Échanger des valeurs entre un Module et un UserForm sans utiliser de variables Public V2

Le fichier à télécharger Valeurs d'échange entre Module et UserForm.xlsm contient:
  1. Le Module1
  2. Le UserForm1
et est simplement un exemple d'échange de valeurs entre un Module et un UserForm.

Note: Voir toutes mes ressources -> https://excel-downloads.com/resources/?creator_id=268468

Principe d'échange de valeurs entre un Module et un UserForm:
  • Pour échanger des valeurs entre un Module et un UserForm on utilise souvent des variables Public déclarées dans un Module. L'inconvénient est qu'elles gardent leurs valeurs en permanence et doivent en principe et par précaution être initialisées avant chaque usage. De plus, en cas de UserForms multiples, il faut faire attention au nommage de ces variables pour éviter les collisions.

  • Avec cette méthode, on définit:
    • Dans le UserForm:
      - des variables Private pour conserver les valeurs d'entrée du UserForm,
      - une fonction Public SetInputValues() qui reçoit les valeurs d'entrée du UserForm.

    • Dans le Module:
      - une fonction Public SetOutputValues() qui reçoit les valeurs de sortie du UserForm.
      ...
  • La méthode consiste à:
    • Du Module, appeler UserForm.SetInputValues() pour passer en paramètres les valeurs d'entrée du UserForm.
      Le UserForm est alors instancié (UserForm_Initialize() est exécuté) et les variables Private sont conservées jusqu'au UserForm.Show.
      Puis faire le UserForm.Show.

    • Du UserForm, à sa fermeture (UserForm_QueryClose()), appeler Module.SetOutputValues() pour retourner en paramètres les valeurs de sortie du UserForm.
      Utiliser des paramètres en ByVal au cas où leurs valeurs seraient basées sur des variables du UserForm qui disparaissent au moment du Unload.

      Si des traitements longs sont à suivre (affichage d'autres UserForms, prompts divers, ...) cette fonction peut être utilisée pour prolonger les traitements par le lancement d'une procédure de manière asynchrone avec un Application.Ontime Now, "procédure" pour permettre de "libérer" le UserForm en cours de Query_Close().
      ...
  • Quels avantages ?
    • Pas de variables Public à déclarer et gérer. L'échange est purement "privé" entre le Module et le UserForm et ne peut subir aucune interférence avec une autre partie du code.

    • Les variables concernées sont bien localisées, en entrée dans le UserForm, en sortie dans le Module.

    • Pas de souci d'initialisation des variables d'entrée du Userform car elles sont initialisées à l'instanciation du UserForm et disparaissent à sa fermeture (Unload).
      ...
Remarque:
  • Une autre méthode assez similaire consiste à créer dans le UserForm un fonction Public à laquelle sont passées les valeurs d'entrée via les paramètres de la fonction, et à y faire le Me.Show.
    ...
    • Si le Me.Show est vbModal, les valeurs d'entrée des paramètres ByRef peuvent aussi être les valeurs de sortie.

    • Si le Me.Show est vbModeless, il faut:

      - Soit faire une boucle d'attente à l'instar de cette ressource Afficher un UserForm en mode "Pseudo-Modal", et dans ce cas, les valeurs d'entrée des paramètres ByRef peuvent aussi être les valeurs de sortie.

      - Soit appeler une fonction du Module appelant au moment de la fermeture du UserForm avec les valeurs de sortie en paramètres comme dans la méthode indiquée ci-dessus.

      A noter qu'avec cette méthode, en cas de bug dans le code du UserForm, le debugger s'arrête à la ligne d'appel de la fonction Public et ne donne pas la ligne réelle du plantage ce qui n'est pas très pratique.