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

Macros et VBA Excel Discussion :

"Frame" en tant que container [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 144
    Points : 223
    Points
    223
    Par défaut "Frame" en tant que container
    Bonjour à tous,

    Je bute sur une problème de fonctionnement, en tout cas de compréhension...

    Sur un Userform, je peux insérer un ActiveX de type Frame. Dès lors, celui-ci peut agir comme un container, c'est à dire que je peux y insérer d'autres contrôles (boutons, label, TextBox, etc) de façon à ce que, par exemple, en changeant la propriété Visible du Frame, je cache ou j'affiche tous les éléments qu'il contient.

    Si je fais de même mais cette fois-ci non plus dans un Userform, mais dans une feuille Excel, le même contrôle ActiveX (MS Forms 2.0 Frame) n'agit plus comme un container. Impossible d'y "inclure" un autre contrôle, ils agissent indépendamment !
    Pire : si je "dépose" un bouton par exemple "sur" mon Frame, il reste visible tant que je suis en mode "création". Dès que je quitte ce mode, il disparait derrière le frame, même après avoir mis celui-ci en arrière-plan et le bouton en 1er plan...

    D'où mes questions :
    - Est-ce normal ou ai-je un poltergeist dans mon Excel ?
    - Y a-t-il une astuce pour conserver le bouton (ou les autres contrôles) topmost par rapport au frame dans une feuille ?
    - Sinon, existe-t-il un contrôle/objet qui puisse agir comme un container, toujours sur une feuille, à l'identique du comportement dans un UF ?

    Merci d'avance de votre aide !

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 127
    Points : 9 956
    Points
    9 956
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ne parlerais-tu pas plutôt d'un contrôle "formulaire" au lieu de ActiveX ?

    tu peux grouper tes contrôles, il suffit de les sélectionner puis dans l'onglet FORMAT >> GROUPER

  3. #3
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    1- dessiner un Frame
    2- clic droit dedans/Edition

    La boite à outils contrôles s'affiche...
    Tu peux maintenant, grâce à cette boite à outils, y dessiner ce que tu veux.

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 430
    Points
    12 430
    Par défaut
    Bonjour Franck

    Je viens grâce à toi (je l'ignorais totalement) de découvrir la méthode pour y parvenir s'agissant d'un Frame sur Feuille de calcul.
    Merci

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 430
    Points
    12 430
    Par défaut
    La découverte de cette méthode va permettre de ranger dans la cave tout un tas de choses. Entre autres :
    -- l'utilisation de userforms comme boîtes de dialogues personnalisées
    -- les codes de positionnement d'un userform à l'emplacement de cellules
    etc ...
    Tout cela devient maintenant totalement inutile

    Je viendrai ici expliquer pourquoi dès que j'aurai terminé des travaux plus importants en cours.

  6. #6
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour Jacques,

    Je connais cette méthode depuis longtemps ma foi...
    Si j'avais pu en percevoir la portée telle que tu l'exposes, je l'aurais livrée bien avant...

  7. #7
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 144
    Points : 223
    Points
    223
    Par défaut
    @joe.levrai = Non non, je parlais bien du Frame des contrôles ActiveX, et non des contrôles de formulaire (que je ne porte pas dans mon coeur, d'ailleurs )

    @pikaju = Mille mercis ! je n'avais même pas remarqué que ce menu existait pour les ActiveX, je le pensais réservé justement aux contrôles de formulaire propres à Excel. Ca fonctionne du tonnerre (sauf qu'on ne peut pas couper/coller un contrôle déjà créé, mais ce n'est qu'un détail...)

    Encore pour l'astuce.

  8. #8
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 144
    Points : 223
    Points
    223
    Par défaut Oui mais non !
    Bon, Jacques risque d'être finalement déçu (comme moi )

    Certes, la méthode fonctionne... mais dès lors qu'on insère un contrôle (même ActiveX) dans une frame sur une feuille, one ne peut plus accéder directement à ses propriétés, mais surtout à ses évènements.

    Dans le code par exemple, un CommandButton inséré dans un Frame n'apparait pas dans la liste des objets, donc impossible de gérer l'évènement Click.

    Je pensais que cet évènement pouvait se faire via le Frame_Click, mais l'évènement ne se déclenche par lors du clic sur le bouton

    Donc OUI, on peut insérer de "trucs" dans un frame, mais NON, impossible ensuite de jouer avec !!!

  9. #9
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Phil'oche Voir le message
    Bon, Jacques risque d'être finalement déçu (comme moi )

    Certes, la méthode fonctionne... mais dès lors qu'on insère un contrôle (même ActiveX) dans une frame sur une feuille, one ne peut plus accéder directement à ses propriétés, mais surtout à ses évènements.
    Soit patient...
    Et Jacques ne risque pas d'être déçu !

  10. #10
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Voici un exemple vite bricolé...

    Dans un nouveau classeur, une feuille Feuil1 et un module de classe nommé Classe1.
    Sur la Feuil1, insérer deux boutons de commande : CommandButton1 et CommandButton2.

    Le code de la Feuil1 (à insérer dans le module de la feuille) :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Option Explicit
     
    Dim Cl As New Classe1
     
    Private Sub CommandButton1_Click()
    Dim Frm As OLEObject
        Set Frm = Worksheets("Feuil1").OLEObjects.Add("Forms.Frame.1")
        With Frm
            .Name = "MyFramePerso"
            .Height = 100
            .Width = 130
            .Left = Range("F5").Left
            .Top = Range("F5").Top
            With .Object.Add("Forms.ComboBox.1")
                .Name = "MyComboPerso"
                .Top = 15
                .Left = 30
                .Height = 20
                .Width = 75
                .Object.Font.Name = "Arial"
                .Object.Font.Size = 12
                .Object.AddItem "Ananas"
                .Object.AddItem "Pomme"
                .Object.AddItem "Poire"
            End With
            With .Object.Add("Forms.CommandButton.1")
                .Name = "MyButtonPerso"
                .Top = 45
                .Left = 30
                .Height = 20
                .Width = 75
                .Object.Font.Name = "Arial"
                .Object.Font.Size = 12
                .Object.Caption = "BOUTON3"
            End With
            .Verb
        End With
    End Sub
     
    Private Sub CommandButton2_Click()
        Set Cl.Boutons = Me.MyFramePerso.Controls("MyButtonPerso")
        Set Cl.Combo = Me.MyFramePerso.Controls("MyComboPerso")
    End Sub
    Le code de la Classe1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
     
    Public WithEvents Boutons As MSForms.CommandButton
    Public WithEvents Combo As MSForms.ComboBox
     
    Private Sub Boutons_Click()
        MsgBox "yes"
    End Sub
     
    Private Sub Combo_Change()
        MsgBox Combo.Text
    End Sub
    Un clic sur le CommandButton1 va créer, au niveau de la cellule F5, un frame avec dedans 1 combobox et un bouton, un clic sur le CommandButton2 va "activer les événements".

  11. #11
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 144
    Points : 223
    Points
    223
    Par défaut
    Merci pour cet exemple, Franck, mais ça ne répond pas tout à fait à la problématique de départ

    Certes, on peut tout à fait créer "à la volée" tous les objets qu'on veut et ensuite accéder à/modifier leurs propriétés/méthodes, mais ça nécessite une sacré dose de tâtonnements, ne serait-ce que pour positionner un bouton dans une frame !!!

    Alors que depuis l'interface (graphique), tout est assez simple.

    D'ailleurs, chose marrante (ou presque...) sur un contrôle inséré dans une frame, lorsqu'on passe en mode "édition", le menu qui s'ouvre est totalement inédit (pour moi !) et la fenêtre de propriétés est totalement différente de la fenêtre de propriétés du même contrôle, s'il est librement positionné dans la feuille

  12. #12
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Phil'oche Voir le message
    Merci pour cet exemple, Franck, mais ça ne répond pas tout à fait à la problématique de départ
    Certes, on peut tout à fait créer "à la volée" tous les objets qu'on veut et ensuite accéder à/modifier leurs propriétés/méthodes, mais ça nécessite une sacré dose de tâtonnements, ne serait-ce que pour positionner un bouton dans une frame !!!
    Alors que depuis l'interface (graphique), tout est assez simple.
    J'ai volontairement compliqué mon exemple pour te montrer.
    C'est encore plus simple avec des contrôles déjà dessinés.

    Voici un exemple plus complexe mais avec les contrôles déjà dessinés en mode création.

    Sur une feuille (dans l'exemple : Feuil4), tu dessines un Frame (Frame1).
    Dedans, dessine et positionne un MultiPage (Multipage1)
    Dans la "Page1" de ce MultiPage, dessine une combobox (ComboBox1) et un bouton de commande (CommandButton1).
    Dans la "Page2" de ce Multipage, dessine un Frame (Frame1) et un bouton de commande (CommandButton2) ==> ce bouton doit être dans la deuxième page ET en dehors du Frame de cette page.
    Dans le Frame de cette Page2, dessine une ListBox (ListBox1).

    Vérifie tous les noms grâce à cette fenêtre propriété si différente de celle habituelle

    Sur une autre feuille (dans l'exemple Feuil2) saisit n'importe quoi dans les cellules A1:A10.

    Insère au projet une classe nommée : ClassBtnInFrame.
    Le code de la Classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Public WithEvents Btn As MSForms.CommandButton
    Public ControleLie As MSForms.Control
     
    Private Sub Btn_Click()
        MsgBox ControleLie.Text
    End Sub
    Dans le Module ThisWorkBook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
     
    Dim MyClass(1) As New ClassBtnInFrame
     
    Private Sub Workbook_Open()
        Sheets("Feuil4").Frame1.Controls("multipage1").Pages(0).Controls("ComboBox1").List = Sheets("Feuil2").Range("A1:A10").Value
        Sheets("Feuil4").Frame1.Controls("multipage1").Pages(1).Controls("Frame1").Controls("Listbox1").List = Sheets("Feuil2").Range("A1:A10").Value
        Set MyClass(0).Btn = Sheets("Feuil4").Frame1.Controls("multipage1").Pages(0).Controls("CommandButton1")
        Set MyClass(0).ControleLie = Sheets("Feuil4").Frame1.Controls("multipage1").Pages(0).Controls("Combobox1")
        Set MyClass(1).Btn = Sheets("Feuil4").Frame1.Controls("multipage1").Pages(1).Controls("CommandButton2")
        Set MyClass(1).ControleLie = Sheets("Feuil4").Frame1.Controls("multipage1").Pages(1).Controls("Frame1").Controls("Listbox1")
    End Sub
    Enregistre ton classeur, ferme, ouvre et teste...

  13. #13
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Un autre exemple?

    Un module de feuille étant un Module de classe (particulier, mais de classe quand même ==> Merci Robert!)

    Dans une feuille, dessine un Frame (Frame1).
    Dans ce Frame, dessine 2 ComboBox (ComboBox1 et ComboBox2) et 3 CommandButton (CommandButton1, CommandButton2 et CommandButton3).
    Vérifie ces noms

    Le module de la feuille :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Option Explicit
     
    Private WithEvents Combo1 As MSForms.ComboBox
    Private WithEvents Combo2 As MSForms.ComboBox
    Private WithEvents Bouton1 As MSForms.CommandButton
    Private WithEvents Bouton2 As MSForms.CommandButton
    Private WithEvents Bouton3 As MSForms.CommandButton
     
    Private Sub Bouton1_Click()
        MsgBox Combo1.Text
    End Sub
     
    Private Sub Bouton2_Click()
        MsgBox Combo2.Text
    End Sub
     
    Private Sub Bouton3_Click()
        Range("A3") = Combo1.Text & "  " & Combo2.Text
    End Sub
     
    Private Sub Combo1_Change()
        Range("A1") = Combo1.Text
    End Sub
     
    Private Sub Combo2_Change()
        Range("A2") = Combo2.Text
    End Sub
     
    Private Sub Worksheet_Activate()
        With Frame1
            .Controls("Combobox1").List = Range("F1:F5").Value
            .Controls("Combobox2").List = Range("G1:G5").Value
            Set Combo1 = .Controls("Combobox1")
            Set Combo2 = .Controls("Combobox2")
            Set Bouton1 = .Controls("CommandButton1")
            Set Bouton2 = .Controls("CommandButton2")
            Set Bouton3 = .Controls("CommandButton3")
        End With
    End Sub
    Clic sur une autre feuille du classeur, puis reviens sur celle-ci et ... Enjoy it !

  14. #14
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 144
    Points : 223
    Points
    223
    Par défaut
    La classe internationale, comme disent les d'jeuns !

    En redéclarant les objets avec le WithEvents, on récupère bien leurs méthodes et évènements !

    Encore un grand merci à toi, la discussion est cette fois résolue "pour de vrai" (comme disent les moins d'jeuns)

+ 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