Précédent   Forum du club des développeurs et IT Pro > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/12/2012, 23h40   #1
piernivet
Invité de passage
 
Homme
Inscription : décembre 2012
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2012
Messages : 4
Points : 0
Points : 0
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 :
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
piernivet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 04h27   #2
NVCfrm
Membre éprouvé
 
Avatar de NVCfrm
 
Homme
Inscription : décembre 2012
Messages : 299
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2012
Messages : 299
Points : 422
Points : 422
Citation:
....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 :
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 :
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 :
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
NVCfrm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 22h31   #3
piernivet
Invité de passage
 
Homme
Inscription : décembre 2012
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2012
Messages : 4
Points : 0
Points : 0
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!
piernivet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2012, 20h59   #4
piernivet
Invité de passage
 
Homme
Inscription : décembre 2012
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2012
Messages : 4
Points : 0
Points : 0
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 :
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
Citation:
- 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!
piernivet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h56.


 
 
 
 
Partenaires

Hébergement Web