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 :

plusieurs optionbutton pour une lisbox [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Points : 163
    Points
    163
    Par défaut plusieurs optionbutton pour une lisbox
    Bonjour à tous

    j'ai un petit souci avec l'alimentation d'un listbox.
    Sur un userform, j'ai 13 optionbutton et une listbox

    un choix d'optionbutton doit permettre d'alimenter la listbox différemment
    voilà mon code

    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
    Sub UserForm_Initialize()
    Set shl = Sheets("Liste")
    srep1 = shl.Cells(2, 4)
    srep2 = shl.Cells(3, 4)
    End Sub
     
    Sub opt2_Click()
    If opt2 = True Then
    srep = srep1
    End If
    liste
    End Sub
    Sub opt3_Click()
    If opt3 = True Then
    srep = srep2
    End If
    liste
    End Sub
    Sub liste()
    lbox1.Clear
        derlig = shl.Range("B1048576").End(xlUp).Row
         For y = 2 To derlig
              If shl.Cells(y, 3) = srep Then
                  lbox1.AddItem (Cells(y, 2))
              End If
         Next y
     
    End Sub
    ca marche pour l'optionbutton 1 mais pas le 2 ???

    une idée ??
    cordialement

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Pierre, bonjour le forum,

    Tes variables ne sont pas déclarées on ne connait donc pas leur portée... Puis, sans le fichier qui va avec le code, nous n'avons aucune idée de ce que valent les différentes variables et il nous est difficile de t'aider...
    À plus,

    Thauthème

    Je suis Charlie

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Points : 163
    Points
    163
    Par défaut
    Bonjour

    ci-joint avec le fichier et le code dans l'usf2
    merci de t'intéresser à mon pb
    @+
    Fichiers attachés Fichiers attachés

  4. #4
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonsoir Pierre, bonsoir le forum,

    J'ai renommé ou ordonné les 13 OptionButtons. Je leur ai attribué une propriété [Tag] qui correspond à la ligne à laquelle ils se réfèrent (Opt1 => 2, Opt2 => 3, etc), voir le code du module de classe qui récupère cette ligne...
    J'ai déplacé la procédure liste dans le module Module1. J'ai déclaré les variables publiques shl et srep dans un module standard (car dans le module d'une UserForm ou d'un Onglet ça ne marche pas pour Public)...
    Pour éviter d'écrire 13 fois la procédure Click de tous les OptionButtons, j'ai préféré utiliser une module de classe que j'ai nommé ClassOB (Classe des OptionButtons).
    Le principe est relativement simple. À l'initialisation de l'Userform, on rentre dans un tableau (que j'ai nommé TOB dans ton fichier) tous les contrôles dont on veut qu'ils fassent partie de la classe ClassOB. Dans ton cas c'est facile, ce sont tous les OptionButtons. Ensuite, dans le module de classe on définit le noms de ces instances (OB dans ton fichier). Puis, on définit l'action de l'instance avec OB_Action (OB_Click dans ton fichier). ce code sera parcouru chaque fois qu'un contrôle faisant partie du tableau TOB sera cliqué (cocher ou décoché).

    Le code d'initialisation de l'UserForm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private TOB(1 To 13) As New ClassOB 'déclare le tableau TOB (Tableau des OptionButtons) de la classe ClassOB
     
     
    Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
    Dim I As Byte 'déclare la variable I (Incrément)
     
    Set shl = Sheets("Liste") 'définit la variable shl (déclarée publique dans le module "Module1"
    For I = 1 To 13 'boucle sut les 13 OptionButtons
        Set TOB(I).OB = Me.Controls("Opt" & I) 'ajoute l'OptionButton au tableau TOB
    Next I 'prochain OptionButton
    End Sub
    Le code pour le Module1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public srep As String
    Public shl As Object
     
     
    Sub liste()
    usf2.lbox1.Clear 'vide la listbox "lbox1"
    derlig = shl.Range("B1048576").End(xlUp).Row 'définit la dernière ligne éditée derlig de la colonne B de l'onglet shl
    For y = 2 To derlig 'boucle sur tous lignes de 2 à derlig
        'si la cellule en colonne C est égale à la variabel srep, ajoute la cellule en colonne B à la listbox "lbox1"
         If shl.Cells(y, 3) = srep Then usf2.lbox1.AddItem (Cells(y, 2))
    Next y 'prochaine ligne de la boucle
    End Sub
    Le code du module de classe ClassOB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public WithEvents OB As MSForms.OptionButton 'définit le nom OB (OptiobButtons) des instances de la classe ClassOB
     
     
    Private Sub OB_Change() 'au changement d'une instance OB de la classe
    If OB = True Then srep = shl.Cells(CInt(OB.Tag), 4).Value 'si l'instance OB est coché, définit la variable srep
    Module1.liste 'lance la procédure "liste" du module "Module1"
    End Sub
    Le fichier :
    Fichiers attachés Fichiers attachés
    À plus,

    Thauthème

    Je suis Charlie

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Points : 163
    Points
    163
    Par défaut
    Bonjour ThautHème

    là on rentre dans une autre dimension pas forcemment accessible à tout le monde

    c'est tout simplément génial, il y a encore du boulor (bosser les modules de classe, les comprendre, les utiliser, ...).

    En écrivant les procédures click des optionsbuttons est ce que j'y serai arrivé ?

    en tout cas merci beaucoup pour ce coup de main et surtout ta réactivité.
    Au plaisir de te solliciter à nouveau ou un de tes collègues dont les conseils sont si précieux.


  6. #6
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Pierre, bonjour le forum,

    Oui, bien sûr tu y serais arrivé. D'ailleurs il te suffit de faire une exemple avec deux sans le module de classe. Je pense que ton problème venait des variable déclarées publique mais pas dans un module standard. Avec 13 procédures et si, par nécessité, tu rajoutais des OptionButtons, il t'aurais fallu rajouter autant de procédure Click. Alors que là, il suffit de les mettre dans le tableau des OptionButtons TOB et le tour est joué.
    Veux-tu que je regarde ton fichier sans module de classe ?
    À plus,

    Thauthème

    Je suis Charlie

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Points : 163
    Points
    163
    Par défaut
    Thautheme

    non ne regarde pas plus loin, cela me convient parfaitement

    les modules de classe ça me parle pas pour l'instant, je vais regarder ça mais suis pas sûr de pouvoir reproduire dans une autre application
    merci pour ton implication

    Un autre souci

    si je veux dupliquer cet onglet, je vais avoir un pb avec le module de classe qui lance la macro liste vers un usf2 alors que je souhaite travailler sur un usf3
    par exemple dupliquer usf2 vers usf3 pour créer un usf de consultation et/ou modifications

    est ce qu'une duplication du moducle de classe, des modules .. en remplacant OB par OB1, TOB par TOB1, ... par exemple peut suffire ?
    Cordialement

    @+

  8. #8
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Pierre, bonjour le forum,

    Pierre je ne comprends pas bien ta question...
    Le module de classe, tel qu'il est conçu, n'agit que sur les contrôles faisant parti du tableau TOB qui, à l'initialisation de l'UserForm usf2 ,récupère les contrôles que tu veux. Si tu dupliques cet UserForm en usf3, il te suffit d'effacer les lignes ci-dessous pour que que les boutons soient désolidarisés de la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private TOB(1 To 13) As New ClassOB 'déclare le tableau TBO (Tableau des OptionButtons) de la classe ClassOB
    Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
    Dim I As Byte 'déclare la variable I (Incrément)
     
    Set shl = Sheets("Liste") 'définit la variable shl (déclarée publique dans le module "Module1"
    For I = 1 To 13 'boucle sut les 13 OptionButtons
        Set TOB(I).OB = Me.Controls("Opt" & I) 'ajoute l'OptionButton au tableau TBO
    Next I 'prochain OptionButton
    End Sub
    Par contre, tu peux aussi créer une nouvelle classe avec une action différente. Dans ce cas, Insertion / Module de classe. Renomme ta classe ClassOB2 (absolument pas obligatoire...) et à l'initialisation de l'usf3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private TOB2(1 To 13) As New ClassOB2 'déclare le tableau TBO (Tableau des OptionButtons) de la classe ClassOB
    etc.

    Je ne sais pas si ces explications vont te convenir car, encore une fois, je n'ai pas bien compris ta demande...
    À plus,

    Thauthème

    Je suis Charlie

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Points : 163
    Points
    163
    Par défaut
    bonjour Thautème et merci de te repencher sur mon pb

    Le code du module de classe ClassOB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public WithEvents OB As MSForms.OptionButton 'définit le nom OB (OptiobButtons) des instances de la classe ClassOB
     
     
    Private Sub OB_Change() 'au changement d'une instance OB de la classe
    If OB = True Then srep = shl.Cells(CInt(OB.Tag), 4).Value 'si l'instance OB est coché, définit la variable srep
    Module1.liste 'lance la procédure "liste" du module "Module1"
    End Sub
    et dans le module de classe je dois rediriger vers une module.liste2 car liste fait appel à usf2 et liste2 fera appel à usf3

    si j'ai bien compris

    En fait l'usf2 est un usf de saisie

    l'usf3 serait lui un usf de consultation qui en fonction du choix me donnera des totaux, .. bref des éléments déjà saisis

  10. #10
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Pierre, bonjour le forum,

    Oui ça me paraît correct. Mais sans fichier exemple difficile de t'en dire plus... Est-ce que tu as testé ? Qu'est-ce qui ne fonctionne pas ?
    À plus,

    Thauthème

    Je suis Charlie

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Points : 163
    Points
    163
    Par défaut
    voilà le fichier
    Fichiers attachés Fichiers attachés

  12. #12
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonsoir Pierre, bonsoir le forum,

    Ton fichier modifié en pièce jointe. J'ai fait en sorte que l'usf2 fonctionne mais sans comprendre ce que tu voulais avec deux userforms...
    Fichiers attachés Fichiers attachés
    À plus,

    Thauthème

    Je suis Charlie

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Points : 163
    Points
    163
    Par défaut
    Bonjour Thautème

    il s'agit d'une application pour la gestion d'un stock de panneaux de signalisation
    A partir d'un menu frmmenu j'offre plusieurs options (saisir des mouvements usf2, consulter le stock usf3, imprimer tous les mouvements, ceux liés à un panneau particulier, tout le stock usf4 non encore prêt, .....)
    j'aurai pu passer par un seul usf avec selon le choix des contrôles masqués, passer par un multi-page, .....

    c'est pourquoi le principe du module de classe pour l'usf2 me plaisait et l'usf3 pour la consultation pouvait exploiter ce même principe mais je me heurtais à la syntaxe.

    je ne suis pas un utilisateur de vba aussi expérimenté que toi et je me débrouille avec mes petits moyens

    la base de données n'est pas volumineuse, les mouvements non plus donc excel le fera très bien

    merci pour ton intérêt

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 19/08/2006, 08h15
  2. plusieurs css pour une page
    Par difficiledetrouver1pseudo dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 20/02/2006, 21h30
  3. plusieurs formulaires pour une seule page ?
    Par lifecraft dans le forum ASP
    Réponses: 9
    Dernier message: 01/02/2006, 09h48
  4. [C#] Plusieurs LinkButton pour une seule fonction
    Par FunnyDjo dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/06/2005, 22h01
  5. Réponses: 2
    Dernier message: 05/07/2004, 17h50

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