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 :

SUB ListBox Change


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut SUB ListBox Change
    Bonjour le forum,
    Bonjour à tous,

    J'ai une petite question SVP
    Pour ne pas charger mon module je souhaite savoir si je peux associer un seul code pour plusieurs actions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub S1_Change()
    UserForm
    End Sub
    Private Sub S2_Change()
    UserForm
    End Sub
    Private Sub S3_Change()
    UserForm
    End Sub
    Private Sub S4_Change()
    UserForm
    End Sub
    Demande : Je souhaite associer l'execution du Sub [UserForm] à plusieurs Listbox en même temps!
    Est ce possible?

    Merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 121
    Par défaut
    Je m'avance peut-etre mais ça ne doit pas etre possible... 1 objet, 1 procedure.

  3. #3
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonjour,

    Citation Envoyé par tdaoui Voir le message
    Pour ne pas charger mon module je souhaite savoir si je peux associer un seul code pour plusieurs actions
    En principe oui, mais cela nécessite un module de classe.

    Voici un exemple que j’utilise régulièrement pour des TextBoxes :

    Le module de classe est nommé ClasseTextBoxes

    En voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Option Explicit
    Public WithEvents TextBoxes As MSForms.TextBox
     
    Private Sub Textboxes_Change()
        ' Ici ton code
    End Sub
    Dans le code du UserForm concerné :

    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
    Option Explicit
    Dim TextBoxes() As New ClasseTextBoxes
     
    Private Sub UserForm_Initialize()
    Dim TextBoxesCount As Integer, Ctrl As Control
        ' D’autres lignes, qui n’ont rien à voir avec notre sujet
        ' Création de la collection de TextBoxes, gérée par le module de classe 
        TextBoxesCount = 0
            For Each Ctrl In Controls
                ' TextBoxes
                    If TypeOf Ctrl Is MSForms.TextBox Then
                        TextBoxesCount = TextBoxesCount + 1
                        ReDim Preserve TextBoxes(1 To TextBoxesCount)
                        Set TextBoxes(TextBoxesCount).TextBoxes = Ctrl
                    End If
            Next
    End Sub
    Rien n’empêche de ne prendre en compte dans le module de classe qu’une partie des TextBoxes en remplaçant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    If TypeOf Ctrl Is MSForms.TextBox Then

    par quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    If Left(Ctrl.Name, 2) = "TI" Or Left(Ctrl.Name, 2) = "TC" Or Left(Ctrl.Name, 4) = "TNbJ" Then
    NB - Dans la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim TextBoxes() As New ClasseTextBoxes
    il faut veiller à reprendre précisément le nom donné au module de classe, ClasseTextBoxes


    Cordialement,

  4. #4
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut
    Salut Bigalo,

    Peux-tu me dire comment adapter ton code à mon fichier
    j'ai beau essayé mais ça ne me donne rien

    Merci d'avance
    Fichiers attachés Fichiers attachés

  5. #5
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonjour,

    Citation Envoyé par tdaoui Voir le message
    Je souhaite associer l'execution du Sub [UserForm] à plusieurs Listbox en même temps!
    C’est fait (fichier en PJ). NB - Ce ne sont pas des ListBox que tu as mis mais des ComboBox.

    Pour cela, j’ai ajouté

    • - 1 variable publique, NomCombo définie dans ton module Modifier.
    • - 1 module de classe, nommé ClasseCombo avec ceci comme code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
    Public WithEvents ComboBoxes As MSForms.ComboBox
     
    Private Sub ComboBoxes_Change()
        NomCombo = ComboBoxes.Name
        USFsaisie.MAJ
    End Sub
    • - 1 classe et 1 procédure au module du UserForm :


    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
    Dim ComboBoxes() As New ClasseCombo
     
    Private Sub UserForm_Initialize()
    Dim ComboCount As Integer, Ctrl As Control
        ' Création de la collection de Combo, gérée par le module de classe
        ComboCount = 0
            For Each Ctrl In Controls
                ' Combo
                    If TypeOf Ctrl Is MSForms.ComboBox Then
                        ComboCount = ComboCount + 1
                        ReDim Preserve ComboBoxes(1 To ComboCount)
                        Set ComboBoxes(ComboCount).ComboBoxes = Ctrl
                    End If
            Next
    End Sub
    J’ai également renommé MAJ l’ancienne procédure UserForm, et je l’ai modifiée ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' ***********************************************************************************************************
    ' Dans la procédure MAJ, Private a été supprimé, afin qu'elle soit accessible depuis le module de classe    *
    ' ***********************************************************************************************************
     
    Sub MAJ()
        ' Affichage d'un message pour tester le module de classe
        MsgBox "Vous avez modifié le combo " & NomCombo
        ' Le reste non modifié
    Enfin, j’ai neutralisé les 6 Sub gérant l’événement Change des Combo S1 à S6.

    Quelques questions et remarques liées à ces questions

    • Pourquoi aucune des variables n’est-elle déclarée ? Il est plus que vivement conseillé dans les options de VBE de cocher Déclaration explicite des variables. Cela nécessite un peu plus de rigueur, mais évite bien des catastrophes : dans le cas contraire, la moindre faute de frappe sur un nom de variable peut conduire à un résultat aberrant, pas toujours facile à débugguer.
    • Quel est l’intérêt de placer sur ton UserForm 1 MultiPage avec 1 seule Page (à moins que d’autres pages soient à venir) ?
    • Quel est l’intérêt de créer des Frame avec un seul objet à la fois à l’intérieur (1 Combo). Si c’est pour pouvoir associer un titre à chaque Combo, 1 Label suffit.
    • Quel est l’intérêt d’utiliser des Combo, à l’ergonomie médiocre (il faut cliquer sur la flèche associée pour afficher la liste) si le choix se limite à 2 ou 3 options ? Des OptionButtons (boutons radios) sembleraient bien + adaptés (sauf si tu veux laisser la possibilité d’entrer un texte libre avec le Combo, mais ton code ne semble pas exploiter cela)
    • Pourquoi appeler S1, S2, S3, ... les Combo ? Ne penses-tu pas que l’emploi de BFermer au lieu de CommandButton1 et de CB1, CB2, CB3, ... pour les Combo rendrait le code + lisible ?


    Quelques remarques supplémentaires

    Ne donne pas à une Sub le nom d'un objet ou d'un mot-clef, UserForm en l’occurrence : outre le risque de conflit, cela rend le code difficile à lire, car on imagine avoir affaire à l’objet, pas à une Sub.

    Dans la Sub UserForm, (à renommer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Accueil3 = IIf(S1 = Nonévalué, Accueil1, "")
    C’est très bien d’utiliser IIf, cela rend le code + concis, MAIS pour pouvoir écrire

    il faut que Nonévalué représente une constante ou une variable. Or, aucune variable, ni aucune constante n’a été définie où que ce soit . Pour faire référence à un texte sélectionné dans la liste de S1 (nom d’1 Combo), il faut écrire

    ou

    si Nonévalué est censé correspondre à l’absence de choix.

    Il reste beaucoup à faire, bon courage.

    [EDIT] Rajouté la pièce jointe, initialement omise, [/EDIT]

    Cordialement,
    Fichiers attachés Fichiers attachés

  6. #6
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut
    Salut Bigalo,

    Tout d'abord je tiens à te remercier

    Cependant, je voulais savoir est ce que je peux appliquer la fonction SUM pour calculer la somme des differents labels présents dans mon USF ?

    Si possible quel est la syntaxe du code que je dois utiliser car en ustilisant la fonction SUM directement ça m'affiche un résultat concaténé

    Merci à toi

  7. #7
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    De rien

    Mais ce serait bien de répondre à certaines questions.

  8. #8
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Par défaut
    Salut Bigalo,

    désolé de ne pas pouvoir répondre aussitôt

    Ci-dessous les réponses à tes questions :

    Quelques questions et remarques liées à ces questions

    Pourquoi aucune des variables n’est-elle déclarée ? Il est plus que vivement conseillé dans les options de VBE de cocher Déclaration explicite des variables. Cela nécessite un peu plus de rigueur, mais évite bien des catastrophes : dans le cas contraire, la moindre faute de frappe sur un nom de variable peut conduire à un résultat aberrant, pas toujours facile à débugguer.
    Je suis novice dans le métier, donc je ne veux pas trop m'avancer dans des projets assez complexe, je souhaite détailler/simplifier le max possible mon besoin (j'y manquerai pas lors de la mise en place de mes futurs projets :-) )
    Quel est l’intérêt de placer sur ton UserForm 1 MultiPage avec 1 seule Page (à moins que d’autres pages soient à venir) ?
    Dans l'exemple que je t'ai envoyé, je n'ai mis qu'une seule page, car dans mon projet j'ai 5 pages et 120 listbox au total
    Quel est l’intérêt de créer des Frame avec un seul objet à la fois à l’intérieur (1 Combo). Si c’est pour pouvoir associer un titre à chaque Combo, 1 Label suffit.
    Quel est l’intérêt d’utiliser des Combo, à l’ergonomie médiocre (il faut cliquer sur la flèche associée pour afficher la liste) si le choix se limite à 2 ou 3 options ? Des OptionButtons (boutons radios) sembleraient bien + adaptés (sauf si tu veux laisser la possibilité d’entrer un texte libre avec le Combo, mais ton code ne semble pas exploiter cela)
    Pour l'instant que je préfére les combo pour ne pas charger mes pages, mais je pense effectivement à créer des bouton radios (je vais apporter les modification dans la nouvelle version)
    Pourquoi appeler S1, S2, S3, ... les Combo ? Ne penses-tu pas que l’emploi de BFermer au lieu de CommandButton1 et de CB1, CB2, CB3, ... pour les Combo rendrait le code + lisible ?
    à vrai dire c'est une trés bonne idée, je vais devoir l'appliquer ASAP

    En tous les cas, je te remercie encore une fois pour l'interêt que tu porte à mes demandes

    Amicalement
    Tarek

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

Discussions similaires

  1. [XL-2010] Sub Worksheet Change
    Par luksvibes dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/05/2013, 13h38
  2. [AC-2007] variable change de valeur en changeant de sub
    Par Alain7751 dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/07/2010, 21h16
  3. Listbox : ma colonne a changé de couleur
    Par stagolee dans le forum IHM
    Réponses: 2
    Dernier message: 05/09/2008, 14h22
  4. Taille texte d'une listbox change sans raison
    Par stressman dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/04/2008, 00h21
  5. [WPF] ListBox : evenement SelectionChanged se déclenche lorsque SelectedItemS change
    Par anisb dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 17/01/2008, 22h29

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