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

XL 2016 affichage userform avec 2 ou + ecrans

roby

XLDnaute Occasionnel
Bonjour le forum,

Lorsqu'on lance un fichier Excel sur un poste avec plusieurs écrans, à chaque fois les userform s'affichent sur un autre écran que l'écran ou est affiché excel.
y a-t-il une parade pour que cet userform s'affiche dans la même fenêtre que excel ?

je joint le même fichier solutionné dernièrement pour le test.

Merci encore.
 

Pièces jointes

  • Roby1.xlsm
    19.8 KB · Affichages: 17

Dudu2

XLDnaute Barbatruc
J'ai dit aussi:
Ce qui m'embête c'est que la fonction DwmGetWindowAttribute ne peut être utilisée que si le UserForm est affiché.
Et ça c'est assez emm...dant !
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
pour faire quelque chose de pré affichage
il faudrait voir si on peu avoir la donnée du thickframe avec dwma.dll par rapport au thickframe de getsystemmetric
aprs faut rester terre à terre c'est juste une correction a faire du au theme
 

Dudu2

XLDnaute Barbatruc
quel fichier ?
Post #43.

Et ça c'est assez emm...dant !
Parce qu'il faut mettre le code dans le UserForm s'il est affiché en vbModal.
Et idéalement il faut tout concentrer dans le module spécialisé dans le positionnement et laisser le code du UserForm sans contrainte pour son utilisateur.

Alors il y a une solution pas très élégante qui consiste à afficher le UserForm de manière fugace en vbModeless (si UserForm.Visible = False), le temps de récupérer les RECT. Et l'afficher en Top -1000 pour que l'affichage fugace ne soit pas visible.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
en quel honneur une fonction dans un module ne pourrait être appelée par le userform affiché modal
C'est pas qu'elle ne peut pas. C'est que je ne veux pas .
Je ne veux pas, dans le UserForm, devoir appeler un truc lié à son positionnement, lequel positionnement doit être de mon point de vue entièrement définit dans une fonction externe dédiée.
 

Dudu2

XLDnaute Barbatruc
En fait, on peut s'en sortir avec les marges latérales (et basse qui est identique aux latérales) simplement avec un (Usf.Width - Usf.InsideWidth) / 2.

Mais le Usf.Height - Usf.InsideHeight contient le Usf.Caption dont on ne connait pas la hauteur.
Si on la connaissait on aurait la marge haute directement.
Peut-être faut-il le retirer et comparer les hauteurs avec et sans.
 

patricktoulon

XLDnaute Barbatruc
re
et oui mais sur certaines versions de W10 W 8 et maintenant certainement W11 on la vu (et plusieurs d' entres nous) que le l’extérieur- le inside ne donnait pas la même chose pour tous selon la version de office donc ca reste donc des solutions bancales
ce que je t'ai donné ça marche pour tout le monde

démonstration à quel point tu te trompe sur le exterieur - le inside de l'usf
VB:
Private Sub UserForm_Click()
MsgBox Me.Height - Me.InsideHeight - ((Me.Width - Me.InsideWidth) / 2)
End Sub


ici j’enlève aéro de W7 je me met en theme basique
on constate deja que le userform en top n'est pas tout a fait au top de la ligne
je click dessus pour le message



allez on rigole faisons le mem test avec aéro
a ben la constate que la caption est plus grande que le userform est bien en top de ligne
sauf que le même calcul me donne exactement la même chose

c'est baloh hein !!!!


là si tu comprends pas je peux plus rien pour toi
 

Dudu2

XLDnaute Barbatruc
C'est bien ce que j'ai dit. Dans cette instruction
VB:
MsgBox Me.Height - Me.InsideHeight - ((Me.Width - Me.InsideWidth) / 2)
la différence Me.Height - Me.InsideHeight contient la hauteur du Caption qu'on ne connait pas et que j'ai mis en constante à 22 dans ce code:
VB:
Sub a()
    Dim SideBorderPoints As Single
    Dim TopBorderPoints As Single
    Dim BottomBorderPoints As Single
  
    Call GetUserFormInvisibleMargins(Usf, SideBorderPoints, TopBorderPoints, BottomBorderPoints)
    MsgBox "SideBorderPoints = " & SideBorderPoints & vbCrLf & _
           "BottomBorderPoints = " & BottomBorderPoints & vbCrLf & _
           "TopBorderPoints = " & TopBorderPoints
End Sub

Public Sub GetUserFormInvisibleMargins(Usf As Object, _
                                       ByRef SideBorderPoints As Single, _
                                       ByRef TopBorderPoints As Single, _
                                       ByRef BottomBorderPoints As Single)
    Const UserFormCaptionHeight = 22
  
    SideBorderPoints = (Usf.Width - Usf.InsideWidth) / 2
    BottomBorderPoints = SideBorderPoints
    TopBorderPoints = Usf.Height - Usf.InsideHeight - UserFormCaptionHeight - BottomBorderPoints
End Sub

Mais ce chiffre arbitraire de 22 est valide dans ma config.
Je voudrais pouvoir le déterminer par du code.
 

patricktoulon

XLDnaute Barbatruc
oui mais c'est faux tu t'en rends bien compte j'espère
cette astuce que tu utilise n’était valable que sur W200 et xp (attention xp sans Uxtheme(équivalent aujourd'hui depuis vista a aéro))
et depuis tout le monde continu a utiliser cette astuce alors que c'est faux et je viens de te le prouver au dessus
tu pourra prendre x W10 et même office tu aura des chances d'avoir des résultats différent
et c'est pas peine d'avoir une discussion hyper longue sur le sujet même sur XLD ou sur DVP aussi

tu n'a que 2 solutions
soit tu utilise dwma.dll
soit tu fait un memory recale dans la base de registre par exemple (ou autre)
ce qui implique de le faire au moins une fois (j'utilise cette méthode sans la base de registre sur mon calendar 4.4 décembre 2021 ( non distribué encore )

toi rigoureux comme tu es ,tu ne peux pas te contenter de distribuer un truc pareil c'est le monde à l'envers là
 

patricktoulon

XLDnaute Barbatruc
ce problème de décalage fait l'object(en ce qui me concerne) d'une recherche depuis 2013( et on est en 2022)
d'abords sur DVP puis sur XLD
a ce jour seule la fonction utilisant la dwma.dll donne des résultats probants
et pour tout te dire c'est pas moi qui ai trouvé c'est un certain pijaku sur DVP
 

Dudu2

XLDnaute Barbatruc
Je ne crois pas qu'un calcul évident et simple comme:
VB:
SideBorderPoints = (Usf.Width - Usf.InsideWidth) / 2
soit non générique. C'est du basique de chez basique.
Le seul truc qui me manque c'est la hauteur du Caption. Je vais chercher.

Le problème de la méthode API que tu as élaborée c'est encore une fois qu'il faut que le UserForm soit affiché.
Alors j'ai quand même contourné le problème dans ce fichier et présenté les 2 méthodes.
A voir ce que donne la mienne sur ta config et sur d'autres.
 

Dudu2

XLDnaute Barbatruc
Voilà, j'ai un peu ramé avant de trouver la perle rare qui me donne la hauteur du Menu Système qui compose le Caption du UserForm. Du coup je peux déterminer les marges sans avoir à afficher le UserForm et sans utiliser de valeurs en dur.
A moins évidemment que tu ne me fasses une démo d'un cas qui ne fonctionne pas ?!
J'ai laissé les 2 méthodes.
 

Pièces jointes

  • VBA Positionnement rapide UserForm sur Objet d'une feuille (Cellule, Shape).xlsm
    53.3 KB · Affichages: 4

Discussions similaires

  • Résolu(e)
Microsoft 365 32 ou 64 bits
Réponses
46
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…