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 :

Ajout d'une liste variable dans une ComboBox créée par Macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Technicien Data
    Inscrit en
    Mars 2025
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Technicien Data

    Informations forums :
    Inscription : Mars 2025
    Messages : 2
    Par défaut Ajout d'une liste variable dans une ComboBox créée par Macro
    Bonjour,

    Je bloque sur ce sujet depuis ce matin, j'ai un userform avec un nombre de ComboBox variable suivant le nombre d'actions voulues par l'utilisateur.
    Ces ComboBox sont réparties dans 2 Frames :
    - Le responsable de l'action
    - L'action à effectuée.

    Et bien sur, suivant le responsable, la liste d'action est différente...
    Je cherche à définir le "RowSource" de mes combobox de la 2ème frame en fonction du choix fait sur celles de la 1ère Frame.

    J'ai déjà réussi ce genre de chose avec des combobox déjà créées (avec une macro sur la fonction "DropButtonClick" de la combobox en question), mais la je n'y arrive pas, malgré le nommage de mes combobox, vba ne semble pas le prendre en compte. Y'a t'il une astuce que je manque ?

    Ci-joint un fichier exemple de ce que je cherche à faire :
    Dans le 1er onglet juste un bouton de lancement pour choisir le nombre d'action et afficher l'USF.
    Dans le 2ème les listes utilisées.

    Mon code définit la taille du USF en fonction du nombre d'actions, ainsi que le nombre de combobox a afficher.
    Dans l'exemple le bouton valider n'est pas actif pour l'instant, le bouton annuler fait sortir du USF.

    J'ai mis en fin de code du USF, ce que j'ai utilisé dans le cas des ComboBox déjà créées et qui marchait dans ce cas.

    La seule solution que je vois c'est de pré-créer les combobox mais ne les afficher qu'en fonction du nombre d'actions mais ça complexifie pas mal si on veut faire beaucoup d'actions.

    Merci de votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 162
    Billets dans le blog
    2
    Par défaut
    Bonjour Alrys,

    Comme tes Combobox sont créées dynamiquement tu ne peux pas directement créer le code évènementiel (DropButtonClick) pour des objets n'existant pas initialement (ou en tout cas il ne fonctionnera pas)

    des pistes par là
    https://www.developpez.net/forums/d1...ontrols-event/

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Technicien Data
    Inscrit en
    Mars 2025
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Technicien Data

    Informations forums :
    Inscription : Mars 2025
    Messages : 2
    Par défaut
    Merci Tototiti,
    Je n'avais encore jamais utilisé de module de classe, j'essaie de comprendre un peu comment ça fonctionne, ça a l'air pas mal .
    J'ai réussi a obtenir ce que je voulais en mettant la valeur de ma 1ère frame de combobox dans une feuille Excel, mais j'aurais aimé reprendre directement sa valeur sans la reporter, mais je sens que c'est au delà de mon niveau débutant.

    Encore merci pour ton aide, je vais partir la dessus.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Hello,

    Notes:
    Prend l'habitude d'instancier les formulaires avant de les afficher, ca te donneras un meilleur contrôle sur ces derniers (entre autre: pouvoir ajuster son apparence, sans devoir retirer le mode modal).

    Les formulaires sont des classes (si si !), et comme toute classe en VBA / VB6, ils ne possèdent qu'un seul constructeur (l'évènement UserForm_Initialize) qui est dépourvu de paramètres,
    ce qui a priori oblige à accéder aux propriétés de la classe (ce qui viole le principe d'encapsulation), ou passer par des variables globales (ce qui augmente les dépendances, réduit le contrôle des données, et pas mal d'autres désagréments pas sympa du tout).
    Mais tout n'est pas perdu, on peut écrire un pseudo constructeur qui fera la job:
    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
    '// Module UserForm1
     
    Option Explicit
     
        '// variable privée, réservée à l'usage interne du formulaire,
        '// Et qui n'a pas vocation à être accédée depuis l'exterieur
    Private mData As String
     
        '// Pseudo constructeur, je l'appel Create par habitude, mais leur nommage est libre
    Public Sub Create(ByVal Data As String)
        '// Initialisation des variables membre privées
        mData = Data
    End Sub
     
    Private Sub UserForm_Activate()
            '// Mise à jour du texte d'une étiquette
        myLabel.Caption = mData
    End Sub
    Utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub Test()
        Const Data As String = "Something"    '// Variable locale plutôt que globale
     
            '// Instanciation du formulaire
        Dim Frm As UserForm1
        Set Frm = New UserForm1
            '// Appel du pseudo constructeur
        Frm.Create Data
            '// Affichage
        Frm.Show
    End Sub
    Une ligne pour instancier, une ligne pour initialiser, ca peut devenir lourd à force.
    Qu'a cela ne tienne, on peut crée un module "Fabrique" (ou Factory) dont les fonctions membre prendrons tout cela en charge (déléguer les responsabilités), ce qui réduira la quantité de code dans notre fonction principale,
    et augmentera la lisibilité du code source, sa compréhension et facilitera la maintenance (debuggage / mise à jour):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    '// Module Factory
     
    Option Explicit
     
    '// On délègue l'instanciation / initialisation de la classe à une fonction
    '// Ces sordides détails d'implémentation ne nous intéressent pas dans la fonction principale.
    Public Function Create_UserForm1(ByVal Data As String) As UserForm1
        Dim Frm As UserForm1
        Set UserForm1 = New UserForm1
     
        UserForm1.Create Data
        Set Create_UserForm1 = Frm
    End Function
    Utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Sub Test()
        Const Data As String = "Something"
     
        Dim Frm As UserForm1
        Set Frm = Factory.Create_UserForm1(Data)
        Frm.Show
    End Sub

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/03/2024, 09h53
  2. Réponses: 2
    Dernier message: 24/05/2022, 12h51
  3. Réponses: 5
    Dernier message: 17/07/2011, 07h51
  4. probleme actualisation d'une combobox générée par macro.
    Par elombre dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 11/06/2009, 12h38
  5. Réponses: 20
    Dernier message: 04/10/2006, 15h48

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