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
bon ok pigé le principe sauf que ca ne peut pas me convenir parce que j'ai des variables et controls qui sont modifiés dans le activate donc le show doit être exécuté avant
et il faut a tout pris réinitialiser a chaque lancement
j’essaierais demain voir si je peux déplacer les étapes sinon je garderais ma méthode qui a fait ses preuves
 

Roland_M

XLDnaute Barbatruc
Bonjour tout le monde,

chacun sa méthode pourvu quelle soit efficace et surtout compréhensible !?
perso je pratique ainsi, une méthode comme une autre.
j'ai fais un petit modèle avec la routine Posit de Dranreb, ça peut servir à des débutants

Code:
'routine d'appel: UserSaisie.SaisieCTRL1 LbSaisie1
Public Sub SaisieCTRL1(Ctrl As Object)
UserformInitPosObjAppelant Ctrl, PosUserfAppelLeft, PosUserfAppelTop    '### 1/4 ### init PosX/Y de l'user appelant
Me.Show 'déclanche Activate> 2/4 ###
If IsDate(ComboBox1) Then Ctrl = CDate(ComboBox1) Else Ctrl = ComboBox1 '### 4/4 ### colle saisie dans Ctrl appelant
Unload Me
End Sub

'init, exp une liste pour saisie, et positionne l'user
Private Sub UserForm_Activate() '### 2/4 ###
Dim I%: For I = 1 To 5: ComboBox1.AddItem "Choix" & I: Next
PositionneUserform
End Sub

'confirme saisie, hide déclanche la suite après Me.Show
Private Sub CommandButton1_Click() '### 3/4 ###
Me.Hide
End Sub

EDIT: j'ai remis le classeur ! il y avait erreur dans les noms des contrôles !
 

Pièces jointes

  • ExpSaisieUserSurObj.xlsm
    40.4 KB · Affichages: 8
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour Roland_M
Mets toujours ByVal Obj As Object pour un objet passé en argument à une procédure si celle ci ne le réinitialise jamais par un Set, ou si c'est toujours une expression désignant un objet existant qui doit être spécifiée et non une variable objet. Là on tombe sur une erreur de compilation Type d'argument ByRef incompatible.
 

patricktoulon

XLDnaute Barbatruc
bon maintenant que ca c'est bon
j'aimerais bien comprendre comment tu fait pour que
TBnJour soit le bouton cliqué sans module classe
avec simplement
Private WithEvents TBnJour As MSForms.ToggleButton
et un jeu du ctrlactif que je n'ai pas bien compris

un petit exemple simple m’intéresserais
mais dans une autre discussion que je vais ouvrir a ce sujet
la on est en train de polluer celle ci avec nos calendrier ;) ceux qui viendraient chercher une réponse correspondant au titre y perdraient leur cheveux
 

patricktoulon

XLDnaute Barbatruc
Certainement pas. Je l'ai fait comme ça pour qu'il se suffise à lui même en toutes circonstances
je suis curieux quelque chose m'aurait échappé
le code et exemple que j'ai donné est dans l'userform pas de module classe il se suffit a lui même

voila comment demarre le code de mon calendrier
VB:
Public region As Variant    'region 0,1,2,"US","FR","CA"
Public Result As Variant    ' ou date ou ancienne date ou rien
Dim posLeft As Long, posTop As Long, Obj As Object, Oldvalue
Public WithEvents Bout As MSForms.Label    'map pour 42 bouton
Private clavier(43) As New calendar    'tableau d'instance de l'userform


Private Sub UserForm_Activate()
    config
    placementRange Obj
    Oldvalue = Obj.Value
    ldate = IIf(region > 0, "Aujourd'hui", "Todays is") & vbCrLf & IIf(region = 0, Format(Date, "mm/dd/yyyy"), IIf(region = 1, Date, Format(Date, "yyyy-mm-dd")))
    Me.Caption = IIf(region = 0, "Calendar", "Calendrier")

    'mappage pour evenement unique (42 boutons) (intra userform sans module classe)
    For I = 1 To 42: Set clavier(I).Bout = Me.Controls("j" & I): Next

End Sub

'événement unique pour 42 boutons
Private Sub bout_Click(): putDate Bout: End Sub
Public Sub putDate(ByVal q As Object)
    forme = Switch(region = 0, "mm/dd/yyyy", region = 1, "dd/mm/yyyy", region = 2, "yyyy-mm-dd")
    If TypeName(Obj) = "Range" Then
        calendar.Result = DateSerial(calendar.Cbyear.Value, calendar.Cbmonth.ListIndex + 1, q.Caption)
    Else
        calendar.Result = Format(DateSerial(calendar.Cbyear.Value, calendar.Cbmonth.ListIndex + 1, q.Caption), forme)
    End If
    calendar.Hide
End Sub

Public Sub ShowX(Optional ObjX As Object, Optional PlX As Double, Optional Ply As Double, Optional PLeft As Long = 0, Optional Ptop As Long = 0)
'''Me.startupposition = 0
    posLeft = PlX: posTop = Ply
    Set Obj = ObjX
    Me.Show
End Sub
 

Roland_M

XLDnaute Barbatruc
Bonjour,

Bonjour Roland_M
Mets toujours ByVal Obj As Object pour un objet passé en argument à une procédure si celle ci ne le réinitialise jamais par un Set, ou si c'est toujours une expression désignant un objet existant qui doit être spécifiée et non une variable objet. Là on tombe sur une erreur de compilation Type d'argument ByRef incompatible.

j'ai mis comme tu m'as dit !
mais je comprend pas trop la différence !?
je pensais que Byval empêchait de modifier le contrôle !? mais apparemment non !?
 

patricktoulon

XLDnaute Barbatruc
c'est dommage que les animations sont trop grosses + de 3 mega sinon je te montrerais les performances dans la gestion de tache la consomation en UC est tout simplement enorrrrrme
et seulement en l'affichant et restant immobile

si tu veux bien aller voir

le tien

le mien
https://www.cjoint.com/c/IIvow7y5Bah
 

Dranreb

XLDnaute Barbatruc
je pensais que Byval empêchait de modifier le contrôle !? mais apparemment non !?
Non. Les propriétés et méthodes d'un objet sont toujours accessibles dans tous les sens qu'il soit passé ByVal ou ByRef. Ce qui ne peut pas être changé s'il est passé ByVal c'est, quand il s'agit d'une variable, l'exemplaire désigné par l'argument spécifié lors de l'appel. Si la procédure fait de son coté un Set sur l'argument correspondant qu'elle à reçu, ça ne le change que pour elle mais ça ne change pas l'exemplaire affecté à la variable qui a été spécifiée.
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Bonsoir tout le monde,

quand je pense tout le mal que l'on s'est donné surtout Dranreb et Patrick
alors que ces qq lignes suffisent (c'était une suggestion de MJ13 que j'ai utilisé, je ne sais plus dans quelle discussion)
évidemment ce n'est pas sur le petit coin de la cellule ou textbox puisque c'est sur l'endroit précis du clic souris
mais tout de même, ne pourrait t'on pas s'en contenter, sans autre prise de tête !?
évidemment là il y l'API GetCursorPos

Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Type POINTAPI
X As Long
Y As Long
End Type
Dim n As POINTAPI

Public Function GetX() As Long: GetCursorPos n: GetX = n.X * 0.75: End Function
Public Function GetY() As Long: GetCursorPos n: GetY = n.Y * 0.75: End Function

EDIT: en plus l'userform zoomé fonctionne alors que les méthodes retenues(ici) ne fonctionnent pas sur un userform zoom différent de 100
je m'en suis aperçu sur un de mes classeurs qui adapte l'userform à la résolution, la position sur l'objet n'est pas bonne !?
mais bon je les utilise tout de même.
 

Pièces jointes

  • FICH_UserfSurCellObjSouris.xlsm
    79.8 KB · Affichages: 10
Dernière édition:

Statistiques des forums

Discussions
312 211
Messages
2 086 292
Membres
103 171
dernier inscrit
clemm