Le fichier à télécharger contient:
Les principales caractéristiques:
- Le Module_UserFormAndMonitors à importer dans le projet VBA.
- Le Module_TestUserFormMinimization qui donne des exemples des différentes options de minimisation et de placement.
- Le Module_TestMonitors qui donne les RECT des Moniteurs de la configuration du PC.
Les principales caractéristiques:
- Office 2010+ (VBA7 sinon modifier les déclarations API en supprimant PtrSafe et changer les LongPtr en Long).
- Cette ressource s'adresse à des développeurs relativement expérimentés qui se heurtent à la problématique des UserForms dans un environnement multi-moniteurs, où l'utilisateur a en plus la possibilité de créer des fenêtres multiples d'un même classeur qu'il répartit sur ses divers moniteurs.
- La minimisation d'un UserForm (et optionnellement maximisation et redimensionnement) passe par l'installation d'une option dans le menu système dans sa fenêtre.
Les fonctions fournies donnent 3 possibilités de minimisation:
1 - dans l'écran d'un moniteur (cas le plus fréquent car standard),
2 - dans la fenêtre Excel active (le UserForm ne peut alors déborder de la fenêtre Excel sous peine de ne pas être visible),
3 - dans la barre des tâches.
- Avec 1 seul moniteur, c'est à dire dans 95% des cas, la gestion du positionnement d'un UserForm ne pose pas de problème particulier. Cela devient plus délicat avec plusieurs moniteurs tout en apportant l'avantage de ne pas placer le UserForm sur le même moniteur qu'Excel pour ne pas masquer l'un par l'autre.
Ça devient encore plus délicat lorsque le Classeur Excel est multi-fenêtré car des phénomènes complexes doivent être maîtrisés lors de l'affichage et de la minimisation du UserForm. Surtout avec l'ambition de gérer 3 modes de minimisation !
Les fonctions fournies donnent la possibilité de positionner un UserForm dans 4 zones de référence:
1 - l'écran du moniteur désigné,
2 - la Work Area (l'écran moins la barre des tâches) du moniteur désigné,
3 - la fenêtre active du classeur Excel,
4 - le Visible Range de la fenêtre active du classeur Excel.
Le moniteur désigné peut l'être:
1 - soit directement par son numéro,
2 - soit par son décalage - précédent (-1), identique (0), suivant (+1) - par rapport au moniteur utilisé pour la fenêtre active du classeur Excel.
- Liste des fonctions fournies: (voir la description des paramètres dans le code)
- SetUserFormTopMost
- SetUserFormWindowFree -> Voir le Post #2 de la discussion
- SetUserFormSystemMenuOptions
- PlaceUserFormInReferenceArea
- UserFormLayout -> Voir les commentaires dans le code de la fonction
- UserFormMinimize
- UserFormRestore
- UserFormMaximize
- CountOfMonitors
- GetMonitorInfoByEnum
- GetMonitorRECT
- GetWorkAreaRECT
- GetTaskBarPosition
- GetTaskBarAutoHide
- GetTaskBarRECT
- GetClientFromActiveWindowRECT - GetClientFromWindowRECT
- GetActiveWindowVisibleRangeRECT - GetWindowVisibleRangeRECT
- GetActiveWindowMonitorNumber - GetWindowMonitorNumber
- SetActiveWindowMonitorNumber - SetWindowMonitorNumber
- GetWorkbookWindowsMonitorNumbers
- GetUserFormMonitorNumber
- GetHeadingsPixelSize
- PixelToPoint
- PointToPixel
- V1 - Initiale
- V2 - Change les noms des fonctions pour remplacer ExcelWindow par ActiveWindow puisque un classeur actif peut avoir plusieurs fenêtres et les fonctions s'intéressent à la dernière activée. Ajout de la fonction SetActiveWindowMonitorNumber().
- V3 - Ajout de la fonction GetWorkbookWindowsMonitorNumbers() pour lister tous les moniteurs occupés par toutes les fenêtres d'un classeur. Utile pour les classeurs multi-fenêtrés au-delà de la seule ActiveWindow.
- V4 - Correction de bugs en Multifenêtrage de classeur et simplification du UserForm_Layout().
- V5 - Correction de la modification du UserForm Owner qui évite son recouvrement par l'activation d'une autre fenêtre du classeur dont la surface recouvre partiellement ou complètement celle du UserForm.
- V6 - Remplace la modification du UserForm Owner pour simplifier et toujours garder le UserForm visible en toutes circonstances avec un SetWindowPos(UserFormHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE).
Et rend le UserForm indépendant de sa fenêtre de création avec un SetWindowLongPtr(UserFormHandle, GWL_HWNDPARENT, 0). - V6b - Correction bug V6. Le SetWindowLongPtr(UserFormHandle, GWL_HWNDPARENT, 0) impacte la minimisation.
- V7 - Isole les fonctions de positionnement au premier plan SetUserFormTopMost() et d'indépendance de fenêtre SetUserFormWindowFree() pour laisser le choix à l'utilisateur.
Gère la difficile minimisation d'un UserForm devenu indépendant des fenêtres sous condition (voir commentaires dans le code). - V7b - Correction bug en fonction GetWindowVisibleRangeRECT() utilisant toujours l'ActiveWindow au lieu de la Window argument.
- V7c - Ajout de commentaires concernant la fonction SetUserFormWindowFree().
- V8 - Correction erreur dans calcul des largeur et hauteur des Headings dans les fonctions GetActiveWindowVisibleRangeRECT() et GetWindowVisibleRangeRECT().
- V9 - Ajoute de la fonction GetHeadingsPixelSize().
- V10 - Correction erreur dans calcul des largeur et hauteur des Headings en cas de zoom non 100% dans les fonctions GetActiveWindowVisibleRangeRECT(), GetWindowVisibleRangeRECT() et GetHeadingsPixelSize().
- V11 - Amélioration du calcul des Headings pour les fonctions GetActiveWindowVisibleRangeRECT(), GetWindowVisibleRangeRECT() et GetHeadingsPixelSize().
- V12 - Rend le code compatible VBA7 et non-VBA7
- V13 - Micro-correction de GetWindowExactRECT() et de GetWindowVisibleRangeRECT().
Remplacement des fonctions de conversion Pixel / Point par PixelToPoint() et PointToPixel(). - V14 - Correction bug de GetWindowExactRECT() lorsque la TaskBAs n'est pas en bas.
- V15 - Bug en V14 sur GetWindowExactRECT() et remplacement par GetClientFromWindowRECT().
Ajout des fonctions GetTaskBarPosition() et GetTaskBarAutoHide().