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 :

Liste déroulante avec choix multiple


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Liste déroulante avec choix multiple
    Bonjour à tous !

    Voila, j'ai un fichier sur lequel je cherche à réaliser des listes déroulantes avec choix multiples.
    J'ai trouvé un exemple remis sur un forum par eriic que je trouve très bien mais je ne sais pas le retranscrire...

    Accepteriez-vous de regarder mon fichier ?

    Pour info :
    le [Séparateur] et les noms de listes dynamiques sont créés dans la feuille "Listes BD - Ne pas toucher"
    Les listes concernent :
    SiegeLesion
    TypeLesion
    CausesPrincipales
    ManqueOrganisationnel
    DefautComportemental
    ManqueTechnique
    ManqueEPC
    ManqueEPI

    Pour les listes déroulantes à choix multiples, ceci concerne la feuille "2 - Base de Données", colonnes AI, AJ, AW, AX, AY, AZ, BA, BA (de la ligne 7 à la ligne 60 inclus)

    J'aimerais avoir votre aide pour que ces listes à choix multiple puissent fonctionner.
    Acceptez-vous de m'aider ? (j'ai essayer quelques modifications mais je ne suis pas doué en programmation)

    Merci par avance

    Seb
    Fichiers attachés Fichiers attachés

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Accepteriez-vous de regarder mon fichier ?
    est donc une question que tu poses à tous, ici.
    Ma réponse à cette question est très clairement non. Je n'ouvre jamais un classeur tiers !
    J'accepterai par contre bien volontiers de répondre à une question que tu poserais de manière claire et précise sur la partie de ton code que :
    - tu isolerais
    - tu montrerais ici, entre balises code
    Voilà.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Pour compléter la réponse de unparia: http://www.developpez.net/forums/d84...s-discussions/

    J'ai trouvé un exemple remis sur un forum par eriic
    Un lien vers ce sujet serait probablement utile.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Désolé si ça ne correspond pas à vos habitudes ou si je m'y prends mal.
    Je ne suis pas un utilisateur de VBA ou de système de programmation.

    Voici le code utilisé par Eriiic sur son excel simplifié, sur la feuille 'Feuil1' :

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    Option Explicit
     
    Dim interne As Boolean
    Private Sub LbxVille_Change()
        Dim ch As String, i As Long, sep As String
        If Not interne Then
            ch = ""
            sep = [Séparateur]
            For i = 0 To LbxVille.ListCount - 1
                If LbxVille.Selected(i) = True Then ch = ch & sep & LbxVille.List(i)
            Next i
            ch = Mid(ch, Len(sep) + 1)
            ActiveCell = ch
        End If
    End Sub
     
    Private Sub LbxVille_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    ' un clic droit désélectionne ou sélectionne l'ensemble de la liste
        Dim i As Long, cpt As Long, state As Boolean
        If Button = xlSecondaryButton Then  ' si clic-droit
            ' nb sélections
            For i = 0 To LbxVille.ListCount - 1
                If LbxVille.Selected(i) Then cpt = cpt + 1
            Next i
            ' si aucune sélection sélectionner tout
            ' sinon désélectionner tout
            If cpt = 0 Then state = True Else state = False
            interne = True    ' palliatif, EnableEvents ne marche pas
            For i = 0 To LbxVille.ListCount - 1
                LbxVille.Selected(i) = state
            Next i
            interne = False
        End If
        LbxVille_Change
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim ch As String, ch2 As String, pos As Long, i As Long
        Dim plage, nomListe, numListe As Long, topIndex As Boolean
        ' plages avec sélection multiple sur cette feuille
        plage = Array("B2:B100", "F2:F3")
        ' nom des listes dans la feuille Listes (en liaison avec les plages définies au-dessus)
        nomListe = Array("Ville", "Prénom")
        ' plage concernée ?
        For numListe = 0 To UBound(plage)
            If Not Intersect(Target, Range(plage(numListe))) Is Nothing Then Exit For
        Next numListe
     
        If numListe <= UBound(plage) Then ' si plage de liste existant
            ' initialiser listbox
            LbxVille.ListFillRange = "Listes!" & Worksheets("Listes").Range(nomListe(numListe)).Address          ' A2:A17" ' [Listes!Ville].Address
            LbxVille.Top = Target.Offset(1, 0).Top
            LbxVille.Left = Target.Offset(0, 1).Left
     
            interne = True    ' palliatif, EnableEvents ne marche pas
            ch = ActiveCell
            ch2 = [Séparateur] & ch & [Séparateur]
            topIndex = False
            ' sélectionner selon contenu cellule
            For i = 0 To LbxVille.ListCount - 1
                If InStr(ch2, [Séparateur] & LbxVille.List(i) & [Séparateur]) > 0 Then
                    ' l'item a été trouvé dans la cellule
                    LbxVille.Selected(i) = True
                    If Not topIndex Then
                        LbxVille.topIndex = i    ' le 1er sélectionné doit être visible dans la textbox
                        topIndex = True
                    End If
                End If
            Next i
            interne = False
            ' afficher textbox
            LbxVille.Visible = True
        Else
            ' ne plus afficher la textbox
            LbxVille.Visible = False
        End If
    End Sub
     
    Sub reinit()
        Application.EnableEvents = True
    End Sub
    Son but était de faire apparaître sur la feuille 'Feuil1' une liste de choix de villes enregistrée sous le nom dynamique 'Ville' se trouvant sur la feuille 'Listes'

    Mon soucis, c'est qu'en copiant ce code sur la page de code de ma feuille, en remplacant 'Feuil1' par le nom de ma feuille ('BASE de données'), idem pour 'Listes' ('Ne pas toucher') et 'Ville' par mon nom de liste ('TypeLesion'), ça ne marche pas.
    J'ai aussi pensé à indiquer les bonnes cellules destination (remplacement de "B2:B100" par ma zone de choix "AI7:AI60"...).
    Y-a-t-il d'autres éléments que je dois modifier ?

    D'autre part, je ne sais pas comment faire pour que je puisse réaliser plusieurs listes... Dois-je réaliser plusieurs fois ce même code d'affiler ?

    Encore une fois, désolé, je ne suis pas programmateur ou même un bon bidouilleur...
    Si besoin, les fichiers Excels sont disponibles.

    Merci pour votre aide

    Seb

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Citation Envoyé par letoutcasse2000 Voir le message
    ça ne marche pas.
    Ce n'est pas très explicite.
    Le code s'arrete avec un message d'erreur? si oui lequel et a quelle ligne?
    Si non, qu'obtiens tu comme résultat?
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Ce n'est pas très explicite.
    Le code s'arrete avec un message d'erreur? si oui lequel et a quelle ligne?
    Si non, qu'obtiens tu comme résultat?
    Voila 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
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    Option Explicit
     
    Dim interne As Boolean
    Private Sub LbxSiegeLesion_Change()
        Dim ch As String, i As Long, sep As String
        If Not interne Then
            ch = ""
            sep = [Séparateur]
            For i = 0 To LbxSiegeLesion.ListCount - 1
                If LbxSiegeLesion.Selected(i) = True Then ch = ch & sep & LbxSiegeLesion.List(i)
            Next i
            ch = Mid(ch, Len(sep) + 1)
            ActiveCell = ch
        End If
    End Sub
     
    Private Sub LbxSiegeLesion_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    ' un clic droit désélectionne ou sélectionne l'ensemble de la liste
        Dim i As Long, cpt As Long, state As Boolean
        If Button = xlSecondaryButton Then  ' si clic-droit
            ' nb sélections
            For i = 0 To LbxSiegeLesion.ListCount - 1
                If LbxSiegeLesion.Selected(i) Then cpt = cpt + 1
            Next i
            ' si aucune sélection sélectionner tout
            ' sinon désélectionner tout
            If cpt = 0 Then state = True Else state = False
            interne = True    ' palliatif, EnableEvents ne marche pas
            For i = 0 To LbxSiegeLesion.ListCount - 1
                LbxSiegeLesion.Selected(i) = state
            Next i
            interne = False
        End If
        LbxSiegeLesion_Change
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim ch As String, ch2 As String, pos As Long, i As Long
        Dim plage, nomListe, numListe As Long, topIndex As Boolean
        ' plages avec sélection multiple sur cette feuille
        plage = Array("AI7:AI60")
        ' nom des Listes BD - Ne pas toucher dans la feuille Listes BD - Ne pas toucher (en liaison avec les plages définies au-dessus)
        nomListe = Array("SiegeLesion")
        ' plage concernée ?
        For numListe = 0 To UBound(plage)
            If Not Intersect(Target, Range(plage(numListe))) Is Nothing Then Exit For
        Next numListe
     
        If numListe <= UBound(plage) Then ' si plage de liste existant
            ' initialiser listbox
            LbxSiegeLesion.ListFillRange = "Listes BD - Ne pas toucher!" & Worksheets("Listes BD - Ne pas toucher").Range(nomListe(numListe)).Address          ' A2:A17" ' [Listes BD - Ne pas toucher!SiegeLesion].Address
            LbxSiegeLesion.Top = Target.Offset(1, 0).Top
            LbxSiegeLesion.Left = Target.Offset(0, 1).Left
     
            interne = True    ' palliatif, EnableEvents ne marche pas
            ch = ActiveCell
            ch2 = [Séparateur] & ch & [Séparateur]
            topIndex = False
            ' sélectionner selon contenu cellule
            For i = 0 To LbxSiegeLesion.ListCount - 1
                If InStr(ch2, [Séparateur] & LbxSiegeLesion.List(i) & [Séparateur]) > 0 Then
                    ' l'item a été trouvé dans la cellule
                    LbxSiegeLesion.Selected(i) = True
                    If Not topIndex Then
                        LbxSiegeLesion.topIndex = i    ' le 1er sélectionné doit être visible dans la textbox
                        topIndex = True
                    End If
                End If
            Next i
            interne = False
            ' afficher textbox
            LbxSiegeLesion.Visible = True
        Else
            ' ne plus afficher la textbox
            LbxSiegeLesion.Visible = False
        End If
    End Sub
     
    Sub reinit()
        Application.EnableEvents = True
    End Sub
    Message d'erreur :
    Erreur de compilation
    Variable non définie

    Il s'agit de la ligne 51, LbxSiegeLesion a été surligné en jaune

    J'ai pourtant Créé le nom SiegeLesion (même orthographe) avec comme référence =DECALER('Listes BD - Ne pas toucher'!$R$3;;;NBVAL('Listes BD - Ne pas toucher'!$R:$R)-1; )
    Il s'agit bien de là où se trouve ma liste.

    Encore merci pour votre aide

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Citation Envoyé par letoutcasse2000 Voir le message
    Message d'erreur :

    Variable non définie

    J'ai pourtant Créé le nom SiegeLesion
    Définir un nom n'en fait pas une variable.

    Je l'ai déjà dit dans mon premier post, avoir le lien de la discussion d'où provient le code faciliterait les choses ...
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour
    Pour information, j'ai joint dans mon premier post le fichier EXCEL de eriiic (qui avait fait le code) + mon fichier pour pouvoir comprendre ce que je cherchais à faire.

    Sinon, voici la discussion où se trouve le post d'eriiic : http://www.developpez.net/forums/d13...s/#post7431813

    Je sais que je ne suis pas d'une grande aide alors qu'il s'agit de mon problème...

    Dites-moi s'il vous faut d'autres informations, je chercherais ce que je peux vous fournir...

    Merci

    Seb

  9. #9
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Comme unparia, pour des raisons de sécurité, je n'ouvre pas les classeurs, et même si je le voulais la sécurité informatique de mon entreprise bloque les téléchargement. Je ne peux donc pas ouvrir le fichier d'eriic, et malheureusement il n'y a pas plus d'information dans la discussion que tu as linké puisque éric dit les avoir mis les dans le classeur. Je ne peux donc pas t'aider plus car je ne vois pas où eric à défini "LbxSiegeLesion".

    Cependant comme te l'as dit Ryuautodidacte:
    en faisant une petite recherche du style : "vba liste déroulante dynamique" sur
    on trouve pleins de réponses dont par exemple :
    Listes en cascade
    Tu trouveras peut être un code plus facilement adaptable a ton cas.

    Autre idée: si la macro d'éric marche dans son fichier tu peux essayer de copier tes données dans son fichier.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Septembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    Donc même en comparant le code de eriiic noté plus haut au mien noté plus bas, ainsi que le message d'erreur, ce n'est pas faisable ?
    Voici 2 screenshoot du EXCEL de eriiic qui détaille beaucoup les choses (c'est là que je me dis que je suis vraiment trop nul...)
    Nom : Feuil1.jpg
Affichages : 9566
Taille : 194,6 Ko
    Nom : Listes.jpg
Affichages : 13069
Taille : 155,1 Ko

    Je ne sais pas si ça peut aider...

    Pour le transfert, en fait, j'ai plus de listes de choix à réaliser que lui (7 ou 8 listes à choix multiples alors qu'il n'en a qu'une) et beaucoup de feuilles avec des liens des unes aux autres...

    Merci encore

    Seb

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour à tous,

    C'est peut-être trop tard mais pas mal occupé par la ré-installation de mon PC je ne vois ton topic que maintenant.
    Tu n'étais pas loin de la fin...

    Tu as changé le nom de feuille Listes par un nom avec des espaces. Il faut l'encadrer par des ' ' lorsque c'est une partie d'une référence :
    LbxSiegeLesion.ListFillRange = "'Listes BD - Ne pas toucher'!" & Worksheets("Listes BD - Ne pas toucher").Range(nomListe(numListe)).Address

    Tu as aussi changé le nom de la listbox, ce n'était pas nécessaire. C'est la même quelque soit la liste utilisée.
    Il faut aussi la créer sur la feuille (ton message d'erreur) via l'onglet Développeur, sans oublier de mettre sa propriété MultiSelect à fmMultiSelectMulti ou fmMultiSelectExtended

    Par contre il se passe un phénomène étrange sur ton classeur. Au fur et à mesure qu'on l'utilise elle rétrécie jusqu'à devenir minuscule en 4 appels (!?!)
    Comme je suis parti de ton code j'ai regardé si tu avais ajouté qq chose pouvant l'expliquer mais je n'ai rien vu.
    Pas trop le temps d'approfondir car je me bat encore avec mes backups hubic.
    En attendant j'ai ajouté 2 lignes pour refixer sa taille à chaque appel, c'est donc dans le code qu'il faudra aller si tu veux modifier sa taille (.Height et .Width).
    Je t'ai mis 2 listes en AI:AJ, continue sur le même principe.

    J'ai bien des idées pour simplifier encore plus l'intégration mais pas trop le temps pour l'instant :-)
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Option Explicit
     
    Dim interne As Boolean
    Private Sub LbxSiegeLesion_Change()
        Dim ch As String, i As Long, sep As String
        If Not interne Then
            ch = ""
            sep = [Séparateur]
            For i = 0 To LbxSiegeLesion.ListCount - 1
                If LbxSiegeLesion.Selected(i) = True Then ch = ch & sep & LbxSiegeLesion.List(i)
            Next i
            ch = Mid(ch, Len(sep) + 1)
            ActiveCell = ch
        End If
    End Sub
     
    Private Sub LbxSiegeLesion_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    ' un clic droit désélectionne ou sélectionne l'ensemble de la liste
        Dim i As Long, cpt As Long, state As Boolean
        If Button = xlSecondaryButton Then  ' si clic-droit
            ' nb sélections
            For i = 0 To LbxSiegeLesion.ListCount - 1
                If LbxSiegeLesion.Selected(i) Then cpt = cpt + 1
            Next i
            ' si aucune sélection sélectionner tout
            ' sinon désélectionner tout
            If cpt = 0 Then state = True Else state = False
            interne = True    ' palliatif, EnableEvents ne marche pas
            For i = 0 To LbxSiegeLesion.ListCount - 1
                LbxSiegeLesion.Selected(i) = state
            Next i
            interne = False
        End If
        LbxSiegeLesion_Change
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim ch As String, ch2 As String, pos As Long, i As Long
        Dim plage, nomListe, numListe As Long, topIndex As Boolean
        ' plages avec sélection multiple sur cette feuille
        plage = Array("AI7:AI60", "AJ7:AJ60")
        ' nom des Listes BD - Ne pas toucher dans la feuille Listes BD - Ne pas toucher (en liaison avec les plages définies au-dessus)
        nomListe = Array("TypeLesion", "SiegeLesion")
        ' plage concernée ?
        For numListe = 0 To UBound(plage)
            If Not Intersect(Target, Range(plage(numListe))) Is Nothing Then Exit For
        Next numListe
     
        If numListe <= UBound(plage) Then ' si plage de liste existant
            ' initialiser listbox
            LbxSiegeLesion.ListFillRange = "'Listes BD - Ne pas toucher'!" & Worksheets("Listes BD - Ne pas toucher").Range(nomListe(numListe)).Address          ' A2:A17" ' [Listes BD - Ne pas toucher!SiegeLesion].Address
            LbxSiegeLesion.Top = Target.Offset(1, 0).Top
            LbxSiegeLesion.Left = Target.Offset(0, 1).Left
            LbxSiegeLesion.Width = 170
            LbxSiegeLesion.Height = 190
            interne = True    ' palliatif, EnableEvents ne marche pas
            ch = ActiveCell
            ch2 = [Séparateur] & ch & [Séparateur]
            topIndex = False
            ' sélectionner selon contenu cellule
            For i = 0 To LbxSiegeLesion.ListCount - 1
                If InStr(ch2, [Séparateur] & LbxSiegeLesion.List(i) & [Séparateur]) > 0 Then
                    ' l'item a été trouvé dans la cellule
                    LbxSiegeLesion.Selected(i) = True
                    If Not topIndex Then
                        LbxSiegeLesion.topIndex = i    ' le 1er sélectionné doit être visible dans la textbox
                        topIndex = True
                    End If
                End If
            Next i
            interne = False
            ' afficher textbox
            LbxSiegeLesion.Visible = True
        Else
            ' ne plus afficher la listbox
            LbxSiegeLesion.Visible = False
        End If
    End Sub
    eric
    Fichiers attachés Fichiers attachés

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    la version qui simplifie l'utilisation.
    - plus besoin de nommer les plages des listes, il suffit juste de saisir les listes.
    - création de la listbox par un double-clic sur la feuille en A1
    - enrichissement des paramètres dans la feuille Listes pour simplifier la configuration et donner plus de souplesse.
    Nom : 2016-09-24_15-56-36.png
Affichages : 9594
Taille : 121,7 Ko
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    Option Explicit
     
    Dim interne As Boolean, sep As String, multiSel As Long, lbxListeOK As Boolean
     
    Private Sub LbxListe_Change()
        Dim ch As String, i As Long
        If Not interne Then
            ch = ""
            For i = 0 To lbxListe.ListCount - 1
                If lbxListe.Selected(i) = True And lbxListe.List(i) <> "" Then ch = ch & sep & lbxListe.List(i)
            Next i
            ch = Mid(ch, Len(sep) + 1)
            ActiveCell = ch
        End If
    End Sub
     
    Private Sub LbxListe_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        ' un clic droit désélectionne ou sélectionne l'ensemble de la liste
        Dim i As Long, state As Boolean
        If multiSel = 0 Then Exit Sub
        If Button = xlSecondaryButton Then  ' si clic-droit
            ' nb sélections
            state = True
            For i = 0 To lbxListe.ListCount - 1
                If lbxListe.Selected(i) Then state = False: Exit For
            Next i
            ' si aucune sélection sélectionner tout
            ' sinon désélectionner tout
            'If cpt = 0 Then state = True Else state = False
            interne = True    ' palliatif, EnableEvents ne marche pas
            For i = 0 To lbxListe.ListCount - 1
                lbxListe.Selected(i) = state
            Next i
            interne = False
        End If
        LbxListe_Change
    End Sub
     
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        ' Création de la listBox
        Dim Obj As OLEObject
        If Target.Address = "$A$1" Then
            Cancel = True
            For Each Obj In ActiveSheet.OLEObjects
                If TypeName(Obj.Object) = "ListBox" Then
                    If Obj.Name = "lbxListe" Then Exit Sub
                End If
            Next Obj
            ' créer
            ActiveSheet.OLEObjects.Add(ClassType:="Forms.ListBox.1", Link:=False, _
                        DisplayAsIcon:=False, Left:=200, Top:=200, Width:=90, Height:=108).Name = "lbxListe"
            MsgBox "lbxListe créée"
        End If
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    '******** Constante à adapter **********************************************************
        Const FeuilleListe As String = "Listes"    ' nom de la feuille des listes à utiliser
    '***************************************************************************************
     
        Dim ch As String, ch2 As String, i As Long
        Dim topIndex As Boolean
        Dim param, ref
        Dim lig As Long, dercol As Long, c As Range
     
        If Target.Count > 1 Then Exit Sub
        ' contrôles validité
        With Sheets(FeuilleListe)
            param = .[A1].CurrentRegion    ' paramètres d'utilisations des listes
            '1        , 2             , 3   , 4    , 5     , 6    , 7
            'Référence, Liste utilisée, Type, Width, Height, Multi, Sep
     
            For lig = 3 To UBound(param, 1)
                ref = Split(Mid(param(lig, 1), 2), "!")
                If ref(0) = Target.Parent.Name Then    ' test nom feuille d'appel
                    If Not Intersect(Target, Range(ref(1))) Is Nothing Then    'test plage d'appel
                        dercol = .Cells(2, Columns.Count).End(xlToLeft).Column
                        ' test nom de liste
                        Set c = .Rows(1).Find("Listes", LookIn:=xlValues, Lookat:=xlWhole)
                        Set c = c.Offset(1).Resize(, dercol - c.Column + 1).Find(param(lig, 2), LookIn:=xlValues, Lookat:=xlWhole)
                        If c Is Nothing Then
                            MsgBox "Liste '" & param(lig, 2) & "' non trouvée.": lig = UBound(param, 1)
                        Else
                            'plage liste
                            Set c = c.Offset(1).Resize(.Cells(Rows.Count, c.Column).End(xlUp).Row - 2)
                            Exit For
                        End If
                    End If
                End If
            Next lig
        End With
     
        ' ne plus afficher la textbox
        lbxListe.Visible = False
        If lig <= UBound(param, 1) Then
            ' initialiser listbox
            Select Case param(lig, 3)
            Case "ListBox"
                With lbxListe
                    .ListFillRange = "'" & FeuilleListe & "'!" & c.Address
                    .Top = Target.Offset(1, 0).Top
                    .Left = Target.Offset(0, 1).Left
                    If param(lig, 4) <> "" Then .Width = param(lig, 4)
                    If param(lig, 5) <> "" Then .Height = param(lig, 5)
                    multiSel = param(lig, 6)
                    interne = True
                    .MultiSelect = multiSel
                    interne = False
                    sep = param(lig, 7)
                End With
                interne = True    ' palliatif, EnableEvents ne marche pas
                ch = Target
                ch2 = sep & ch & sep
                topIndex = False
                ' sélectionner selon contenu cellule
                For i = 0 To lbxListe.ListCount - 1
                    If InStr(ch2, sep & lbxListe.List(i) & sep) > 0 Then
                        ' l'item a été trouvé dans la cellule
                        lbxListe.Selected(i) = True
                        If Not topIndex Then
                            lbxListe.topIndex = i    ' le 1er sélectionné doit être visible dans la textbox
                            topIndex = True
                        End If
                    End If
                Next i
                interne = False
                ' afficher textbox
                lbxListe.Visible = True
            End Select
        End If
    End Sub
     
    Sub reinit()
        Application.EnableEvents = True
    End Sub
    eric
    Fichiers attachés Fichiers attachés

  13. #13
    Membre à l'essai
    Femme Profil pro
    assistant projet
    Inscrit en
    Décembre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : assistant projet

    Informations forums :
    Inscription : Décembre 2017
    Messages : 17
    Points : 15
    Points
    15
    Par défaut lbxListe.Visible = False
    Citation Envoyé par eriiic Voir le message
    Bonjour,

    la version qui simplifie l'utilisation.
    - plus besoin de nommer les plages des listes, il suffit juste de saisir les listes.
    - création de la listbox par un double-clic sur la feuille en A1
    - enrichissement des paramètres dans la feuille Listes pour simplifier la configuration et donner plus de souplesse.


    eric
    Bonjour, je vous remercie pour ce tuto.
    J'ai essayé de l'adapter mais je bloque.

    J'ai à chaque fois un blocage sur " lbxListe.Visible = False"

    J'aimerais savoir où je me suis trompée. Je débute. Je vous remercie
    test.xlsm

  14. #14
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    il faut mettre un listbox sur ta feuille et le renommer lbxListe.
    eric

  15. #15
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Exemple simple en PJ

    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
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Not Intersect([A2:A10], Target) Is Nothing And Target.Count = 1 Then
        Me.ListBox1.MultiSelect = fmMultiSelectMulti
        Me.ListBox1.List = Sheets("BD").Range("A2:A28").Value
        a = Split(Target, " ")
        If UBound(a) >= 0 Then
          For i = 0 To Me.ListBox1.ListCount - 1
            If Not IsError(Application.Match(Me.ListBox1.List(i), a, 0)) Then Me.ListBox1.Selected(i) = True
          Next i
        End If
        Me.ListBox1.Height = 150
        Me.ListBox1.Width = 100
        Me.ListBox1.Top = Target.Top
        Me.ListBox1.Left = Target.Left + Target.Width
        Me.ListBox1.Visible = True
      Else
          Me.ListBox1.Visible = False
      End If
    End Sub
     
    Private Sub ListBox1_Change()
     For i = 0 To Me.ListBox1.ListCount - 1
       If Me.ListBox1.Selected(i) = True Then temp = temp & Me.ListBox1.List(i) & " "
     Next i
     ActiveCell = Trim(temp)
    End Sub
    Boisgontier

  16. #16
    Membre à l'essai
    Femme Profil pro
    assistant projet
    Inscrit en
    Décembre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : assistant projet

    Informations forums :
    Inscription : Décembre 2017
    Messages : 17
    Points : 15
    Points
    15
    Par défaut un listbox sur ta feuille
    Citation Envoyé par eriiic Voir le message
    Bonjour,

    il faut mettre un listbox sur ta feuille et le renommer lbxListe.
    eric
    Je suis désolée, comme je disais je suis débutante
    Merci beaucoup après quelques tests j'ai enfin réussi

  17. #17
    Membre à l'essai
    Femme Profil pro
    assistant projet
    Inscrit en
    Décembre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : assistant projet

    Informations forums :
    Inscription : Décembre 2017
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Blocage suite figer les volets ou fractionner
    Par contre, le code est complètement déboussolé lorsque je veux figer mes volets ou fractionner, idem lorsque la cellule est en renvoi automatique.

    Est ce normal, y a t il une solution?
    Merci

  18. #18
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Je n'avais jamais remarqué ce comportement erratique.
    Excel s'embrouille sur l'item cliqué à cause du retour à la ligne auto qui la modifie la hauteur des cellules, et donc la position de la listbox.

    Maintenant je l'aligne sur le haut de la cellule et non plus sur le bas.
    Je voulais que l'intégralité de la ligne en cours d'édition soit visible, là ce n'est plus possible.
    eric

    PS: je ne peux modifier le post original, je met l'adaptation ici pour les futurs lecteurs ayant le même impératif (retour à la ligne auto dans les cellules) :
    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Top = Target.Offset(1, 0).Top
    par :
    Fichiers attachés Fichiers attachés

  19. #19
    Membre à l'essai
    Femme Profil pro
    assistant projet
    Inscrit en
    Décembre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : assistant projet

    Informations forums :
    Inscription : Décembre 2017
    Messages : 17
    Points : 15
    Points
    15
    Par défaut retour à la ligne auto
    Citation Envoyé par eriiic Voir le message
    Je n'avais jamais remarqué ce comportement erratique.

    Merci beaucoup, ça me sauve.
    Je rectifie : impossible de figer les volets sans que ça bloque la listbox même en passant par le vba (Sub FigerVolets() ou ActiveWindow.FreezePanes) mais le fractionnement marche

  20. #20
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    je n'ai pas de soucis en figeant les volets.
    Si tu pouvais en dire plus sur les manip effectuées et le problème rencontré.
    eric

Discussions similaires

  1. Réponses: 12
    Dernier message: 16/09/2013, 20h23
  2. [Débutant] Liste déroulante avec choix multiple (checkbox)
    Par Genyuumaru dans le forum ASP.NET MVC
    Réponses: 3
    Dernier message: 20/11/2012, 09h42
  3. Réponses: 11
    Dernier message: 19/02/2010, 16h00
  4. Liste déroulante avec sélection multiple
    Par lbar012001 dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/11/2007, 09h44
  5. Double liste déroulante avec choix d'onglet
    Par fugy33 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/06/2007, 10h45

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