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
Avez vous vu mon message #6 où j'arrête ma boucle si le Parent n'est ni un Frame ni un Multipage ?
Bonjour danreb
oui j'ai vu je crois qu'il n'y a que cette solution je vais l'adapter a ma version merci
sur le coup les opérateurs en dur m’avaient refroidi d'ailleurs -6 n'est pas bon chez moi

edit: voila maintenant le userform peut etre inconnu seul le textbox est injecté

VB:
Private Sub placementUF()
    Dim EcX#, EcY#, X#, Y#, go as boolean 
    If Not obj Is Nothing Then
        EcX = Me.Width - Me.InsideWidth
        EcY = Me.Height - Me.InsideHeight
        X = obj.Left + obj.Width + EcX: Y = obj.Top + obj.Height
        Do
            If TypeName(obj.Parent) = "Frame" Or TypeName(obj.Parent) = "Page" Then go = True Else go = False
            Set obj = obj.Parent
            If TypeName(obj) = "Page" Then Set obj = obj.Parent: Y = Y + (EcX * 3)
            X = X + obj.Left + (EcX / 2): Y = Y + obj.Top + (EcX + (EcX / 2))
        Loop While go = True
        Me.Left = X
        Me.Top = Y
    End If
End Sub
 

Pièces jointes

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

Roland_M

XLDnaute Barbatruc
Bonjour à tous,

j'ai essayé sur 2007 ça va, mais avec 2016 pas du tout !

mais j'ai constaté ceci, des valeurs différentes, entre 2007 et 2016,
alors que ce sont des formes identiques, donc forcément ça ne collera jamais !

Avec Excel 2007:
Me.Width - Me.InsideWidth = 4
Me.Height - Me.InsideHeight = 21

Avec Excel 2016:
Me.Width - Me.InsideWidth = 12
Me.Height - Me.InsideHeight = 28

et bizarrement à ma manière ce que je met en dur (car les méthodes ci-dessus ne sont pas fiable)
colle parfaitement avec 2007 et 2016

à mon avis c'est un problème insoluble qui vient des incohérences constatées depuis toujours chez Microsost
problème d'incompatibilité que l'on rencontre sans cesse, entre versions windows et versions excel
la preuve, c'est qu'avec microsoft, on passe sa vie à corriger des bugs plus qu'à travailler !

maintenant qu'il y ai 2, 4 ou 6 points d'écart(même 10) sur la position, franchement ça pose aucun problème.
on n'a pas non plus besoin d'une précision scientifique !
ceux qui ont adopté mon calendrier avec ce calcul de position n'ont apparemment aucun problème !?
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
bonjour,

ci-joint le calendrier complet !
REM: suite à tes exemples essais, j'avais commencé à faire des modif par endroits dans ce classeur,
je dois homogénéiser tous ça, je dois remettre de l'ordre, certainement aujourd'hui !

car j'ai les mêmes séparés, pour saisie sur cellule, sur userf, ou une saisie dans un code module tout simplement.
bien que ce soit toujours le même code calendrier pour tous, j'ai fais ça pour les non avertis !

le calendrier a été réalisé à l'époque avec xp excel 2003 ! c'est pour ça la ressemblance !
je trouve que c'était mieux au point vue présentation, c'est pareil pour excel 2016, le ruban, quel horreur rapport à 2007 !

ps: les codes placement divers démarrent aux environs de la ligne 650
le classeur est assez important car très complet et surtout ça s'est alourdi aux fils des demandes sur le forum
de plus ce classeur sert depuis longtemps à mon ancienne entreprise (suis en retraite aujourd'hui) d'où le repère #NVM Roland
je travaille encore aujourd'hui pour eux, plus exactement pour mon fils responsable fabrication (verrerie)

EDIT: j'ai corrigé qq chose qui trainait lors de mes essais !
 

Pièces jointes

  • CalendrierAutonome_RolM_9_Complet.xlsm
    91.4 KB · Affichages: 10
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Je trouve que le décalage vertical, c'est à dire celui à appliquer par rapport à un .Top = 0 du contrôle, est calculé empiriquement dans la procédure du #18.
Je doute que ça fonctionne toujours selon que le Frame ait ou non un Caption, voire une bordure ou n'importe quel SpecialEffect.
Chez moi c'est toujours : Hauteur totale - bord inférieur - hauteur interne, le bord inférieur étant supposé le même que le bord gauche ou droit, c'est à dire la moitié de la différence entre largeur totale et largeur interne.
Bien sûr, faisant la même chose pour un Page dans un Multipage, je fais pour le moment l'impasse sur son éventuelle propriété TabOrientation autre que 0.
 

Roland_M

XLDnaute Barbatruc
re

c'est juste Dranreb !
je viens de faire essai sur frame avec et sans caption forcément il y a un écart !
pas évident !?

EDIT: dans ma boucle, pour l'instant j'en suis là (cette fonction me renvoie simplement X/Y pour position quand Userf est Activate)

While CtrlX.Parent.Name <> fmMe.Name
Y = Y + CtrlX.Parent.Top + (CtrlX.Parent.Height - CtrlX.Parent.InsideHeight)
X = X + CtrlX.Parent.Left + 2 '< 2 reste à voir bord réel !? mais ça c'est moins mêchant !
Set CtrlX = CtrlX.Parent
Wend
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Mais arrête de faire préciser l'UFm conteneur, puisqu'on finit par tomber dessus en prenant les Parent successifs, et qu'on peut considérer que ce l'est si ce n'est ni un Frame ni un Multipage. Encore que ça pourrait aussi être un OLEObject ou le Worksheet qui le contient, je ne sais pas, et je ne sais plus très bien comment ça réagit dans ce cas…
Et quand c'est un UserForm le bord réel c'est aussi (.Width - .InsideWidth) / 2
 

Roland_M

XLDnaute Barbatruc
Et quand c'est un UserForm le bord réel c'est aussi (.Width - .InsideWidth) / 2

effectivement, ça je viens de le faire !
et j'ai solutionné aussi pour la hauteur frame avec ou sans caption !

par contre tu dis:
"Mais arrête de faire préciser l'UFm conteneur, . . .

c'est à dire ou par rapport au petit bout de code que j'ai mis ?
(fmMe.Name, fmMe c'est l'object que j'ai nommé ainsi ! fm pour formulaire )
 

Dranreb

XLDnaute Barbatruc
Oui, je me souvient que tu es obligé de spécifier en paramètre quelque part l'UserForm où le calendrier doit être positionné.
Moi je suis pour les dispositifs auto-démerdants. Si ou veut le positionner par rapport à un contrôle on spécifie seulement ce contrôle, et il doit se débrouiller tout seul pour trouver comment le positionner. Je ne dis pas que j'y arrive dans tous les cas. Je sais déjà que ça se passe mal par rapport à une plage de cellules avec l'affichage avec mise en page ou quand les volets sont figés. Alors vous pouvez essayer d'améliorer cette partie là. En revanche ça se passe bien par rapport à une plage en affichage normal et celui avec sauts de pages quel que soit le Scroll et le Zoom quand les volets ne sont pas figés.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re bonjour a tous les deux
@Roland
bon je viens de le tester tel que tu l'a donné
la position sur cells avec w7 et 2007 ou 2013 ca va pas
la position sur activ x : plus il y a des parents(frames ou autre) plus tu perds le top et pour le left bon c'est pas vraiment méchant mais on est en retrait un peu d'ou dans mon model l'ajout de ecx a chaque top pour le parent

j'ai testé ton fichier tel quel ;)
tu permet que je re code la partie calendrier ?
 

Roland_M

XLDnaute Barbatruc
Bonjour,

ben oui je veux bien, on verra !?

mais je ne comprend toujours pas pourquoi chez toi Win7 excel 2007 . . . ça ne fonctionne pas !
et que chez moi, config idem, ainsi que plusieurs utilisateurs du forum, plusieurs ordi à l'usine de mon fils ça fonctionne ! étonnant non ?
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
RE
Comme j'ai une tele 82cm en guise d’écran je suis en 120 DPI et non en 96 c'est peut être pour ça
une autre chose aussi étant donné que tu a des spinbutton presque les combo sont inutiles
j'ai commencé a re coder le tien
j'ai déjà codé les index (combo et spinbutton )par rapport a la date inscrite ou date si obj vide
 

Roland_M

XLDnaute Barbatruc
une autre chose aussi étant donné que tu a des spinbutton presque les combo sont inutiles

effectivement mais c'était volontaire, je considère que c'est un plus ! après c'est une histoire de choix !

concernant les DPI j'aurai pu arranger ça avec les API
mais je fais tout sans API pour une histoire de compatibilité dans le temps !
pour l'instant il est vrai que on s'en sort avec Ptrsafe . . . concernant 32 et 64bits


EDIT: je viens trouver ceci, dans une de tes discutions avec unparia (sa proposition)
Private Sub PourEssai()
MsgBox dpi & vbCrLf & "et donc " & dpi() / 72
End Sub
Private Function dpi() As Double
With ActiveSheet.Range("A" & Rows.Count)
anc = .RowHeight
.RowHeight = 100.25
If (.Height - Int(.Height)) * 100 Mod 25 = 0 And (.Height - Int(.Height)) > 0 Then
dpi = 96
ElseIf (.Height - Int(.Height)) * 1000 Mod 200 = 0 And (.Height - Int(.Height)) > 0 Then
dpi = 120
ElseIf (.Height - Int(.Height)) Mod 100 = 0 Then
dpi = 144
ElseIf (.Height - Int(.Height)) * 1000 Mod 125 = 0 Then
dpi = 192
End If
.RowHeight = anc
End With
End Function
 
Dernière édition:

Statistiques des forums

Discussions
311 711
Messages
2 081 794
Membres
101 817
dernier inscrit
carvajal