XL 2010 dimension d'un userform

jm.andryszak

XLDnaute Occasionnel
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
 

piga25

XLDnaute Barbatruc
Bonjour,
peut être comme cela
VB:
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
 

jm.andryszak

XLDnaute Occasionnel
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 …
 

patricktoulon

XLDnaute Barbatruc
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 …
Bonjour
🤔 heu depuis quand les dimensions d'un userform s'expriment en twip?
 

jm.andryszak

XLDnaute Occasionnel
Monsieur Toulon
Alors, ils s'expriment comment ?
Tout le monde n'a pas votre expertise, désolé.

En VBA (Visual Basic for Applications), les dimensions des formulaires sont généralement exprimées en twips. Un twip est une unité de mesure correspondant à 1/1440ème de pouce, soit environ 0,001764 centimètre1. Lorsque vous créez un formulaire, sa hauteur (Height) et sa largeur (Width) sont définies en twips. Cependant, l’affichage peut varier en fonction de la résolution de l’écran de l’utilisateur
 

patricktoulon

XLDnaute Barbatruc
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
démonstration
demo1.gif

j'ai tout dit;)
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Lorsque vous créez un formulaire, sa hauteur (Height) et sa largeur (Width) sont définies en twips.
😲 Voilà une information intéressante. 👍

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).
 

TooFatBoy

XLDnaute Barbatruc
J'ai découvert les twips avec VB4, mais n'ai toujours pas compris à 100 % ce que c'est exactement...
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".
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
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
démonstration
Regarde la pièce jointe 1201295
j'ai tout dit;)

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 )

j'ai repris ton code pour le test

test form6.gif
 

patricktoulon

XLDnaute Barbatruc
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
 

patricktoulon

XLDnaute Barbatruc
@Nicolas JACQUIN
si tu veux quelque chose de plus stable
VB:
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
 

Discussions similaires

Réponses
29
Affichages
1 K

Statistiques des forums

Discussions
313 866
Messages
2 103 082
Membres
108 521
dernier inscrit
manouba