Icône de la ressource

VBA - InputBox personnalisé - InputBoxPerso avec Timer et Valorisation par Sélection V22

Le fichier à télécharger contient:
  1. Le UserForm InputBoxPerso à importer dans le projet VBA pour utiliser ce InputBox Personnalisé.
  2. Le Module_Test qui donne quelques exemples d'utilisation.
L'appel de la fonction:
VB:
Dim Retour As Variant
'
Retour = InputBoxPerso.Display(...voir la description des paramètres dans le code...)

Les principales caractéristiques:
  • Office 2010+ (VBA7 sinon modifier les déclarations API comme indiqué).
  • Permet la saisie d'une donnée retournée en format chaine (vbString).
  • Inclut une option pour imposer un format de donnée (vbString, vbInteger, vbLong, vbSingle, vbDouble, vbDate, vbBoolean) qui garantit la conversion sans erreur au format demandé de la valeur saisie au retour de la fonction.
  • Permet la valorisation de la zone de saisie par le contenu ou l'adresse d'une ou plusieurs cellules sélectionnées dans la feuille.
  • Peut être prépositionné (valeurs Left et Top en paramètres d'appel).
  • Peut être repositionné par une fonction utilisateur (ReposFunction en paramètre d'appel) après qu'il a pris ses dimensions définitives juste avant son affichage (voir aussi cette ressource pour le positionnement d'un UserForm sur un Objet).
  • Inclut un Timer pour limiter le temps de saisie si besoin avec sa valeur de retour dédiée (-1).
  • Grâce à son paramètre ShowMode, permet d'afficher le prompt de saisie de manière NON modale.
  • Grâce à son paramètre ShowOnAllWindows, permet d'afficher le prompt de saisie sur tous les classeurs.
    Limitation: le coin bas droit du UserForm doit être dans la fenêtre Excel. S'il ce n'est pas le cas, le UserForm sera automatiquement repositionné pour que ce soit le cas.
    Techniquement, cette limitation est due au fait que, pour conserver l'affichage sur toutes les fenêtres Excel, le code définit la fenêtre Excel active comme Parent du UserForm ce qui en limite l'affichage à cette même fenêtre Excel et en modifie l'aspect des bordures sur les versions "récentes" d'Excel.

    Cette méthode du Parent s'est imposée plutôt que la re-création du UserForm (Unload + Show) sur la nouvelle fenêtre Excel qui nécessiterait un module dédié pour le déclenchement asynchrone (Application.OnTime Now Module.Fonction) du ré-affichage (Show) qui ne peut hélas pas se faire dans le code du UserForm après sa fermeture (Unload), les fonctions même publiques du UserForm ne pouvant être référencées en Application.OnTime Now ou même en fonction Timer.
Remarques:
  • Restriction: Si la fonction InputBoxPerso.Display() est appelée d'un UserForm affiché en mode vbModal, le Timer, l'affichage du menu système (minimisation), l'affichage sur toutes les fenêtres Excel et la possibilité de valorisation de la zone de saisie par le contenu ou l'adresse d'une ou plusieurs cellules sélectionnées dans la feuille ne sont pas disponibles.
    En effet, ces fonctionnalités ne sont disponibles que si le UserForm InputBoxPerso est affiché en mode vbModeless et Excel l'interdit à partir d'un UserForm Modal.
Versions:
  • V1 - Initiale
  • V2 - Le paramètre ShowMode (vbModal ou vbModeless pas défaut) permet maintenant d'utiliser la fonction InputBoxPerso.Display() dans un UserForm lui-même Modal. En effet, un UserForm Modal n'accepte pas qu'on affiche un UserForm non Modal "au-dessus" de lui.
    Cependant, avec ShowMode = vbModal, on perd le Timer et la possibilité de valorisation de la zone de saisie par le contenu ou l'adresse d'une ou plusieurs cellules sélectionnées dans la feuille.
  • V3 - Corrections pour compatibilité Office 64 bits
  • V4 - Activation de la fenêtre appelante en retour de fonction (utile si l'appel est fait dans un UserForm vbModeless).
  • V5 - Supprime le paramètre ShowMode et gère l'erreur 401 pour passer automatiquement en vbModal si la fonction est appelée par un UserForm vbModal, mode dans lequel on perd le Timer et la possibilité de valorisation de la zone de saisie par le contenu ou l'adresse d'une ou plusieurs cellules sélectionnées dans la feuille.
  • V6 - Sécurisation des valeurs retours.
  • V7 - Appel de la fonction utilisateur de positionnement dans l'Activate() plutôt qu'avant le Show() pour avoir la forme définitive du UserForm (avec ou sans Caption).
  • V8 - Protection appel réccurrent et mise en ForeGround si appel d'un UserForm non modal.
    Remplacement des évènements MouseDown() par MouseUp() pour ne pas interférer sur l'appelant lors du MouseUp().
  • V9 - Ajout du paramètre ShowOnAllWindows pour garder le prompt de saisie affiché sur toutes les fenêtres Excel.
  • V10 - Correction problème retour sur classeur initial avec le paramètre ShowOnAllWindows.
  • V11 - Gestion de CTL + Pause pour arrêter le code en mode debug.
  • V12 - Améliorations de mode ShowOnAllWindows et correction centrage par défaut en multi-moniteurs.
  • V13 - Excel ne supportant pas bien un UserForm contenant une TextBox et affiché vbModeless avec Application.Interactive = False, le paramètre Interactive a été remplacé par le paramètre ShowMode.
  • V14 - Comportement multi-classeurs (paramètre ShowOnAllWindows) amélioré sur des fenêtres Excel non forcément plein écran.
  • V15 - N/A pour alignement de numéro de version sur le MsgBoxPerso
  • V16 - Micro-correction pour un calcul 100% précis des coordonnées de la fenêtre Excel (fonction GetExcelClientWindowRECT() ajoutée) qui prend des valeurs Left et Top négatives incompréhensibles en plein écran au lieu de (0, 0).
  • V17 - Correction d'un bug en affichage à partir d'un UserForm vbModeless qui figeait le message lorsqu'on cliquait sur le UserForm appelant..
    Accessoirement, un indicateur Public (InputBoxPerso.CurrentlyDisplayedModeless) permet de savoir qu'un InputBoxPerso Modeless est en cours d'affichage pour que le UserForm appelant (forcément Modeless, voir Restriction) évite de se placer en premier plan avec un SetForegroundWindow() (surtout sur un évènement UserForm_MouseMove comme dans cette Ressource) qui entrerait alors en conflit avec celui du InputBoxPerso qui utilise cette même fonction API pour être sûr de rester lui-même au premier plan et ne pas être masqué par le UserForm appelant.
    V17b - Micro-modification dans la fonction MsgBoxEnUserForm() sans impact fonctionnel.
  • V17c - Ooops ! Un bug dans le Timer (paramètre MaxTimeSec).
  • V18 - Après traitement, réactive un UserForm appelant affiché en vbModeless .
  • V19 - Correction pour permettre, dans la position initiale, de précisier indépendamment le PosLeft ou le PosTop.
  • V20 - Correction d'un bug en récupération du Handle d'un Workbook multi-fenêtré.
  • V21 - Correction si ShowOnAllWindows = True pour garder actif le dernier classeur activé et ne pas retourner sur le classeur initial,
    et correction positionnement en mutli-moniteurs.
  • V22 - Modification mineure de la fonction GetWindowExactRECT().
Démo1InputBoxPerso.gif


Démo2InputBoxPerso.gif