en difficulté sur une macro de choix multiples à cocher
Bonjour à tous,
J'ai besoin pour un projet d'intégrer dans un tableau des cellules qui ouvrent une liste déroulante de choix à cocher, lesquels sont ensuite intégrés dans la cellule séparés par des virgules.
Pour moi qui suis novice en VBA c'est déjà un défi. J'ai pourtant réussi à trouver un fichier exemple qui correspond exactement à ce que je veux et je pensais pouvoir le réadapter à ma sauce mais... ça ne marche pas comme je voudrais.
Le problème c'est que je ne comprends pas très bien le code que j'ai récupéré, alors je vous montre.
Donc l'idée vous vous en doutez est d'insérer une listbox que j'ai nommé lbxFormation dans mon fichier et ensuite voici le code associé :
Code:
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
|
Option Explicit
Dim interne As Boolean
Sub LbxFormation_Change()
Dim ch As String, i As Long, sep As String
If Not interne Then
ch = ""
sep = ", "
For i = 0 To lbxFormation.ListCount - 1
If lbxFormation.Selected(i) = True Then ch = ch & sep & lbxFormation.List(i)
Next i
ch = Mid(ch, Len(sep) + 1)
ActiveCell = ch
End If
End Sub
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("lstSouhaits")
' nom des liste dans la feuille liste (en liaison avec les plages définies au-dessus)
nomListe = Array("lstFormation")
' 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
lbxFormation.ListFillRange = "BDD Formations!" & Worksheets("BDD Formations").Range(nomListe(numListe)).Address
lbxFormation.Top = Target.Offset(1, 0).Top
lbxFormation.Left = Target.Offset(0, 1).Left
interne = True
ch = ActiveCell
ch2 = ", " & ch & ", "
topIndex = False
' sélectionner selon contenu cellule
For i = 0 To lbxFormation.ListCount - 1
If InStr(ch2, ", " & lbxFormation.List(i) & ", ") > 0 Then
' l'item a été trouvé dans la cellule
lbxFormation.Selected(i) = True
If Not topIndex Then
lbxFormation.topIndex = i ' le 1er sélectionné doit être visible dans la textbox
topIndex = True
End If
End If
Next i
interne = False
' afficher textbox
lbxFormation.Visible = True
Else
' ne plus afficher la textbox
lbxFormation.Visible = False
End If
End Sub
Sub reinit()
Application.EnableEvents = True
End Sub |
La ligne que j'ai mis en rouge pose apparemment problème, elle vide la ListBox. Si je la retire, ça fonctionne à peu près, sauf que ça ne réinitialise pas la listbox, donc les choix faits précédemment réapparaissent quand on clique sur une nouvelle cellule. Mais je pense aussi que la partie juste au dessus qui cherche à savoir si la cellule contient tel ou tel item ne fonctionne pas non plus.
Bref je suis un peu perdu et je ne sais pas trop comment m'en sortir...
Merci d'avance pour votre aide