XL 2016 VBA - Problème positionnement UserForm

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

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 !

Dudu2

XLDnaute Barbatruc
Bonjour,
J'essaie de positionner un UserForm sur un Moniteur, en Left = 1044.
Que je le fasse en .Left = ou en .Move il ne tient pas compte de la position que je lui donne et le place en 2054+. Rien à faire, j'ai épuisé mes forces, je ne sais plus quoi faire. Quelqu'un a-t-il déjà eu ce problème ?
 
Solution
Merci à vous tous qui vous êtes penchés sur cette question.
Je te retournerai un peu la question : ton code crée-t-il me même problème chez quelqu'un d'autre ?
Oui !
Je crois avoir trouvé l'explication (à confirmer par un code encore à corriger).
Pour certaines raisons (je pourrais expliquer si demande), j'ai fait, dans ce cas précis (ce n'est pas une généralité), un SetParent du UserForm à l'ActiveWindow.

Conséquences:
  1. Lors d'un set du .Left, il faut le faire strictement par rapport à la Window (de 0 à .Width) même si le Left de la Window sur un moniteur #2 n'est pas 0 mais 1440 par exemple. Si on utilise le vrai .Left par rapport au moniteur, il va l'ajouter à ce qu'on a demandé au setting.
  2. Par contre...
bonjour,
Code:
Private Sub UserForm_Initialize()

    Me.StartUpPosition = 0

    ' --- Position souhaitée en PIXELS ---
    Dim leftPx As Long
    Dim topPx As Long

    leftPx = 1044
    topPx = 100

    ' --- Conversion pixels → points (VBA travaille en points) ---
    Me.Left = leftPx * 72 / 96
    Me.Top = topPx * 72 / 96

End Sub
Écran Résolution Position
------------------------------------
Écran 1 1920 x 1080 Left = 0
Écran 2 2560 x 1440 Left = 1920
 
Dernière édition:
Merci à vous tous qui vous êtes penchés sur cette question.
Je te retournerai un peu la question : ton code crée-t-il me même problème chez quelqu'un d'autre ?
Oui !
Je crois avoir trouvé l'explication (à confirmer par un code encore à corriger).
Pour certaines raisons (je pourrais expliquer si demande), j'ai fait, dans ce cas précis (ce n'est pas une généralité), un SetParent du UserForm à l'ActiveWindow.

Conséquences:
  1. Lors d'un set du .Left, il faut le faire strictement par rapport à la Window (de 0 à .Width) même si le Left de la Window sur un moniteur #2 n'est pas 0 mais 1440 par exemple. Si on utilise le vrai .Left par rapport au moniteur, il va l'ajouter à ce qu'on a demandé au setting.
  2. Par contre, même si on a setté 0 en .Left, le .Left final pour Excel incluera le décalage du moniteur et sera 1440 par exemple.
  3. Si on doit setter le .Left et le .Top, il faut le faire en 1 fois avec un .Move sinon en 2 fois (.Left = puis .Top =), ça va foirer à cause du fait qu'à la 2ème fois (sur le .Top =) il va reprendre le .Left (qui n'est plus à 0 mais en 1440 par exemple). Je comprends enfin l'utilité du .Move !
Donc dans ma fonction de positionnement, il faut que je teste si le Parent du UserForm est l'ActiveWindow et setter soit par rapport à 0 soit par rapport au Left réel (tenant compte du Moniteur) de la Window. Et que je transforme les settings de position de .Left = , .Top = etc... en .Move.

Edit: je mets mon Post en tant que solution, ce n'est pas par vanité ou autre, c'est parce que le code ainsi adapté fonctionne.
 
Dernière édition:
re
Donc dans ma fonction de positionnement, il faut que je teste si le Parent du UserForm est l'ActiveWindow et setter soit par rapport à 0 soit par rapport au Left réel (tenant compte du Moniteur) de la Window.
a bien oui bien évidemment si le userform devient child de l'application(activewindow depuis 2013) il est évident que le positionnement va et doit se faire par celle-ci.
et les écrans quel qu’il soit , n'ont alors plus rien a voir
d'autre part le userform doit rester dans le rectangle de l'application sans cela il sera totalement ou partiellement masqué
plus simplement dit: le point 0 c'est le left de l'application
 
En effet, hors de la fenêtre parente, le UserForm ne peut apparaître. L'intérêt c'est que la minimisation reste dans la fenêtre.
Le truc c'est que d'une part j'avais totalement oublié que ma fonction d'affichage que j'utilise à toutes les sauces depuis des lustres, faisait un SetParent dans certains cas et d'autre part qu'il fallait définir par rapport à 0 mais qu'au final c'était quand même en absolu.
 
plutot que t'ennuyer a restructurer l'arborescence des fenêtres
un bouton dans le ruban dans ton applicatif pour juste faire un hide et un show
le show se ferait point 0/0 +calcul si userform child /application
ou .application.left et top si non child
terminé
en VBA les choses les plus simples dans ce domaine sont les plus pérrennes
 
Certes, mais minimisé, le UserForm reste visible. Alors on peut bricoler des couleurs ou marqueurs de Hide et Show mais ça devient aussi compliqué.
1767614944560.png
 
- 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

Discussions similaires

Retour