Autres toutes version excel tester le calendar en mode modal et non modal sur range ou control dans userform

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
j'ai pris le temps ce matin de voir un peu ce que je pourrais faire pour mon calendar
en effet il m'est souvent venu des demandes quand au fait que quand l'object appelant et fils d'un userform non modal
et effectivement mon calendar qui est en mode responsif(MODAL)(se comporte comme un msgbox) n'est pas compatible forcement
le conflit d'affichage d'un usf modal par dessus un usf non modal est déclenché
j'ai donc ici recommencé tout a zero (c'est une ébauche)mais il est parfaitement fonctionnel
dites moi ce que vous en pensez
on verra après pour les couleurs et les fériés les langue et region et tout le tointoin
merci pour les retours et suggestion a venir
 

Pièces jointes

  • calendar light.xlsm
    34.4 KB · Affichages: 42
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
je l'ai dit, pour moi, ça n'a rien à voir avec un problème de bordures. C'est un problème de .Top et .Left du Userform.
non @Dudu2 au contraire
ce que tu vois a l’écran n'est pas ce qui est calculé c'est tout
avec mon délire j'ai juste un peu fait joujou avec des bordures hyperlarge pour te montrer ce que fait windows ,bon d'accords en exagerant mais c'est exactement ça
juste pour te montrer que quand tu fait me.left=x
a ce x tu rajoute la gestion des fenêtre windows de la user32 ,dwmapi,shell et uxtheme en interne

c'est bien la dwmapi.dll qui te permettrais de rectifier le calcul mais je ne me souvient plus de quel api dans cette dll
tiens pour le fun
imaginons que la gestion fenetre windows elargisse comme ça les bordures
parti de la que veux tu faire avec le width et insidewidth ou height et insideheight
tu peux rien faire avec des calculs de base
demo.gif
 

Dudu2

XLDnaute Barbatruc
Le problème il est là:
VB:
Sub a()
    Dim PointToPixel As Double
    Dim PixelToPoint As Double
    
    With ActiveWindow.ActivePane
        PointToPixel = (.PointsToScreenPixelsX(Application.InchesToPoints(1)) - .PointsToScreenPixelsX(0)) / Application.InchesToPoints(1)
        PixelToPoint = 1 / PointToPixel
        'MsgBox PixelToPoint
    End With
    
    With UserForm1
        .StartUpPosition = 0
        .Left = ActiveWindow.PointsToScreenPixelsX(0) * PixelToPoint + [A1].Left
        .Top = ActiveWindow.PointsToScreenPixelsY(0) * PixelToPoint + [A1].Top
        .Show
    End With
End Sub
1636652782774.png
 

patricktoulon

XLDnaute Barbatruc
et a ma facon c'est bonnet blanc blanc bonnet
VB:
Sub a()
     Dim PixelToPoint As Double

    With ActiveWindow.ActivePane
        PixelToPoint = (.PointsToScreenPixelsX(72) - .PointsToScreenPixelsX(0)) / 72
    End With

    With UserForm1
        .StartUpPosition = 0
        .Left = ActiveWindow.PointsToScreenPixelsX(0) / PixelToPoint
        .Top = ActiveWindow.PointsToScreenPixelsY(0) / PixelToPoint
        .Show
    End With
End Sub
1636653881649.png
 

Dudu2

XLDnaute Barbatruc
Ok, j'ai bien vu que chez toi, c'est pas le même positionnement.
La question reste donc ouverte... Comment déterminer ces marges de positionnement sans faire de l'empirisme en test visuel (ce que j'ai fait pour mon environnement et qui ne marche pas pour le tien)?

A moins qu'il n'y ait en gros que 2 versions, la tienne et la nôtre et qu'on puisse déterminer ça via le no d'OS.
 

patricktoulon

XLDnaute Barbatruc
essaie ca mais remplace "+" par "-"
VB:
Sub a()
     Dim PixelToPoint As Double

    With ActiveWindow.ActivePane
        PixelToPoint = ((.PointsToScreenPixelsX(72) - .PointsToScreenPixelsX(0)) / 72)
    End With

    With UserForm1
        .StartUpPosition = 0
        .Left = (ActiveWindow.PointsToScreenPixelsX(0) / PixelToPoint) + (.Width - .InsideWidth)
        .Top = (ActiveWindow.PointsToScreenPixelsY(0) / PixelToPoint) + (.Width - .InsideWidth)
        .Show
    End With
End Sub
chez moi c'est nikel comme ça
mais normalement ca ne devrai pas car l'entier -le inside = l'epaisseur des deux bordure des deux cotéé
comme quoi c'est juste de l'approximatif a 1 ou 3 point pres
quand j'aurais retrouvé ma discussion sur dvp je te donnerais les éléments
 

patricktoulon

XLDnaute Barbatruc
4.7 et 3.2 exactement
ps tu a oublié de calculer le zoom dans tes model
perso j'en ai fait une fonction
VB:
Sub a()
pos = PointZeroGrille(UserForm1)
    With UserForm1
        .StartUpPosition = 0
        .Left = pos(1) + [c1].Left * pos(3)
        .Top = pos(2)
        .Show
    End With
End Sub

Function PointZeroGrille(usf)
    Dim PixelToPoint As Double, z, pos(1 To 3)
    With ActiveWindow
        PixelToPoint = ((.ActivePane.PointsToScreenPixelsX(72) - .ActivePane.PointsToScreenPixelsX(0)) / 72)
        z = .Zoom / 100
        pos(1) = (.PointsToScreenPixelsX(0) / PixelToPoint) * z + (usf.Width - usf.InsideWidth)
        pos(2) = (.PointsToScreenPixelsY(0) / PixelToPoint) * z + (usf.Width - usf.InsideWidth)
    pos(3) = z
    End With
PointZeroGrille = pos
End Function

mais attention là on prends pas en compte le pane il peut y en avoir 1 à 4
 

Dudu2

XLDnaute Barbatruc
En fait tu as sans doute bien raison sur l'origine du problème, mais il ne se manifeste pas chez moi comme chez toi.
Ci-dessous je parle ici pour mon cas Windows 10. J'ai tout essayé avec des position de curseur et les API, etc...

Le UserForm est bien techniquement à l'endroit où il doit être mais visuellement il n'y est pas.
De plus sa largeur (et hauteur) technique est plus grande que sa largeur (et hauteur) visuelle.

Il ne peut y avoir qu'une seule cause évidente à ce phénomène: les marges ne sont pas affichées !!!

A la conception:.................................................A l'affichage:
1636662725782.png
1636662794568.png


Et donc il y a 2 solutions pour le faire cadrer exactement à l'emplacement voulu:
- Faire apparaître les marges (je ne sais pas faire, il faut rechercher),
- Décaler vers la gauche la partie intérieure qui seule s'affiche de la largeur de la marge non affichée.

Quant à la largeur (et hauteur) technique plus grande que la largeur visuelle, elle peut être réduite des marges qui ne s'affichent pas pour le cadrage d'autres objets.

Ça ne règle en rien le décalage de @patricktoulon (Windows 7 ?) où au contraire il faut décaler vers la droite et vers le bas, comme si au contraire, le UserForm se positionnait par rapport à sa zone intérieure ce qui est peut-être bien le cas, contrairement à ce que j'ai dit plus haut.
 

Pièces jointes

  • VBA Positionner un Objet sur un Objet.xlsm
    71.7 KB · Affichages: 2
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
c'est normal que le probleme soit inversé chez toi et chez moi
chez toi d'origine dans vbe le userform a des bordure epaisses et a l'affichage il a des bordures fine
chez moi c'est l'inverse
1636670080509.png


conclusion chez toi c'est
VB:
.left -(application.usablewidth-activewindow.visiblerange.width)
'le top on le change pas la caption est plus haute

chez moi c'est
Code:
.left +(application.usablewidth-activewindow.visiblerange.width)
 .top+(application.usablewidth-activewindow.visiblerange.width)

reste simplement a corriger le switch dans ma méthode de replacement
 

Dudu2

XLDnaute Barbatruc
chez toi d'origine dans vbe le userform a des bordure epaisses et a l'affichage il a des bordures fine
chez moi c'est l'inverse
On peut donc en conclure que le UserForm est positionné par rapport à son Design VBE et que à l'affichage après positionnement, les marges sont soit ajoutées (pour toi) soit retirées (pour moi).
C'est un grand pas dans la compréhension du problème !
Edit: A ceci près que je trouve étrange que chez toi, les marges latérales G et D ajoutées ne décalent pas le UserForm (en 0,0 la marge G vient mordre dans les Headings de lignes) alors que la marge horizontale ajoutée en bas décale le UserForm vers le haut (en 0,0 il vient mordre dans les Headings de colonnes).

Dans les 2 cas, il n'y a donc pas de cohérence entre la position technique du UserForm et sa position visuelle Et au moins dans mon cas (Windows 8+ ?) pas de cohérence entre ses dimensions techniques et ses dimensions visuelles.

La question est maintenant de savoir comment différencier les 2 cas !
Lié à la version Windows et bits ? Lié à la version Office et bits ? Il faudra peut-être lancer une enquête auprès des XLDnautes.
Ou peut-être avec le GetWindowLong ? Chez moi
1636695146145.png


Tu peux essayer chez toi ? (j'y crois pas trop mais qui sait avec l'extended style ?!)
 

Pièces jointes

  • GetWindowLong.xlsm
    23.9 KB · Affichages: 4
Dernière édition:

Statistiques des forums

Discussions
315 098
Messages
2 116 190
Membres
112 679
dernier inscrit
Yupanki