bonjour
Je voudrais dimensionner un userform en fonction de la largeur d'un range
avec ceci, je suis près de la vérité, mais si quelqu'un avait une meilleure solution je suis preneur
Private Sub UserForm_initialize()
Me.Width = (Range("a1:f1").Width / 1.24) * ((ActiveWindow.Zoom / 100) * 1.24)
End Sub
en vous remerciant
Private Sub UserForm_Activate()
' Définir la plage de cellules dont on souhaite obtenir la largeur
Dim maPlage As Range
Set maPlage = ThisWorkbook.Sheets("Feuil1").Range("A1:F1")
' Calculer la largeur de la plage en points
Dim largeurPlage As Double
largeurPlage = maPlage.Width
' Ajuster la largeur du UserForm
Me.Width = largeurPlage
' Facultatif : ajuster la hauteur du UserForm si nécessaire
' Me.Height = <valeur>
End Sub
Merci
Mais, votre proposition ne résout pas le problème
En fait c'est une histoire de conversion entre les unités de mesure TWIPS pour le Userform et Point pour le Range, si je ne me trompe pas.
C'est pourquoi j'utilise le paramètre 1.24, je n'ai rien trouvé sur internet et pourtant …
Merci
Mais, votre proposition ne résout pas le problème
En fait c'est une histoire de conversion entre les unités de mesure TWIPS pour le Userform et Point pour le Range, si je ne me trompe pas.
C'est pourquoi j'utilise le paramètre 1.24, je n'ai rien trouvé sur internet et pourtant …
les dimensions sont en points de même que les range en lecture
comme ça vite fait un exemple
les fonction pointstoscreenpixels(x ou y) donne un point a l'ecran mais en pixels
donc pour positionner un userform sur une plage de cellule
il te faut recupérer les points left et top de ta plage et convertir en point
en suite width de l'userform =.le width de la plage et pareil pour le height quelques ajustements sont nécessaire selon les versions windows et thèmes actuel de windows
VB:
Sub test()
Dim T#, L#, Z#, EcX#
With ActiveWindow.Panes(1)
L = .PointsToScreenPixelsX([e4].Left) * 0.75
T = .PointsToScreenPixelsY([e4].Top) * 0.75
Z = (.Parent.Zoom / 100) + 0.01
With UserForm1
EcX = ((.Width - .InsideWidth) / 2)
L = L - EcX
.Show 0
.Move L, T, [e4:g14].Width * Z + EcX, [e4:g14].Height * Z
End With
End With
End Sub
J'ai découvert les twips avec VB4, mais n'ai toujours pas compris à 100 % ce que c'est exactement...
À l'époque j'avais cru comprendre qu'un twip dépendait de la résolution de l'écran, mais les explications que j'avais n'étaient pas très claires sur ce point (sans jeu de mot).
re
Bonjour @TooFatBoy
non elles sont en points
twips c'est une unité de mesure comme les points ,cm , inch
twip c'est l' abréviation de twentieth of a point, signifiant vingtième de point.
Aujourd'hui si je recherche le mot "twip", toutes les réponses me disent que c'est 1/20 point, mais à l'époque c'était beaucoup moins clair que ça et Microsoft semblait dire que le twip avait la même taille quelle que soit la résolution de l'écran (si je me rappelle bien).
L'aide de Microsoft dit bien : "20 twips = 1 point".
les dimensions sont en points de même que les range en lecture
comme ça vite fait un exemple
les fonction pointstoscreenpixels(x ou y) donne un point a l'ecran mais en pixels
donc pour positionner un userform sur une plage de cellule
il te faut recupérer les points left et top de ta plage et convertir en point
en suite width de l'userform =.le width de la plage et pareil pour le height quelques ajustements sont nécessaire selon les versions windows et thèmes actuel de windows
VB:
Sub test()
Dim T#, L#, Z#, EcX#
With ActiveWindow.Panes(1)
L = .PointsToScreenPixelsX([e4].Left) * 0.75
T = .PointsToScreenPixelsY([e4].Top) * 0.75
Z = (.Parent.Zoom / 100) + 0.01
With UserForm1
EcX = ((.Width - .InsideWidth) / 2)
L = L - EcX
.Show 0
.Move L, T, [e4:g14].Width * Z + EcX, [e4:g14].Height * Z
End With
End With
End Sub
Bonjour à tous,
Ce matin j'ai vu qu'une bonne aide regardait ce sujet et vu que c'est un sujet que j'aime bien j'ai regardé.
J'ai essayé ton code Patrick, après je sais que selon la config et plein de chose ça change, avec mes codes j'ai le même phénomène.
Je croyais que c'était ma vu qui buggait,
Pourquoi quand on lance la macro, les Width et les Height non pas la même valeur de position ???
( Visuellement ça se voit )
re
bonjour
je l'ai répété 100 fois déjà
depuis win vista ce n'est plus la msmagina.dll et shell32.dll qui gère l'affichage mais la dwmapi.dll
ce qui implique que selon le thème appliqué à window les dimensions sont un peu modifiées
sans compter que si il y a calcul vba arrondi
si tu veux du précis cherche mon code avec l api de la dwmapi.dll
mon code n'est qu'une approximation générique
Sub test()
Dim T#, L#, Z#
Static w#: Static iw#: Static EcX#
If w = 0 Then
Set u = ThisWorkbook.VBProject.vbcomponents("UserForm1")
w = CDbl(u.Properties("Width"))
iw = CDbl(u.Properties("InsideWidth"))
EcX = ((w - iw))
End If
With ActiveWindow.Panes(1)
Z = (.Parent.Zoom / 100)
ppx = 1 / (((.PointsToScreenPixelsX(7200 / Z) - .PointsToScreenPixelsX(0)) / 7200))
L = .PointsToScreenPixelsX([e4].Left) * ppx
T = .PointsToScreenPixelsY([e4].Top) * ppx
With UserForm1
L = L - (EcX / 2) 'adapte ici
T = T - 1 'adapte le "-1" ici
.Show 0
.Caption = "width original : " & w & " dernier width valide : " & .Width & " ecX : " & EcX
.Move L, T, [e4:i14].Width * Z + EcX, ([e4:i14].Height + (EcX / 2)) * Z
End With
End With
End Sub