Microsoft 365 Récupérer l'userform parent d'un controle

Florian53

XLDnaute Impliqué
Bonjour à tous,

Je souhaite récupérer l'objet Userform parent d'un control, j'ai créer des évènements de substitution mais je peux avoir plusieurs UserForm d'ouvert en même temps, et de mes événements il faut que je redirige vers le bon formulaire, je n'arrive à récupérer avec une fiabilité infaillible l'userform parent.

J'ai essayé de créer une fonction qui boucle vers l'élément parent est détecter si l'objet parent est un formulaire alors je le 'Set' et l'affecte à la fonction mais cela ne fonctionne pas tout le temps, est ce que vous avez une astuce pour récupérer le formulaire parent d'un contrôle ? j'ai essayé de regarder par les API , en récupérant le handle de celui ci mais je penses entamer une usine à gaz alors que je penses qu'il doit y avoir un moyen plus simple.

Voici l'exemple pour l'événement de substitution :
VB:
Private Sub CText_Click()
    Check_Txt_Parent(CText).Click_sur_TextBox CText.Caption, CText.Name
End Sub

La fonction qui boucle, en supposant que le nom du formulaire commence par 'UF', mais je ne suis pas fan de la méthode:
VB:
Function Check_Txt_Parent(ct As MSForms.Control)
    Set Check_Txt_Parent = Nothing

    On Error Resume Next
    Set Check_Txt_Parent = ct.Parent

    Do Until Check_Txt_Parent.Name Like "UF* "
        If Check_Txt_Parent.Name Like "UF*" Then Exit Do
        Set Check_Txt_Parent = Check_Txt_Parent.Parent
    Loop
   
End Function

J'ai essayé avec:
TypeName(Check_Txt_Parent)
mais le résultat est le nom de l'userform

Merci
 
Dernière édition:

Florian53

XLDnaute Impliqué
Il faut que je regardes vraiment tes classes et comment je peux en fonction du contrôle ajouté (ex:textbox) forcer un format date ou toute autre format, car je vois qur tu disposes de format dans la fonction 'Add' j'ai essayé d'ajouter 'dd/mm/yyyy' mais pour l'instant ça ne fonctionne pas.

Mais je vais regarder.
 

Dranreb

XLDnaute Barbatruc
Le Casso possède une propriété Valeur qui est convertie normalement en date si c'en est une. S'il y avait besoin de différencier des traitement selon le contrôle concerné il y a aussi une propriété Mode conservée telle que précisée au Add.
 

Dranreb

XLDnaute Barbatruc
Le Format est surtout utilisé par la Property Let Valeur pour transformer la valeur de cellule en texte. Mais il est aussi consulté par la Property Get pour orienter un peu la conversion du texte en valeur de cellule. Voir module CAssoTBx.
 

Dranreb

XLDnaute Barbatruc
Ça n'a pas d'incidence sur la saisie dans la TextBox et n'a guère d'utilité par ailleurs puisque c'est bien de toute façon sous cette forme qu'est affichée dans la TextBox une date affectée à la propriété Valeur de son CAsso support.
 

job75

XLDnaute Barbatruc
Bonjour à tous,

L'UserForm contenant le contrôle peut être stocké dans une variable Public avec le code :
VB:
Private Sub UserForm_Initialize()
Set usf = Me 'variable Public
End Sub
Et dans Module1 :
VB:
Public usf As Object 'mémorise la variable

Sub Test()
MsgBox usf.Caption 'pour tester
End Sub

Sub Ouvrir()
UserForm1.Show 0 'non modal pour pouvoir exécuter la macro Test
End Sub
A+
 

job75

XLDnaute Barbatruc
On peut aussi mémoriser les données dans un Array :
VB:
Private Sub UserForm_Initialize()
memo = Array(CText.Name, Me.Caption) 'variable Public
End Sub
Dans Module1 :
Code:
Public memo 'mémorise la variable

Sub Test()
MsgBox "Contrôle " & memo(0) & " dans " & memo(1) 'pour tester
End Sub

Sub Ouvrir()
UserForm1.Show 0 'non modal pour pouvoir exécuter la macro Test
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour @Florian53
Ne manquez pas de me tenir au courant de vos utilisations de l'objet ControlsAssociés car vous n'en avez probablement pas vu tous les aspects. Vous êtes peut être par exemple passé à coté des méthodes les plus commodes, ValeursDepuis et ValeursVers qui permettent un transfert direct de l'ensemble des valeurs des contrôles pris en charge avec un tableau dynamique 2D d'une seule ligne, ce qui est l'image d'un ListRow.Range.Value.
Il a aussi été conçu pour compléter les possibilités d'un autre objet: le ComboBoxLiées.
La combinaison des deux objets permet le développpement et la mise au point en un temps record d'une interface de consultation et mise à jour d'un tableau Excel.
 

Florian53

XLDnaute Impliqué
Bonjour à tous,

merci pour vos réponses :

@dysorthographie : la frame ne se situe pas dans un multipage, le principal problème est que quand je remonte afin de tester le typename de l'objet, arrivé sur le formulaire, il n'existe pas de typename 'Userform'. J'arrive sur le caption de celui ci avec le typename.

@job75 , j'ai pensé à cette solution mais elle peut être fastidieuse et source d'erreur, et je penses prends aussi de la mémoire en fonction du nombre d'objet ajouté.

@Dranreb : Pris un peu de court par un projet ( rentrée oblige 😅 ), j'ai pris un peu de temps pour regarder les méthodes, j'en ai testé quelques unes ( ÉcrireConstantes,Valeur) et j'ai également vu 'ValeursDepuis' mais je n'ai pas reussi a faire le lien avec la variable 't()', je voulais reprendre un peu de temps hier pour me remettre dessus mais je n'ai pas eu le temps.

Je suis aussi entrain de me remettre dans les modules de classes avec le beau tuto de Mr P.Fauconnier (Une pensée à ce Monsieur), car j'ai un peu de connaissance mais j'ai découvert de nouvelle instruction 'RaiseEvent' , 'Implement' que je ne connaissais pas. donc il faut également que je me mettre à jour pour comprendre l'intégralité de tes modules de classes et leurs fonctionnement.

Encore un grand merci à toi, dès que j'ai du temps dans la semaine, je me remets dessus.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
mais je n'ai pas reussi a faire le lien avec la variable 't()'
Dans ce qui a été fait jusqu'à présent on n'a jamais précisé le numéro de colonne dans le tableau en second paramètre du CAs.Add
Remarque: si un ListColumns a été affecté par un Set à CAs.Colonnes on peut spécifier l'intitulé au lieu du numéro de colonne.
 
Dernière édition:

Statistiques des forums

Discussions
315 126
Messages
2 116 493
Membres
112 765
dernier inscrit
SIDIANW