Autres [Résolu]Affichage userform sur cellule ou activX version simplifiée a tester

patricktoulon

XLDnaute Barbatruc
bonjour suite a deux discussions ressentes j'ai repris ma méthode et je l'ai simplifiée
normalement avec cette méthode on est dédouané du calcul et prise en charge du freezepane et des scrollbars H et V

aucune Api window ou gdi !!
aucun chiffre en dur dans le code !!!
aucun calcul des scroll ou du freezepane
et l'userform est contraint dans le périmètre de la fenêtre application si il le dépasse
vous voulez bien tester
cellule a jumeler
demo2.gif


activx a jumeler

demo3.gif
 

Pièces jointes

  • placement usf.xlsm
    29.4 KB · Affichages: 27
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
loin de moi l'envie de démolir quoi que ce soit danreb
j'ai réussi a adapter la partie usf toutes les options de position me sont inutiles mais c'est bien d'y avoir pensé
il me reste a trouver ces puré de puré de -6 et compagnie en dynamique puisque visiblement ca fonctionne universellement (ALL excel) et all version Window car je suppose qu'au mins l'un d'entre vous a W10

je vais regarder mon tableau getsystemmetric si je le retrouve pour voir a quoi ça pourrait correspondre maintenant
je vais étudier le code je n'aime pas ne pas comprendre ce que fais

merci pour ton boulot en tout cas
 

Dranreb

XLDnaute Barbatruc
Mais de quel -6 parlez vous donc ?
Je n'en vois qu'un à la fin, dans mon code, quand j'utilise les Lft, Rgt, Top et Bot, corrigés en coordonnées UserForm, du contrôle (ce qui était la seule chose importante) pour positionner mon UserForm par rapport à ça en fonction des paramètre du positionnement désiré et donc spécifiés. C'est un choix pûrement arbitraire d'avoir ajouté 3 points tout autour donc 6 en tout (8 pixels) pour que l'ombre du UserForm ne couvre pas trop le bord du contrôle.
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour danreb,Arthour
bon après décantation de ton code j'en conclu que le left et top sont respectivement
en simplifiant la formule
do
L=L+left+(leobjwidth- objinwidth/2)
t=t+ top+pinheight-(leobjwidth- objinwidth/2)-Pinheight
loop
L=L+1+(facultatif;ombre(=2))
T=T+2 + (facultatif;ombre(=2))


et ta formule inclu en plus le left ou midle our right par le x et t négatif ou pas pour la position souhaité

je vins de tester ça colle chez moi

VB:
Private Sub placementUF(ByVal Obj As Object)

    If Not Obj Is Nothing Then
        Dim Lft As Double, Rgt As Double, Top As Double, Bot As Double, P As Object, PInsWidth As Double, PInsHeight As Double
        Dim K As Double, Zom As Double, Ombre As double
        Ombre = 2
        Lft = Obj.Left: Top = Obj.Top: Set P = Obj.Parent    ' Normalement Page, Frame ou UserForm
        Do
            PInsWidth = P.InsideWidth: PInsHeight = P.InsideHeight    ' Le Page en est pourvu, mais pas le Multipage.
            If TypeOf P Is MSForms.Page Then Set P = P.Parent    ' Prend le Multipage, car le Page est sans positionnement.
            K = (P.Width - PInsWidth) / 2
            Debug.Print TypeName(P) & "  " & K
            Lft = (Lft + P.Left + K)
            Top = (Top + P.Top + P.Height - K - PInsHeight)
            If Not (TypeOf P Is MSForms.Frame Or TypeOf P Is MSForms.MultiPage) Then Exit Do
            Set P = P.Parent
        Loop

        Me.Left = Lft + 1 + Ombre + Obj.Width    ' a droite de obj
        Me.Top = Top + 2 + Ombre 'au  top de obj
    End If
End Sub
c'est quand même étonnant ce que donne les in dans le debug
Frame 1,5
Frame 1,5
Frame 1,5
MultiPage 1,80000305175781
testeur 1,80000305175781


par contre j'ai pas trouvé la prise en charge du zoom de l'userform dans ton model ,j'ai donc essayé avec (*me.zoom/100) et ca ne match pas
en tout cas la formule est bonne
vue grossie
le bord de obj est bien au centre de l'ombre
Capture.JPG
 

Pièces jointes

  • placement usf.xlsm
    31.5 KB · Affichages: 12

Roland_M

XLDnaute Barbatruc
Bonjour tout le monde,

concernant la position d'un calendrier, étant donné qu'il y aura toujours une différence,
je le vois bien rien qu'entre 2007 et 2016 on ne peut pas être très précis.
j'ai essayé ton exemple avec 2007 c'est ok mais avec 2016 il est qq points décalés, sans importance pour moi !

le plus simple serait de le positionner volontairement décalé, ainsi peut importe la version
avec qq points en plus ou en moins on est à côté de l'objet de destination et point barre !

par exemple comme ceci:
1568368823655.png
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Tu veux dire que mon calcul n'est pas bon en Excel 2007 ?
En tout cas suite à vos exemples pratiques de positionnements souhaités j'ai décidé d'ajouter une close à mes arguments X,Y :
' 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.
' Mais si la valeur absolue de X >= 1, Y:=0.9 est une valeur conventionnelle signifiant
' que le bord supérieur du calendrier doit être aligné sur celui de Obj.
Ce qui se traduit à la fin par :
VB:
   If Abs(X) >= 1 And Y = 0.9 Then Me.Top = Top Else _
   Me.Top = (Y * (Bot - Top + Me.Height + 6) + Top + Bot - Me.Height - 6) / 2 + 3
 

Roland_M

XLDnaute Barbatruc
Tu veux dire que mon calcul n'est pas bon en Excel 2007 ?

si c'est pour moi, absolument pas, c'est Ok ! J'en suis très satisfait et c'est très bien comme ça !

c'était juste pour dire qu'il y aura toujours qq points selon les versions
actuellement c'est pile poil avec 2007
et qu'avec 2016 il y 2 ou 3 points de décalage à droite et en bas, sans aucune importance !
c'est bon, on ne va pas se prendre le chou avec ça !
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
re
bon j’arrive diu boulot je termine tôt aujourd'hui

non danreb ta démo marche très bien au niveau de l'userform
j'essaie simplement de la séparer du placement range et d'enlever les options qui me sont inutile pour ce que je veux en faire
a la limite je mettrais le left,middle,right après le do dans un select case ca me permettra d'y voir plus clair
 

Dranreb

XLDnaute Barbatruc
De mon coté j'ai du nouveau coté positionnement sur Range :
VB:
      Zom = ActiveWindow.Zoom / 100
      If ActiveWindow.FreezePanes And Obj.Column >= ActiveWindow.ScrollColumn Then
         Lft = ActiveWindow.ActivePane.PointsToScreenPixelsX(Int(Obj.Left * Zom + 0.5)) * 3 / 4
      Else
         Lft = ActiveWindow.PointsToScreenPixelsX(Int(Obj.Left * Zom * 4 / 3 + 0.5)) * 3 / 4
         End If
      If ActiveWindow.FreezePanes And Obj.Row >= ActiveWindow.ScrollRow Then
         Top = ActiveWindow.ActivePane.PointsToScreenPixelsY(Int(Obj.Top * Zom + 0.5)) * 3 / 4
      Else
         Top = ActiveWindow.PointsToScreenPixelsY(Int(Obj.Top * Zom * 4 / 3 + 0.5)) * 3 / 4
         End If
      Rgt = Lft + Obj.Width * Zom: Bot = Top + Obj.Height * Zom
Mais ce n'est pas encore très fiable: ma démo part dans les choux au deuxième affichage du calendrier quand les panneaux sont figés en dessous et en colonne au delà de la plage, j'ignore pourquoi.
Lors de quelques investigations j'ai trouvé des choses bizarres : les méthodes PointsToScreenPixelsX et Y attendent un argument entier et renvoient aussi un entier. Celle de l'objet Window attend en fait un argument en pixels. Combiné à la 1ère observation il s'en suit que celle de l'objet Pane peut renvoyer une valeur inexacte pour un argument en points non multiple de 3.
 

patricktoulon

XLDnaute Barbatruc
re
danreb si tu regarde ma discussion qui doit dater un peu a ce sujet je le signalais que l'exactitude était bonne toutes les 3 colonnes
on a jamais trouvé et on était un paquet sur le coup cela dit l’écart n'est pas vraiment important en zoom 100
en zoom + de 100 ,attention de ne pas tout zoomer dans les éléments du calcul !!

dans l'userform
je viens de tester avec le textbox en bordersingle qui est légèrement plus fine que l'effetSunken et on a un léger décalage
mais dans le fond pour moi c'est bon

reste le zoom du userform a traiter


d'autre part regarde
VB:
Sub test()

Debug.Print "ss:DefaultColumnWidth" & Split(Split([B3].Value(xlRangeValueXMLSpreadsheet), "ss:DefaultColumnWidth")(1), vbCrLf)(0)

Debug.Print [B3].Width & ", " & [B3].Height

End Sub
la difference est infime mais en pixel * le nombre de cellules avant ramener en point vba arrondi

vous pouvez m'envoyer une capture de l'userform appelant surtout si vous avez W10
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui j'ai vu depuis que le zoom ne doit pas s'appliquer sur les méthodes de ActineWindows.ActivePane
Je ne traiterai pas le zoom de l'UserForm. Je ne l'utilise qu'à 400 dans la fenêtre de conception pour un réglage fin de la position des contrôles.
Je n'ai pas encore W10.
 

Roland_M

XLDnaute Barbatruc
Bonsoir à tous,

pour le positionnement sur cellule, en ce moment je fais des essais avec ça (moins scientifique que vous, mais semble fonctionner)
avec zoom, volets figés(en quatre) et largeur col/ hauteur ligne différentes !
pour l'instant c'est brut avec des codes extraits du calendrier.
il reste encore qq problèmes, voir la rem sur le classeur !

EDIT: 22h40
remis avec dernières modif en cours ! concerne TotColOffset, en partie solutionné
 

Pièces jointes

  • EssaiPosCell.xlsm
    23.7 KB · Affichages: 10
Dernière édition:

Roland_M

XLDnaute Barbatruc
bonjour patrick,

effectivement c'était une histoire de Colonne avec les volets à gauche que j'ai résolu
If Rng.Column < NoColScroll Then TotColOffset = NoColScroll - TotColScroll

actuellement il me reste à gérer le zoom !?
la réaction au zoom n'est pas évidente du tout, et surtout ce n'est pas progressif au zoom 110, 120 . . .
110 trop à gauche, 120 trop à droite, 130 ok et ça repart !? par contre les multiples de 100 c'est ok
pour l'instant je cale là-dessus !

maintenant tout est relatif et ça me convient parfaitement en attendant mieux !
"faute de grives on mange des merles"
 
Dernière édition:

Statistiques des forums

Discussions
312 207
Messages
2 086 232
Membres
103 161
dernier inscrit
Rogombe bryan