'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
Mais qu'est ce qui pourrait bien être à changer d'autre que la date proposée au début de l'affichage, et le titre de la fenêtre ??
je suis curieux quelque chose m'aurait échappéCertainement pas. Je l'ai fait comme ça pour qu'il se suffise à lui même en toutes circonstances
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
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.
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.je pensais que Byval empêchait de modifier le contrôle !? mais apparemment non !?