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

teste de position userform

patricktoulon

XLDnaute Barbatruc
Bonjour a tous j'aurais besoins de vos retours sur la postion du userform
ces retours doivent s'accompagner de la version excel utilisé et la version de window
exemple chez moi emplacement B3 correcte , W7 , excel 2007
je vous remercie par avance pour le temps que vous prendrez pour ma petite experience
voici le code a tester
'--------------------------------------------------------------------------
Sub test20()
Dim pppx#, plus#, z#
With ActiveWindow.ActivePane
pppx = (.PointsToScreenPixelsX(ActiveSheet.[A1].Width) - .PointsToScreenPixelsX(0)) / ActiveSheet.[A1].Width
L1 = (.PointsToScreenPixelsX([A1].Left) / pppx)
R1 = (.PointsToScreenPixelsY([A1].Top) / pppx)
End With
z = (ActiveWindow.Zoom / 100)
With UserForm1
.Show 0
plus = .Width - .InsideWidth
.Left = (L1 + [B3].Left + (plus / z)) * z
.Top = (R1 + [B3].Top + ((plus / 2) / z)) * z
End With
End Sub
'---------------------------------------------------------------------------
 

patricktoulon

XLDnaute Barbatruc
re
attention danreb c'est l'expression du coefficient pixel qui est obtenu

tu est en résolution 100% 100% donc 96 DPI = 1.333333333333333
chez moi je suis en résolution dpi 125% donc 120 DPI = 1.66666666....7
l'avantage c'est que tu n'a pas a faire le calcul
alors le (4/3) oui mais * DPI attention a ca!! sinon ca match pas

d’ailleurs tu le multiplie par 72 comme pour getdevicecap et tu obtiens ton DPI
1.333333333333333*72=95.9999999999999(96)
1,666666666666667*72=120(125%)
 

Dranreb

XLDnaute Barbatruc
Maintenant ça m'affiche aussi 1,33333333.
J'ignore pourquoi ça m'affichait 0 d'abord.
En attendant cette méthode marche aussi bien comme ça :
VB:
Public Sub Posit(ByVal O As Object, Optional ByVal X As Double, Optional ByVal Y As Double)
Rem. ——— Vous pouvez au préalable positionner l'UserForm par rapport à quelque chose.
'     O: Ce par rapport à quoi vous voulez le positionner. X et Y indiqueront comment :
'     X: -1: Collé au coté gauche, 0: Centré horizontalement, 1: Collé au coté droit.
'     Y: -1: Collé au bord supérieur, 0: Centré verticalement, 1: Collé juste en dessous.
'     D'autres valeurs entraineront un recouvrement partiel ou un certain éloignement.
'     Mais rien ne vous empêche de rectifier encore ensuite la propriété Left ou Top
'     de l'UFmCalend pour ajouter un interstice en points au bord de l'objet. Mais toujours
'     avant le Show, donc avant utilisation de la méthode Saisie.
Dim G As Double, D As Double, H As Double, B As Double, U As Object, K As Double, Z As Double
If TypeOf O Is MSForms.Control Then
   G = O.Left: H = O.Top: Set U = O.Parent
   Do: K = (U.Width - U.InsideWidth) / 2
      G = G + U.Left + K: H = H + U.Top + U.Height - U.InsideHeight - K
      If Not TypeOf U Is MSForms.Frame Then Exit Do
      Set U = U.Parent: Loop
   D = G + O.Width: B = H + O.Height
Else
   K = ActiveWindow.Zoom * 4 / 300
   G = ActiveWindow.PointsToScreenPixelsX(O.Left * K) * 0.75
   D = ActiveWindow.PointsToScreenPixelsX((O.Left + O.Width) * K) * 0.75
   H = ActiveWindow.PointsToScreenPixelsY(O.Top * K) * 0.75
   B = ActiveWindow.PointsToScreenPixelsY((O.Top + O.Height) * K) * 0.75
   End If
Me.Left = (X * (D - G + Me.Width + 6) + G + D - Me.Width - 6) / 2 + 3
Me.Top = (Y * (B - H + Me.Height + 6) + H + B - Me.Height - 6) / 2 + 3
End Sub
Mais tu me déconseilles de la laisser comme ça ?
(rien compris à tes histoires de résolution )

Edit: le positionnement écrit comme ça se passe aussi bien après avoir temporairement changé ma résolution d'écran. Par contre, après rétablissement de la résolution maxi, un CommandButton ActiveX, qui n'a rien à voir avec ça, s'en est retrouvé à devoir être ramassé à la petite cuillère, pour ce qui est de sa taille et sa police !
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
déjà si la formule pointstoscreenpixels ne fonctionne pas tu a déjà certainement un soucis de librairie
tu a donc tes apis
le but pour moi est de supprimer les apis pour ce genre de choses dans ton cas ca risque d’être difficile

une chose que j'ai constaté a 100% 10 utilisateur sur 10
c'est que faire cohabiter 2 versions d'offices en ce qui concerne les formule il ne doit pas y avoir trop de soucis mais en ce qui concerne le VBA c'est une autre paire de manche il semblerait que le pack redistribuable xx.xxx.xxx microsoft visual basic soit remplacé par la dernière version d'office installée
ce qui cause le problème précédemment cité dans la discussion
même si dans ajout de programme on voit toute les versions disponibles
perso quand je change d'office je prends soin de faire une désinstallation complété
 

MJ13

XLDnaute Barbatruc
Bonjour à tous

je vous remercie pour tous ces codes et fichiers.

Mais en refaisant mon gestionnaire de compte perso, je me suis aperçu que si on fige les volets, les codes ne fonctionnent plus, le userform est décalé vers la gauche.
 

patricktoulon

XLDnaute Barbatruc
bonjour a tous
je le précise encore une fois dans cette exercice il est hors de question d’utiliser les apis windows ou GDI
je le précise encore une fois voyant les propositions qui sont de ce fait hors sujet
merci de bien prendre en compte cette contrainte dans vos futures réponses
sinon ca n'a plus d’intérêts
 

MJ13

XLDnaute Barbatruc
Bonjour Patrick

Personnellement, API ou pas API, c'est pas mon problème, pour moi le principal, c'est que ce soit fonctionnel.

Par contre pour le souci du déplacement de l'userform quand on fige les volets, là, c'est plus problématique.

Sinon, ce qui aurait été bien, c'est que Microsoft le prévoit avec un code simple, vu que quand on fait un click droit sur une cellule, la fenêtre est bien positionnée.
 
Dernière édition:

Patrice33740

XLDnaute Impliqué
Bonjour Roland_M

Ton code fonctionne sur 2007, 2013 et 2016, mais dans toutes les versions, le positionnement de l'usf ne tient pas compte de la largeur des en-têtes de lignes, ce qui entraine un décalage vers la gauche dans le bas de feuille.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
À vérifier aussi si l'affichage ou non des onglets et du scrooling horizontal d'une part, et de la barre d'état d'autre part n'affecte pas le résultat. Déduire Application.UsableTop (qui n'existe hélas pas) de Application.Height - Application.UsableHeight me parait suspect. Au moins ActiveWindow.PointsToScreenPixelsY semble le connaitre, lui ! Même si en effet, en l'appliquant seulement à des cells(…).Top il se plante en cas de volets figés ou d'affichage en mode Mise en page…
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je ne parlais pas de ça. Tout le monde n'affiche pas la barre d'état tout en dessous, et quelquefois, dans certaines applications, certains ne veulent voir ni les onglets du classeur ni la barre de scrooling horizontal. Ne faudrait-il pas corriger le calcul en fonction de la hauteur de ces pièces manquantes, ce fameux 12 déterminé sans doute expérimentalement, car ça augmente sûrement l'Application.UsableHeight ?
ActiveWindow.PointsToScreenPixelsY tient compte du dessus du panneau utilisable, que ces barres soient là ou non.
 

MJ13

XLDnaute Barbatruc
Bonjour à tous

Pour la recherche, j'ai trouvé une autre méthode en utilisant les anciennes macros XL4.

Voilà dans le fichier joint.
 

Pièces jointes

  • Lire_Cellule_Position_Userform_MacroXL4_V1.xlsm
    23 KB · Affichages: 51
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour
la macroxl4 ne fonctionne pas chez moi 2007
après divers tests et recherches
nous avons observé différents petits détails
en effet pointtoscreenpixels et basé sur un zoom 100 en dur dans le code de la dll
selon une logique on pourrait croire qu’appliquer un coefficient zoom devrait rectifier mais il n'en ai rien

tout simplement parce que cette fonction a été écrite pour 2003 qui n'a pas de ribbon
et on constate que le zoom s'applique non seulement sur la grille mais aussi sur une partie de ce qu'il y a au dessus ( du a la non correction par Microsoft (2003/version suivante)
sauf que visuellement seule la grille et redimensionnée lors du zoom
la dernière version que j'ai posté sera la dernière en attendant un rectification par Microsoft les requêtes ayant été envoyées nous verrons bien les retours
conclusion en l’état actuel aucunes version ou méthode ne peu donner une exacte position si ce n'est q'une approximation aussi fine soit elle

merci pour votre participation
 

Discussions similaires

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