IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Déterminer le "parent" où se trouve un control [XL-2007]


Sujet :

Excel

  1. #1
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut Déterminer le "parent" où se trouve un control
    Bonjour à tous,

    Voici ma problématique que je n'arrive pas à résoudre malgré mes recherches.
    Je dispose d'un userform avec 3 pages, dans chaque page, plusieurs controls sont disposés.

    Je cherche à effectuer une boucle sur l'ensemble des controls de l'userform pour effectuer des commandes selon la page dans laquelle le control se trouve.
    Mon souci est que je n'arrive pas à trouver la bonne syntaxe pour déterminer la page "Parent" du control.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim ctrl As Control
    For Each ctrl In Me.MultiPage1.Controls
        Select case true
            Case Me.MultiPage1.["Page parent de ctrl"].index = 0
                blablablaaaaa
            Case Me.MultiPage1.["Page parent de ctrl"].index = 1
                blablablaaaaa
            .....
            .....
        End select
    Next ctrl
    À noter que les ctrl qui sont recherchés peuvent se retrouver eux-même imbriqués dans une frame qui elle-même se trouve sur la page du multipage.
    J'ai bien essayé avec un argument type ctrl.Parent.Name, mais j'ai systématiquement une erreur qui me revient.

    Merci pour vos éventuels éclairages.

  2. #2
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour Tetaye,

    Voilà une question intéressante

    J'ai regardé un peu et c'est possible de descendre vers chaque Page d'un MultiPage et ensuite vers chaque Control d'une Page.
    Mais pas l’inverse à ma connaissance.

    Alors pas de solution direct pour résoudre ton problème mais deux petites idées :

    • Une première que j'utilise personnellement :

    Chacun de mes controls porte un nom particulier par exemple Tb_FrCollab_PgEff qui est TextBox dans la Frame Collaborateur sur la Page Effectif.
    Avec cette méthode je test ensuite le nom du control pour en déduire sont contexte dans l'UF.
    Le problème, on le devine, c'est que s’il y a changement de nom de Control, c'est la m****

    • Une autre idée par le code :

    Il suffit de balayer tes controls en passant par les controls MultiPage
    Exemple à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub test()
        Dim Ctrl_MltPage As Control
        Dim Ctrl As Control
        Dim MltPg As MultiPage
        Dim i&
        For Each Ctrl_MltPage In UserForm1.Controls
            If TypeOf Ctrl_MltPage Is MSForms.MultiPage Then
                Set MltPg = Ctrl_MltPage
                With MltPg
                    For i = 0 To .Pages.Count - 1
                        For Each Ctrl In .Pages(i).Controls
                            Debug.Print "Control : " & Ctrl.Name
                            Debug.Print "Type : " & TypeName(Ctrl)
                            Debug.Print "Page : " & .Pages(i).Name
                            Debug.Print "-----------------------"
                        Next
                    Next i
                End With
            End If
        Next
    fin:
        Set MltPg = Nothing
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut
    Bonjour antonysansh, et merci d'avoir pris le temps de répondre à mon problème.

    La solution de balayer les pages puis les controles était envisagée, mais dans le cadre de mon projet, cela ne collera pas (enfin ça peut coller, mais lourdement).
    En fait, j'ai quelque peu simplifié ce que je cherchais à faire, pour être sur d'être compréhensif, mais du coup, je sans doute trop simplifier les explications concernant environnement général.

    Donc, pour être juste :
    Mon projet s'inscrit dans la création d'une interface de saisie avec 1 MultiPage (3 pages). A la fin de la saisie, les données renseignées dans certains controles (Combobox, ListBox...) sont envoyés sur une page Excel (rien de bien original là dedans).
    Le truc, c'est que pour d'autres raisons, je dois effectuer plusieurs tests de cohérences entre différentes saisies et j'ai donc opté pour passer par une variable tableau qui a pour but de "mettre en mémoire tampon" les données avant de les valider et de les envoyer sur la page excel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Valeurs(5,n) as Variant
    Concernant ce tableau, la première colonne Valeurs(0,n) contient en fait les intitulés des différentes informations que je vais chercher à stocker, intitulés qui sont identiques au nom des controles.name dont ils dépendent.

    Bref, à un moment précis, je dois stocker les données renseignées dans l'userform et pour cela, je pensais que balayer les intitulés sur Valeurs(0,n) et aller chercher la position du contole correspondant serait une procédure plus rapide.
    Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim i as Integer
     
    For i = 0 to UBound(Valeurs,2)
        Select case true
            Case Controls(Valeurs(0 , i)) "se trouve dans la page 0"
                blablablaaaaa
            Case Controls(Valeurs(0 , i)) "se trouve dans la page 1"
                blablablaaaaa
            Case Controls(Valeurs(0 , i)) "se trouve dans la page 2"
                blablablaaaaa
    next i
    Et c'était donc là où je pensais que la fonction .parent aurait pu m'aider.... mais en fait non :/

  4. #4
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Coucou Tetaye,

    J'avais mal cherché la première fois.

    Voilà qui devrait faire ton bonheur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub test()
        Dim ctrl As Control
        Dim Obj As Object
        For Each ctrl In UserForm1.Controls
            Set Obj = ctrl.Parent
            If TypeOf Obj Is MSForms.Page Then
                Debug.Print "Nom : " & ctrl.Name
                Debug.Print "Type : " & TypeName(ctrl)
                Debug.Print "Page : " & Obj.Caption
                Debug.Print "-------------------"
            End If
        Next
    fin:
        Set Obj = Nothing
    End Sub

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Tu peux utiliser la propriété Tag des contrôles pour y stocker les noms des parents et si tu veux remonter jusqu'au parent d'origine, les noms des différents parents peuvent être séparés par un caractère et tu utilise ensuite la fonction Split() pour décortiquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Sub CommandButton1_Click()
     
        'MultiPage1-Page1-Frame1 <--- inscrit dans la propriété Tag du TextBox1
     
        Dim I As Integer
     
        For I = 0 To UBound(Split(TextBox1.Tag, "-"))
     
            MsgBox Split(TextBox1.Tag, "-")(I)
     
        Next I
     
    End Sub

  6. #6
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut
    Bonjour,

    Désolé pour ma réponse tardive, pas d'impolitesse, mais jours précédents chargés.

    @Theze : Merci pour l'idée d'utilisation de la propriété "Tag", je ne connaissais pas du tout celle-ci et en effet, cela va faciliter grandement mes boucles de test !

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo