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
Bonjour @patricktoulon,
Parce que tu tu places toujours dans la situation où c'est toi qui le fait, ou un expert, donc tu maîtrises.

Mettons que je sois un utilisateur lambda, pas très porté sur les subtilités de positionnement des UserForms.
Moi je lui passe une fonction qui permet avant (Modal) ou avant/après (Modeless) de positionner son UserForm. Il n'a rien d'autre à faire qu'appeler la fonction de positionnement et d'indiquer la cellule ou l'objet cible du positionnement.
Toi tu lui dis, tu positionnes d'abord ton UserForm et dans l'Activate, il faut que tu calcules les écarts avec de l'API pour le repositionner. Le mode d'emploi est trop compliqué à appliquer. C'est tout.
 

patricktoulon

XLDnaute Barbatruc
re
oui je comprends bien ce que tu veux faire
mais les données sont fausses (tout du moins approximative)
en aucuns cas mais alors aucun tu ne saura et pourra faire cette opération pré affichage de la form
les valeur ne peuvent qu’être approximative pour plusieurs raison et même ma méthode d'ailleurs
les raisons :
1° excel a son propre calcul de zoom qui entre parenthèses n'est pas si simple que le multiple
2° les résolution et le DPI registré ne correspondent pas forcement (ça c'est encore un secret de windows)
et bien d'autres encore

je t'ai fait un exemple comme ca vite fait
aucun code dans le userform(rien du tout ) l'appel se fait dans le select change des feuille
a près pour être honnête avec toi je ne l'utilise pas encore sur mes fichiers
en général je met une bonne année de test entre la création et la distribution parfois même plus

et moi aussi en genéral c'est clé en main il n'y a pas de modif a faire pour une config ou une autre
a l'inverse des fois toi tu prend pour acquis le résultat de tes test sur un pc ou deux
parfois une année de test sur X pc ne me suffisent pas a enlever certaines ambiguïté sur l'interprétation du résultat

bon assez de blabla voici le fichier
et je le redis si tu compte redistribuer a titre comparatif avec ta méthode par pitié laisse mon module tel quel

et si ca t’intéresse toujours de rédiger un de mes tuto j'en ai un a rédiger sur la fonction "POINTSTOSCREENPIXELS"
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Ok, je vais regarder ça.
Pour l'instant j'essaie de définir une variable Objet avec un UserForm dont je connais le nom.
C'est parce que j'ai 2 versions d'un code qui cite le UserForm dans une classe d'évènements et dans l'un des codes il est absent. Mais je n'y arrive pas.
 

Dudu2

XLDnaute Barbatruc
Voici un screenshot d'un de "mes" utilisateurs.
Le UserForm est latéralement bien positionné si l'on exclue ses marges.
Le problème c'est que ses marges ne sont pas invisibles comme dans ma config ! D'où un décalage apparent.
Je crains que quelque soit la méthode de calcul des marges, elle ne soit inopérante puisqu'on ne sait pas si les marges sont visibles ou pas.
1665943984021.png
 

Dudu2

XLDnaute Barbatruc
Pour les "POINTSTOSCREENPIXELS" tu vas les chercher dans le registre ?

A ce propos, je suis revenu sur l'idée qu'il faut systématiqement appliquer le Zoom au calcul des Point to Pixel. Il ne faut le faire que si la référence est dépendante au zoom.
VB:
'------------------------------------
'Conversion Pixels to Points sans API
'------------------------------------
Function PixelsToPoints(Optional ByVal Pixels As Long = 1, Optional ByVal ZoomSensitive As Boolean = False) As Double
    Dim PixelToPoint As Double

    With ActiveWindow.ActivePane
        PixelToPoint = 1 / ((.PointsToScreenPixelsX(1000) - .PointsToScreenPixelsX(0)) / 1000)
        PixelsToPoints = Pixels * PixelToPoint * IIf(ZoomSensitive, (.Parent.Zoom / 100), 1)
    End With
End Function

'------------------------------------
'Conversion Points to Pixels sans API
'------------------------------------
Function PointsToPixels(Optional ByVal Points As Double = 1, Optional ByVal ZoomSensitive As Boolean = False) As Double
    Dim PointToPixel As Double

    With ActiveWindow.ActivePane
        PointToPixel = ((.PointsToScreenPixelsX(1000) - .PointsToScreenPixelsX(0)) / 1000)
        PointsToPixels = Points * PointToPixel / IIf(ZoomSensitive, (.Parent.Zoom / 100), 1)
    End With
End Function
 

patricktoulon

XLDnaute Barbatruc
ce que je t'ai donné a été testé sur une trentaine de pc différents
résultat identiques sur les 30 et ils ont tous 365 ou 2016 64 bits
chez moi c'est W7 et 2013 32 bits

et non dans cet exemple je ne prend pas le point topixel dans le registre j'utilise mon astuce avec pointstoscreenpixels

sinon oui tu l'a aussi avec le registre comme ceci
VB:
 'With CreateObject("WScript.Shell"): Ppx = .regread("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With
msgbox Ppx
 

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,
Donc toi tu dis que grâce à cette fonction du DWM, on peut calculer le décalage, c'est ça ?
Pour en avoir le cœur net et des chiffres précis, j'ai fait un code et les résultats obtenus semblent confirmer tes affirmations.
1666082731033.png


Pourrais-tu m'envoyer un screenshot de ton programme du Post #77 avec un UserForm sur la Feuil1 (quadrillée) ?

Et pourquoi tu fais ça (en vert):
PosXY(2) = ((PaN.PointsToScreenPixelsY(Int(Cell.Top)) / PtsToPxy) * TheZoom) - IIf(Not .FreezePanes, 0, 2) 'top en point
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour @Dudu2
Ah!!.. enfin tu redeviens raisonnable j'ai bien cru t'avoir perdu 🤣

Pour en avoir le cœur net et des chiffres précis, j'ai fait un code et les résultats obtenus semblent confirmer tes affirmations.
tu parles quand on a trouvé cela avec pijaku on a presque sabré le champagne
et je te parle de plus de 10 ans de recherche car la dwma.dll n'est pas très bien documenté en tout cas en terme d'exemple
et je te parles de grands cadors sur DVP


alors si dans ce sujet je te dis; c'est comme ça: tu peux me faire confiance

ce qui est en vert c'est parce que quand tu fige 1 ou x lignes et/ou 1 ou x colonnes et bien tu ajoute 1 avec la bordure de la freeze contrairement au fractionnement ou toute les panes sont accessible par activepane
alors sur une résolution 1280*720 ca va même jusqu’à 2 sur une résolution ++ 1 c'est bien suffisant
 

patricktoulon

XLDnaute Barbatruc
vue sur feuille avec ligne et colonne figées
demo sans areo.gif


vu sur feuille fractionnée
demo sans areo.gif


d'ailleurs avec mon model on peu décider d'afficher sur une même cellule dans une panes ou un autre
demo sans areo.gif


et bien sur ma fonction fonctionne aussi bien sur feuille classique
demo sans areo.gif


ma fonction est abattable sur ce point c'est le fruit de beaucoup de temps
allez je te le redonne
si tu utilise mes codes cite au moins l'auteur
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
j'ai cru comprendre que ton souhait c’était d'afficher le userform au centre de l'application sur l'ecran ou se trouve la fenêtre de l'application
ben c'est simple tu démarre a pointstoscreenpixelsx(0) qui te donnera le bord de la grille
apres c'est simple tu ajoute (application.usablewidth-me.width)/2

et pareil pour le top
 

Discussions similaires

  • Résolu(e)
Microsoft 365 32 ou 64 bits
Réponses
46
Affichages
2 K

Statistiques des forums

Discussions
314 752
Messages
2 112 511
Membres
111 576
dernier inscrit
rahmane