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 :

Listbox à choix multiple sur beaucoup de boutons - Factorisation de code


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Agent de sécurité
    Inscrit en
    Décembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Agent de sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 27
    Par défaut Listbox à choix multiple sur beaucoup de boutons - Factorisation de code
    Bonjour à toutes et à tous !

    Je me permets de faire appel à la communauté car j'essaie de refactoriser du code que j'utilise pour plusieurs formes qui servent de boutons (sur le fichier que je suis en cours de création, une trentaine...) et je cherche à créer une ou des fonctions afin de ne pas répéter le code dans son intégralité à chaque fois pour l'alléger.
    Je bute sur ce point depuis plusieurs jours, car je ne vois pas fondamentalement comment faire, et, lorsque je fais des essais, c'est à chaque fois sans succès...
    Je précise que j'ai quelques notions en vba, mais de loin pas le niveau de la plupart des gens présents sur ce forum !

    Petite explication sur ce dont j'ai besoin : j'ai une forme en bout de ligne associée à une listbox (ListMulti1) qui est, par défaut, cachée et qui apparaît lors du click sur la forme. Dans cette listbox à sélection multiple, je coche les items dont j'ai besoin et lors du second click sur la forme, la listbox disparaît et les éléments cochés apparaissent dans la cellule nommée Target_1.

    Voici le morceau de code en question :

    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
     
    Sub Shape1_Click()
     
    Dim xSelShp As Shape, xSelLst As Variant, i, J As Integer
    Dim xV As String
    Set xSelShp = ActiveSheet.Shapes(Application.Caller)
    Set xLstBox = ActiveSheet.ListMulti1
    If xLstBox.Visible = False Then
        xLstBox.Visible = True
        xSelShp.Fill.ForeColor.RGB = RGB(100, 204, 132)
        xStr = ""
        xStr = Range("Target_1").Value
     
        If xStr <> "" Then
             xArr = Split(xStr, ";")
        For i = xLstBox.ListCount - 1 To 0 Step -1
            xV = xLstBox.List(i)
            For J = 0 To UBound(xArr)
                If xArr(J) = xV Then
                  xLstBox.Selected(i) = True
                  Exit For
                End If
            Next
        Next i
        End If
    Else
        xLstBox.Visible = False
        xSelShp.Fill.ForeColor.RGB = RGB(91, 155, 213)
        For i = xLstBox.ListCount - 1 To 0 Step -1
            If xLstBox.Selected(i) = True Then
            xSelLst = xLstBox.List(i) & ";" & xSelLst
            End If
        Next i
        If xSelLst <> "" Then
            Range("Target_1") = Mid(xSelLst, 1, Len(xSelLst) - 1)
        Else
            Range("Target_1") = ""
        End If
    End If
    End Sub
    Le code tel quel appliqué à chaque forme qui sert au final de bouton fonctionne bien, j'aimerais du coup juste savoir s'il y avait un moyen de factoriser tout ceci pour n'appeler qu'une fonction (ou plusieurs...) dans mon code sur chaque bouton.

    Merci à vous par avance pour vos retours.

    Cordialement,
    Talzatior.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    j'aimerais du coup juste savoir s'il y avait un moyen de factoriser tout ceci pour n'appeler qu'une fonction (ou plusieurs...) dans mon code sur chaque bouton.
    Il faut donc transformer votre procédure en lui ajoutant un ou plusieurs argument.
    Puisqu'il faut que cela fonctionne sur plusieurs formes, il y a lieu d'avoir un argument de type String ou de type objet représentant la forme et si les valeurs sélectionnées doivent être copiées dans des cellules différentes que "Target_1", un argument de type Range ou de type String suivant que l'on passe comme argument un objet ou une chaîne de caractères représentant le nom de la cellule et enfin parce-que vous ne le mentionnez pas peut-être prévoir un troisième argument indiquant la référence à votre ListBox nommée ListMulti1 (propriété ListillRage)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    Homme Profil pro
    Agent de sécurité
    Inscrit en
    Décembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Agent de sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 27
    Par défaut
    Bonjour Philippe et merci beaucoup pour votre retour !

    J'ai procédé de la sorte, à savoir si c'est la meilleure solution ou non, je ne sais pas ...

    Voici le code pour afficher la Listbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sub showList(ByVal xLstBox As MSFORMS.listBox, xSelShp As Shape)
        xLstBox.Visible = True 'Affiche la Listbox
        xSelShp.Fill.ForeColor.RGB = RGB(100, 204, 132) 'Change la couleur de la forme associée à la Listbox pour que l'on sache sur laquelle on agit
    End Sub
    Le code lorsque l'on confirme les choix :

    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
     
    Sub hideList(ByVal xLstBox As MSFORMS.listBox, xSelShp As Shape, targetRng As String)
    xLstBox.Visible = False 'cache la Listbox
        xSelShp.Fill.ForeColor.RGB = RGB(91, 155, 213) 'Rétablit la couleur initiale de la forme associée
     
        'Boucle la Listbox pour récupérer les valeurs cochées
        For i = xLstBox.ListCount - 1 To 0 Step -1
            If xLstBox.Selected(i) = True Then
            xSelLst = xLstBox.List(i) & ";" & xSelLst
            End If
        Next i
     
        'Attribue la chaîne de caractères des valeurs cochées à la cellule associée
        If xSelLst <> "" Then
            Range(targetRng) = Mid(xSelLst, 1, Len(xSelLst) - 1)
        Else
            Range(targetRng) = "" ' Si aucune valeur cochée, vide la cellule
        End If
    End Sub
    Et finalement, le code pour le click sur la forme :

    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
     
    Sub NPC_Click()
     
    '****\ Définition variables /****
    Dim xSelShp As Shape, xSelLst As String, i As Integer, targetRng As String
     
    '****\ Définition de la forme (bouton) avec laquelle nous avons lancé la macro /****
    Set xSelShp = ActiveSheet.Shapes(Application.Caller)
     
    '****\ Définition de la cellule dans laqueel on souhaite insérer les choix cochés /****
    targetRng = "Target_1"
     
    '****\ Définition de la listbox en relation avec notre macro /****
    Set xLstBox = ActiveSheet.ListMulti1
     
    '****\ Lors du clic, si la listbox n'est pas visible (par défaut) /****
    If xLstBox.Visible = False Then
        'On affiche la listbox et change la couleur de la forme associée
        Call showList(xLstBox, xSelShp)
    'Sinon (si la listbox est visible)
    Else
        'On cache la lListbox, et affiche les choix cochés dans la cellule voulue
        Call hideList(xLstBox, xSelShp, targetRng)
    End If
    End Sub
    Est-ce le bon procédé selon vous ?

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    L'organisation semble être bonne mais je n'ai pas testé votre code mais si elle répond à vos attentes et que cela fonctionne c'est parfait.

    Comme j'ai déjà des bouts de code gérant des ListBox ActiveX, il est possible de les associer pour pouvoir les gérer avec des boutons bascule (Toggle) qui me semble le plus adéquat pour gérer ce type de procédure et si cela vous intéresse, je peux les publier.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Homme Profil pro
    Agent de sécurité
    Inscrit en
    Décembre 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Agent de sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 27
    Par défaut
    Bonjour Philippe et merci pour le retour !

    Vraiment navré du temps de réponse, j'ai été un peu "dans le jus" ces derniers jours...

    Je veux bien voir votre code, voir si du coup je pourrais améliorer le mien, avec grand plaisir. Ça ne pourra que m'apprendre des choses, et j'avoue que le toggle en VBA, je ne connais pas 😉

    Merci encore pour votre temps et support 😉

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/03/2015, 11h56
  2. Récupérer valeurs listbox choix multiple
    Par biquet52 dans le forum IHM
    Réponses: 3
    Dernier message: 11/09/2008, 09h07
  3. ListBox à Choix multiple
    Par [ced] dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 01/08/2008, 22h14
  4. Choix multiple sur une listbox
    Par david71 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 10/07/2007, 16h35
  5. transfert choix multiple sur base
    Par Ludwik dans le forum VBA Access
    Réponses: 6
    Dernier message: 08/06/2007, 16h01

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