Rafraichir une listbox sans perdre les selections en cours
Bonjour à tous,
Je suis confronté à un petit problème sur un Userform, j'ai 3 listbox à choix multiples initialisées à partir de plages variables sur 3 feuilles différentes de mon classeur.
J'ai créé 1 bouton à coté de chaque listbox qui me permet de compléter mes listbox avec de nouveaux items. Pour rafraichir mes listbox, j'utilise une astuce peu élaborée, j'unload l'userform et le réouvre aussitot. Le souci c'est qu'en ajoutant un item, les sélections déjà réalisées sont perdues et je voulais savoir s'il était possible de rafraichir mes listbox sont perdre les sélections déjà faites.
Je vous propose mes codes :
L'initialisation de mes listbox
Private Sub UserForm_Initialize()
Dim I As Integer, No_Colonne As Integer
Dim LesFeuilles, LesControles
Dim J As Long, Nb_Lignes As Long
LesFeuilles = Array("Risques-Origines", "Risques-Sit. Dangereuses", "Risques-Conséquences")
LesControles = Array("ListBox_Origines", "ListBox_Situations", "ListBox_Conséquences")
For I = 0 To UBound(LesFeuilles)
Me.Controls(LesControles(I)).Clear
With Sheets(LesFeuilles(I))
No_Colonne = Application.WorksheetFunction.Match(Target_Offset_Y, .Range("A2:BE2"), 0)
Nb_Lignes = .Cells(Rows.Count, No_Colonne).End(xlUp).Row
For J = 3 To Nb_Lignes
Me.Controls(LesControles(I)).AddItem .Cells(J, No_Colonne)
Next J
End With
Next I
End SubLe code d'un bouton qui permet d'ajouter un item :
Private Sub CommandButton1_Click()
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String
Valeur_Cherchee = ActiveCell.Offset(0, -1).Value
Set PlageDeRecherche = Sheets("Risques-Conséquences").Rows(2)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, lookAt:=xlWhole)
If Trouve Is Nothing Then
MsgBox Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address
Else
Sheets("Risques-Conséquences").Visible = True
Sheets("Risques-Conséquences").Select
Trouve.Select
ActiveCell.Offset(1, 0).Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
ActiveCell = TextBox1.Value
With Selection.Font
.Color = -16776961
.TintAndShade = 0
End With
End If
Sheets("Risques-Conséquences").Visible = False
Sheets("Document Unique").Select
Unload UserForm_Aj_Con
Unload UserForm_Objectivation
UserForm_Objectivation.Show
End SubJe vous propose un fichier exemple en pièce jointe.
Je vous remercie d'avance et remercie plus généralement toutes les personnes de ce forum pour la source précieuse d'information.
Bonne soirée
Bonjour
Une idée.
Dans la macro associée au bouton ‘’Ajouter une origine’’, tu commences par écrire les instructions qui vont repérer par 0 ou 1 l’état des CheckBox dans une feuille de calcul : la feuille ‘’Risques-Origines’’ est toute indiquée, en particulier sur les mêmes lignes que les items qui correspondent aux différents ChechBox.
Ensuite, lorsque le nouveau CheckBox aura été créé, et juste avant la dernière instruction associée au bouton ‘’Valider’’ de l’UserForm ‘’ ListBox_Origines’’, c’est-à-dire avant :
UserForm_Objectivation.Showtu écris les instructions qui vont demander à la macro de venir lire sur la feuille où ils ont été écrits les états initiaux des CheckBox et de les remettre dans le même état sur l’userform
OK ?
Bye !
Bonjour,
Merci pour cette idée, pour être tout à fait franc, je me demandais s'il n'existait pas un bout de code qui me permettrait de remplacer ceci :
Unload UserForm_Objectivation
UserForm_Objectivation.Showpour rafraichir mes listbox, par exemple si j'appelle le private sub d'initialisation de mes listbox dans les macro de mes boutons "valider" de mes userform d'ajouts d'items? Est ce que l'instruction "call" est possible sur un private sub et si oui est ce que mes items resteront cochés ?
En attendant, merci encore pour cette première piste que je vais essayer de coder.
Bonne journée.
Bonjour
Reco a écrit :Est ce que l'instruction "call" est possible sur un private sub et si oui est ce que mes items resteront cochés ?
L’instruction call est possible mais si tu réinitialises ta listbox, le call sera possible mais les items seront dans l’état où les aura mis la réinitialisation.
C’est pour cela que je te disais de noter quelque part cet état puis, après la réinitialisation, d’aller lire ces données pour remettrel les items dans leur état initial.
Bye !
Bonjour,
Voici une adaptation de ton code qui va te faciliter les choses (plus besoin d'ouvrir et fermer l'UserForm) :
'Option Explicit
Private Sub CommandButtonAjoutConséquences_Click()
UserForm_Aj_Con.Show
rafraichir_une_listbox "Risques-Conséquences", "ListBox_Conséquences"
End Sub
Private Sub CommandButtonAjoutDonnées_Click()
UserForm_Aj_Ori.Show
rafraichir_une_listbox "Risques-Origines", "ListBox_Origines"
End Sub
Private Sub CommandButtonAjoutSituation_Click()
UserForm_Aj_Sit.Show
rafraichir_une_listbox "Risques-Sit. Dangereuses", "ListBox_Situations"
End Sub
Private Sub UserForm_Initialize()
rafraichir_une_listbox "Risques-Origines", "ListBox_Origines"
rafraichir_une_listbox "Risques-Sit. Dangereuses", "ListBox_Situations"
rafraichir_une_listbox "Risques-Conséquences", "ListBox_Conséquences"
End Sub
Private Sub rafraichir_une_listbox(feuille, controle)
No_Colonne = Application.WorksheetFunction.Match(Target_Offset_Y, Sheets(feuille).Range("A2:BE2"), 0)
Nb_Lignes = Sheets(feuille).Cells(Rows.Count, No_Colonne).End(xlUp).Row
Controls(controle).Clear
For J = 3 To Nb_Lignes
Controls(controle).AddItem Sheets(feuille).Cells(J, No_Colonne)
Next J
End SubComme tu peux le voir ici, les ListBox sont rafraîchies individuellement (au lieu de fermer/ouvrir) :
Private Sub CommandButtonAjoutConséquences_Click()
UserForm_Aj_Con.Show
rafraichir_une_listbox "Risques-Conséquences", "ListBox_Conséquences" 'Actualisation d'une seule ListBox
End SubSi tu veux conserver les choix de l'utilisateur, voici une idée :
Private Sub CommandButtonAjoutConséquences_Click()
'Ici tu enregistres le(s) choix dans un array
UserForm_Aj_Con.Show
rafraichir_une_listbox "Risques-Conséquences", "ListBox_Conséquences"
'Ici tu coches le(s) choix dans la liste rafraîchie
End SubLe fichier :
Cordialement,
Bonjour,
Encore merci,
Bonne journée.