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 :

Insertion d'un nombre variable de checkbox dans un formulaire


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Par défaut Insertion d'un nombre variable de checkbox dans un formulaire
    Bonjour.

    J'ai un formulaire (il s'appelle Userform1), qui liste les onglets présents dans le classeur et affiche une listbox qui permet de choisir soit tous les onglets soit un seul. Ca donne ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     'ListBox des Entités
        ListBox1.AddItem "TOUS"
        For i = 1 To Sheets.Count
        If Sheets(i).Name <> "Exception1" And Sheets(i).Name <> "Exception2 etc..." And Sheets(i).Name <> "TOUS" Then
        ListBox1.AddItem UCase(Sheets(i).Name)
        End If
        Next i
        ListBox1.Text = "TOUS"
    le nombre d'exceptions est fixe. Par contre le nombre donglets peut être variable
    Ce code fonctionne très bien (notez pour les puristes que j'aurais pu créer une liste d'exceptions et utiliser un find, mais à l'époque ou je l'ai écrit je ne connaissais pas, et comme ca marche...)
    Mais maintenant j'ai besoin de l'améliorer et d'en faire, au lieu d'une liste défilante, une liste de checkbox
    A savoir
    - une checkbox TOUS
    - autant de checkbox que d'onglets hors exceptions
    - une commande sur les clicks qui dit que quand je coche tous je décoche toutes les autres et quand je clique une des entités, si TOUS est coché, il se décoche

    j'ai cherché, mais la fonction qui me permettra de créer des checkbox en nombre variable dans un userform devient un niveau de vba qui dépasse un peu mes performances d'autodidacte

    Si une bonne ame s'égare sur cette discussion... Merci d'avance

  2. #2
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    ....j'ai cherché, mais la fonction qui me permettra de créer des checkbox en nombre variable dans un userform devient un niveau de vba qui dépasse un peu mes performances d'autodidacte...
    Mais non! Un peu d'effort, d'exercices, de curiosité c'est tout.

    Au préalable salut!
    Pour te prendre au mot créer des contrôles pendant l'éxécution nécessite que tu aprennes à bien connaître tes contrôles. Pas besoin de naviguer pour ça.
    L'aide installée avec l'application est largement instructif sur les propriétés et méthodes de chaque contrôle ou collection d'objets.
    Si tu veux vraiment t'embarquer il faut que tu t'entraînes à fouiner dans l'aide fournie.

    Bon si tu veux des bouts de codes à coller ou adapter à tes besoins commençons:
    Crée un userform et plantes-y en mode design 2 ToggleButton + 1 Listbox.
    Lances le code. Clic sur Listbox1, puis 1 toglebutton et clic sur la listbox.


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        Dim Tb(), i As Integer
        ReDim Tb(0)
    'ListBox1.MultiSelect a 3 constantes
    'ListBox1.ListStyle à 2 constantes que tu verras à quoi elles servent si tu
    'prends la peine de les manipuler. l'un affiche la liste dans un affichage ordinaire.
    'l'autre l'affiche sous forme de checkbox ou optionbutton en fonction de la valeur MultiSelect 
     
        If ListBox1.MultiSelect = fmMultiSelectMulti Then
            For i = 0 To ListBox1.ListCount - 1
                If ListBox1.Selected(i) Then 'Selected: une propriété à utilsé uniquement quand la propriété  fmListStyleOption=fmListStyleOption
    'sinon pour une liste normale les propriétés listindex et value  sont suffisantes.
                    ReDim Preserve Tb(0 To UBound(Tb) + 1)
                    Tb(UBound(Tb)) = ListBox1.List(i)
                End If
            Next
            Tb(0) = "Vous avez selectionné le(s) choix suivant(s):"
            MsgBox Join(Tb, Chr(13) & "_ ")
        Else
            MsgBox ListBox1.Text & " est la sélection n°: " & ListBox1.ListIndex + 1
     
        End If
     
    End Sub
     
    Private Sub ToggleButton1_Click()
        If ListBox1.ListStyle = fmListStylePlain Then
            ToggleButton1.Caption = "Liste normale"
            ListBox1.ListStyle = fmListStyleOption
            ListBox1.MultiSelect = fmMultiSelectSingle
            ToggleButton2.Caption = "Liste à cocher"
        ElseIf ListBox1.ListStyle = fmListStyleOption Then
            ToggleButton1.Caption = "Liste choix"
            'ToggleButton2.Caption = "Liste à cocher"
            ListBox1.ListStyle = fmListStylePlain
            ListBox1.MultiSelect = fmMultiSelectSingle
        End If
    End Sub
     
    Private Sub ToggleButton2_Click()
        If ListBox1.MultiSelect = fmMultiSelectExtended Then
            ListBox1.MultiSelect = fmMultiSelectMulti
            ToggleButton2.Caption = "cliquez pour une selection unique"
        ElseIf ListBox1.MultiSelect = fmMultiSelectMulti Then
            ListBox1.MultiSelect = fmMultiSelectExtended
            ToggleButton2.Caption = "cliquez pour une selection multiple"
        End If
    End Sub
     
    Private Sub UserForm_Initialize()
        Dim i
        ToggleButton1.Caption = "Liste choix"
        ToggleButton2.Caption = "Selection unique"
        CommandButton1.Caption = "Ajouter Chekbox"
        For i = 1 To 10
            ListBox1.AddItem "Jeu " & 1
        Next
     
    End Sub
    'en fait ce qui est fortement recommandé pour les checkbox ou optionbutton
    ' cest d'utiliser une listbox.  ça te fait moins de réécriture comme pour chaque option cliqué un évènement dont le code ressemble fortement aux autres. moins d'objets chargés en mémoire. traitement très souple dans les propriétés comme tu as pu le constater dans ce brouillon conçu spécialement pour te permettre d'apprécier l'utilité de ce vieux classique.
    Passons à la création pendant l'éxécution.
    Cela suppose que tu dois avoir un cadre frame si tu veux mis en forme pour ne pas être distingué sur la feuille. la propriété visible, afin de grouper tes nouveaux contrôles.
    Avoir un code d'évènement déjà écrit pour gérer les nouveaux venus. Le contener Frame gère les évènements tels que le click comme tous les contrôles. Une boucle pour balayer les chekbox présents afin d'identifier celui qui a la valeur True. Je ne ferais ce code à ta place.
    Pourquoi?
    Parce qu'il faut bien que tu apprennes. et parce que je nai pas que ça à faire.
    le plus gros c'est de te montrer les techniques:
    'Un contrôle à son ajout dans un Userform, l'évènement suivant se déclenche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_AddControl(ByVal Control As _
        MSForms.Control)
     
        me.caption="Un nouveau contrôle a été ajouté"
    End Sub
    en mode design ajoute un commandbutton à ton userform colles ce texte dans le code module.
    le code est en deux parties dont l'une est en commentaires. quand tu auras suffisamment manipulé une portion, tu le mets en commentaires. exécution pas à pas avec F8. Dans la barre des taches de Windows clic pour afficher les fenêtres côte à côte et observer l'action de chaque ligne de code sur 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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    Private Sub CommandButton1_Click()
        Dim i As Integer, Choice As CheckBox, cnt As Control, nm As String, t As Integer
        'ajouter un contrôle
     
        Set cnt = Frame1.Controls.Add("Forms.CheckBox.1", "Chekbox2", True)
        'l'affecter à une variable pour accéder à certaines propriété peut être utile
        '
        With cnt
            .Name = ListBox1.List(i)
            .Tag = "x"
            .Move 10, 10, 50, 20 'disposer le contrôle dans son contenaire Left:=10,Top:=10,Width:=50,Height:=15
     
        End With
        Controls(cnt).Caption = ListBox1.List(i) 'pour accéder à certaines propriété non renvoyé par la variable cnt on utilise la collection controls contenaire de tous les contrôles
        'Controls(cnt).GroupName = "Auto_check"
        Set cnt = Nothing
        'pour supprimer un controle
        Frame1.Controls.Remove (Frame1.Controls.Count - 1) 'supprime le dernier index de la collection
     
        'Frame1.Controls.Clear 'supprime tous les controles de la collection
     
        'créer des controles dans une boucle.
     
        'Dim Lt As Integer, Tp As Integer, MyMenu As ComboBox, Cn As Control, nom As String
        'nom = "ComboBox"
        'For i = 1 To ListBox1.ListCount
        '   nom = nom & i
        '   Set Cn = UserForm1.Controls.Add("Forms.ComboBox.1", nom, True)
        '    With Controls(Cn.Name)
        '        .BackColor = RGB(155, 155, 150) 'une couleur gris sombre
     
        '        .Name = ListBox1.List(i - 1)
        '        .Tag = "x"
        '        .Visible = True
        '        .SpecialEffect = fmButtonEffectSunken
        '        .Move 10, i * 20 + 35 'dispose le contrôle dans son contenaire Left:=10,Top:=10,Width:=50,Height:=15
        '    End With
        'Next
        'retirer les controls de la collection dans une boucle
        't = 1
        'For i = 0 To Controls.Count - 1
            'une erreur peut être généré avec cette methode. je te laisse découvrir le contrôle provoquant l'erreur
        '    If TypeOf Controls(i) Is ComboBox Then
        '        If Controls(i).Tag = "x" Then
        '            Controls.Remove Controls(i).Name
        '            
        '        End If
        '    End If
        'Next
     
     
    End Sub

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Par défaut
    Oulalah, que j'ai hate d'être à demain pour essayer tout ça

    Merci, c'est vraiment super sympa d'avoir passé du temps à me filer tout ça. j'ai énormément de mal avec l'aide embarquée d'excel, je la trouve pas ergonomique du tout

    Bon, vivement demain. Je reviendrai sur la discussion pour confirmer que je m'en suis sorti!

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Par défaut
    Merci, en fait tu as allé beaucoup plus loin que mes humbles besoins
    Je n'ai utilisé que ton premier code-exo (un peu buggué, au passage, mais rien de grave)

    J'aboutis donc très rapidement à
    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
    ListBox1.ListStyle = fmListStyleOption
    ListBox1.MultiSelect = fmMultiSelectMulti
     
        'ListBox des Entités
        ListBox1.AddItem "TOUS"
        For i = 1 To Sheets.Count
        If Sheets(i).Name <> "Exception1" And Sheets(i).Name <> "Exception2 etc..." And Sheets(i).Name <> "TOUS" Then
        ListBox1.AddItem UCase(Sheets(i).Name)
        End If
        Next i
        If ListBox1.ListStyle = fmListStylePlain Then
          ListBox1.Text = "TOUS"
        Else
          ListBox1.Selected(0) = True
        End If
    Ce qui me permet(tra) en fonction des utilisateurs, de revenir facilement à un fmListStylePlain, si la nouvelle présentation déplait

    Avec cela, plus besoin d'envisager un ajout dynamique de checkbox, puisque la listbox me les donnes, impecc!

    Par contre, là ou je suis à la peine, c'est sur le listbox1_change, pour aboutir sur le sujet
    - une commande sur les clicks qui dit que quand je coche tous je décoche toutes les autres et quand je clique une des entités, si TOUS est coché, il se décoche
    pour l'instant j'en suis aux conclusions suivantes
    - fmMultiSelectMulti rend le listbox_click inopérant
    - il faut que je trouve un moyen de désactiver les _click et _change de mon formulaire quand je l'initialise (pour des raisons encore obscures Application.EnableEvents =false est inopérant) sinon ca met le boxon
    - en lien avec le point ci-dessus, pour atteindre mon but, il faut aussi que je trouve à ne pas faire du _change récursif dans mon listbox1_change

    tout ca est lié, je trouverai
    Merci encore en tout cas!

Discussions similaires

  1. Copier un nombre variable d'images dans des sous-répertoires
    Par member159 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 15/05/2012, 18h07
  2. [XL-2003] Insertion d'un nombre variable de lignes
    Par mout94 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/04/2010, 19h21
  3. Variable masculin feminin dans un formulaire
    Par artxtra dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/03/2007, 15h41
  4. liste de checkbox dans un formulaire
    Par aktos dans le forum Langage
    Réponses: 3
    Dernier message: 26/01/2007, 17h48
  5. [MySQL] Une histoire de CHECKBOX dans un formulaire
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/10/2006, 14h24

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