Adaption code VBA - Menu à sélection multiple
Liitch
Messages postés
73
Date d'inscription
Statut
Membre
Dernière intervention
-
f894009 Messages postés 17277 Date d'inscription Statut Membre Dernière intervention -
f894009 Messages postés 17277 Date d'inscription Statut Membre Dernière intervention -
Bonjour à toi,
Il y a un peu plus de 2 ans, j'ai fais appel au forum pour mettre en place un menu déroulant à sélection multiple : https://forums.commentcamarche.net/forum/affich-34721361-menu-deroulant-a-selection-multiple#p34746067
Aujourd'hui, j'en ai à nouveau besoin, mais je peine à adapter le code qu'on m'avait donné...
A l'origine, le codage était adapté pour plusieurs colonne et aujourd'hui il faudrait que ça s'applique sur une seule colonne. Malgré que je change la plage sélectionnée, les colonnes de fournitures etc... Rien ne fonctionne. J'en appelle à vous !
A savoir, j'aimerai que le menu à sélection multiple s'applique de C7:C100
Le code appliqué sur la feuille où le menu est :
Code mis dans un module :
Merci d'avance de prendre du temps pour solutionner mon problème !
Belle journée.
Il y a un peu plus de 2 ans, j'ai fais appel au forum pour mettre en place un menu déroulant à sélection multiple : https://forums.commentcamarche.net/forum/affich-34721361-menu-deroulant-a-selection-multiple#p34746067
Aujourd'hui, j'en ai à nouveau besoin, mais je peine à adapter le code qu'on m'avait donné...
A l'origine, le codage était adapté pour plusieurs colonne et aujourd'hui il faudrait que ça s'applique sur une seule colonne. Malgré que je change la plage sélectionnée, les colonnes de fournitures etc... Rien ne fonctionne. J'en appelle à vous !
A savoir, j'aimerai que le menu à sélection multiple s'applique de C7:C100
Le code appliqué sur la feuille où le menu est :
Option Explicit
' constantes décrvant la configuration - à adapter
Const plageLB As String = "C7:C100" ' plage à traiter
Const lideb As Byte = 6 ' ligne des fournitures
Const codeb As Byte = 3 ' premiere colonne fournitures
Const sep As String = " + " ' séparateur - si tu preferes une foruniture par ligne
' tu mets vblf (pour line feed)
Dim interne As Boolean
Private Sub LbLIste_Change()
Dim ch As String, i As Long
If Not interne Then
ch = ""
For i = 0 To LbListe.ListCount - 1
If LbListe.Selected(i) = True Then ch = ch & sep & LbListe.List(i)
Next i
ch = Mid(ch, Len(sep) + 1)
ActiveCell = ch
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ch As String, ch2 As String, i As Long
Dim plage, topIndex As Boolean
Dim four As String, co As Long
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range(plageLB)) Is Nothing Then LbListe.Visible = False: Exit Sub
co = Target.Column
four = Cells(lideb, co).Value
plage = PlageListe(four)
If plage = False Then
MsgBox "erreur : " & four & " n'est pas dans la feuille " & FL
Exit Sub
End If
' initialiser listbox
LbListe.ListFillRange = FL & "!" & plage
LbListe.Top = Target.Top
LbListe.Left = Target.Offset(0, 1).Left
LbListe.Width = 100
LbListe.Height = LbListe.ListCount * (ActiveCell.Font.Size + 2) + 10
LbListe.MultiSelect = fmMultiSelectMulti
topIndex = False
' maj selection dans lbListe
interne = True ' palliatif, EnableEvents ne marche pas
ch = ActiveCell
ch2 = sep & ch & sep
topIndex = False
For i = 0 To LbListe.ListCount - 1
If InStr(ch2, LbListe.List(i)) > 0 Then
' l'item a été trouvé dans la cellule
LbListe.Selected(i) = True
If Not topIndex Then
LbListe.topIndex = i ' le 1er sélectionné doit être visible dans la textbox
topIndex = True
End If
End If
Next i
interne = False
LbListe.Visible = True
End Sub
Code mis dans un module :
Option Explicit
' constantes décrvant la configuration
' Feuille Liste
Public Const FL As String = "Listes" ' nom de la feuille
Public Const liFL As Byte = 1 ' ligne des fournitures
Public Function PlageListe(F As String)
Dim n As Byte, lifin As Byte, co As Byte, obj As Object
With Sheets(FL)
Set obj = .Rows(liFL).Find(F, , , xlWhole)
If obj Is Nothing Then PlageListe = False: Exit Function
co = obj.Column
lifin = .Cells(Rows.Count, co).End(xlUp).Row
PlageListe = .Range(.Cells(liFL + 1, co), .Cells(lifin, co)).Address
End With
End Function
Sub reinit()
Application.EnableEvents = True
End Sub
Merci d'avance de prendre du temps pour solutionner mon problème !
Belle journée.
A voir également:
- Adaption code VBA - Menu à sélection multiple
- Code ascii - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Menu déroulant excel - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
5 réponses
Bonjour
Un essai pour le fonctionnement d'un menu à sélection multiple sur plusieurs feuilles
https://mon-partage.fr/f/Zo61T4PA/
Slts
Un essai pour le fonctionnement d'un menu à sélection multiple sur plusieurs feuilles
https://mon-partage.fr/f/Zo61T4PA/
Slts
Bonsoir,
Merci de mettre à la dispo un fichier anonymiser
Slts
Merci de mettre à la dispo un fichier anonymiser
Slts
Bonjour,
Excusez moi pour ma réponse très tardive. J'ai eu du mal à prendre le temps d'anonymiser mon fichier !
Le voici : https://www.cjoint.com/c/IKmoH4OQShR
Information supplémentaire que je n'avais pas dit, il faudrait que ce menu déroulant à sélection multiple soit répété sur 12 feuilles (qui correspond aux 12 mois de l'année).
Dans mon fichier joint, ce serait sur la colonne "Projet" de chaque tableau qui se trouve sur les feuilles. Cette colonne correspondra toujours à la colonne C et débutera toujours à la ligne 7. Par contre le tableau mensuel est rempli au fur et à mesure. Il faut donc prendre en compte le fait qu'il puisse s'agrandir.
Les éléments de ma liste sont notés sur la feuille nommée "Listes"
Merci beaucoup pour le temps consacré !
Belle journée.
Excusez moi pour ma réponse très tardive. J'ai eu du mal à prendre le temps d'anonymiser mon fichier !
Le voici : https://www.cjoint.com/c/IKmoH4OQShR
Information supplémentaire que je n'avais pas dit, il faudrait que ce menu déroulant à sélection multiple soit répété sur 12 feuilles (qui correspond aux 12 mois de l'année).
Dans mon fichier joint, ce serait sur la colonne "Projet" de chaque tableau qui se trouve sur les feuilles. Cette colonne correspondra toujours à la colonne C et débutera toujours à la ligne 7. Par contre le tableau mensuel est rempli au fur et à mesure. Il faut donc prendre en compte le fait qu'il puisse s'agrandir.
Les éléments de ma liste sont notés sur la feuille nommée "Listes"
Merci beaucoup pour le temps consacré !
Belle journée.
Bonsoir,
Désolé pour la réponse tardive , mais j'étais absent.
En fait j'ai vu le problème.... mais j'ai pas réussi à trouver la solution, mise à part en mettant une macro dans chaque feuille , alors si cela te tente fais le moi savoir.
Ou alors quelqu'un d'autre "contributeur" trouvera une solution
Slts
Désolé pour la réponse tardive , mais j'étais absent.
En fait j'ai vu le problème.... mais j'ai pas réussi à trouver la solution, mise à part en mettant une macro dans chaque feuille , alors si cela te tente fais le moi savoir.
Ou alors quelqu'un d'autre "contributeur" trouvera une solution
Slts
Bonjour,
Aucun soucis, c'est déjà très gentil de ta part de prendre le temps de trouver une solution pour moi.
J'imagine que tu répondais à mon autre message pour enlever le bouton reset ?
A ce que j'ai compris, ce bouton sert à autoriser les évènements, il n'y aurai pas un moyen de l'inclure dans la macro que tu as créé ? Afin d'éviter de devoir cliquer dessus à chaque nouvelle ligne du tableau.
Belle journée.
Aucun soucis, c'est déjà très gentil de ta part de prendre le temps de trouver une solution pour moi.
J'imagine que tu répondais à mon autre message pour enlever le bouton reset ?
A ce que j'ai compris, ce bouton sert à autoriser les évènements, il n'y aurai pas un moyen de l'inclure dans la macro que tu as créé ? Afin d'éviter de devoir cliquer dessus à chaque nouvelle ligne du tableau.
Belle journée.
Bonjour,
En fait je l'avais déjà inclut dans le fichier du post3 mais malheureusement ça ne fonctionne pas. Alors comme je te l'ai dit avec une macro dans chaque feuille ça devrait fonctionner, alors si cela te tente..... à moins qu'un contributeur aurait une solution
Slts
En fait je l'avais déjà inclut dans le fichier du post3 mais malheureusement ça ne fonctionne pas. Alors comme je te l'ai dit avec une macro dans chaque feuille ça devrait fonctionner, alors si cela te tente..... à moins qu'un contributeur aurait une solution
Application.EnableEvents = True
Slts
Bonsoir f894009
Voir la macro dans ThisWorkbook du fichier post #3
En fait dans la plage C7:C9 il y a une liste déroulante à choix multiples, le problème récurant actuel est...... lorsque l'on rajoute une ligne sous C9 la liste déroulante à choix multiples ne fonctionne plus, il faut appuyer sur reset pour qu'elle re-fonctionne alors le demandeur Liitch avait suggérer d'inclure
Application.EnableEvents = True dans la macro pour éviter d'appuyer chaque fois sur reset pour que la liste déroulante à choix multiples re-fonctionne de nouveau, je lui ai dis que Application.EnableEvents = True était déjà inclu dans la macro et qu’apparemment cela ne Reset pas automatiquement
Pour info f894009 s'il tu aurais une solution ce serait le top
Slts
Voir la macro dans ThisWorkbook du fichier post #3
En fait dans la plage C7:C9 il y a une liste déroulante à choix multiples, le problème récurant actuel est...... lorsque l'on rajoute une ligne sous C9 la liste déroulante à choix multiples ne fonctionne plus, il faut appuyer sur reset pour qu'elle re-fonctionne alors le demandeur Liitch avait suggérer d'inclure
Application.EnableEvents = True dans la macro pour éviter d'appuyer chaque fois sur reset pour que la liste déroulante à choix multiples re-fonctionne de nouveau, je lui ai dis que Application.EnableEvents = True était déjà inclu dans la macro et qu’apparemment cela ne Reset pas automatiquement
Pour info f894009 s'il tu aurais une solution ce serait le top
Slts
Bonjour,
J'avais recupere le fichier et apres différents essais sans traitement d'erreur (on error….):
_Ajout ligne au tableau en dessous, pas systématiquement blocage events
_Ecriture dans des cellules en en dehors du tableau dans la plage fixe C7:C20 ou autres(ai fais tellement d'essais que ….), blocage systematique
_Copier une cellule, idem
Avec le code suivant il semblerait que ce soit resolu, a testez
Par contre Liitch, sur ajout lignes tableau (ex:Aout), y a comme un bleme au niveau des formules!!!
J'avais recupere le fichier et apres différents essais sans traitement d'erreur (on error….):
_Ajout ligne au tableau en dessous, pas systématiquement blocage events
_Ecriture dans des cellules en en dehors du tableau dans la plage fixe C7:C20 ou autres(ai fais tellement d'essais que ….), blocage systematique
_Copier une cellule, idem
Avec le code suivant il semblerait que ce soit resolu, a testez
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim Arr(), MaFeuille As String, RG As Range On Error GoTo fin 'D?finis la liste des onglets des feuilles o? la macro doit s'appliquer. 'Ta liste peut ?tre aussi longue que tu veux If Target = "" Or Target.Count > 1 Then Exit Sub Arr = Array("JAN", "FEV", "MARS", "AVRIL", "MAI", "JUIN", "JUILLET", "AOUT", "SEPT", "OCT", "NOV", "DEC") MaFeuille = Sh.Name x = Application.Match(MaFeuille, Arr, 0) If IsNumeric(x) Then 'adaptation de la Plage au nombre de lignes du tableau AdrT = Range("PDC_" & MaFeuille).Address LT = Split(AdrT, "$") 'decoupage adresse du tableau PDC_MMM Set RG = Target If Not Intersect(Range("C7:C" & LT(4)), RG) Is Nothing Then Application.EnableEvents = False Application.ScreenUpdating = False ValSaisie = RG Application.Undo p = InStr(RG, ValSaisie) If p > 0 Then RG = Left(RG, p - 1) & Mid(RG, p + Len(ValSaisie) + 4) If Right(RG, 4) = " , " Then RG = Left(RG, Len(RG) - 4) End If Else If RG = "" Then RG = ValSaisie Else RG = RG & " , " & ValSaisie End If End If End If End If fin: On Error GoTo 0 Application.ScreenUpdating = True Application.EnableEvents = True End Sub
Par contre Liitch, sur ajout lignes tableau (ex:Aout), y a comme un bleme au niveau des formules!!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je te remercie beaucoup, c'est exactement ce que je souhaitais !
Par contre, je dois systématiquement cliquer sur le bouton reset pour chaque nouvelle ligne. Afin que la macro fonctionne. Est-ce qu'il y a un moyen de l'éviter ?
Merci encore.
Bien cordialement.