Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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...
problème de résolutions différentes sur multi écrans ?
windows 11 m'a déjà fait des bizarreries de position d'userform avec un écran fullhd couplé à un whqd en affichage étendu
 
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:
C'est pas à exclure.
Perso, je n'y crois pas car deux écrans de références différentes ont forcément des résolutions différentes.

Il vaut mieux chercher du côté de l'utilisation d'éventuels zooms, ou du placement des écrans l'un par rapport à l'autre.
Mais tu es ici LE grand spécialiste du multi-écran donc tu as déjà dû vérifier tout ça.
 
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
 
- 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

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…