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 Sub

Le 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 Sub

Je vous propose un fichier exemple en pièce jointe.

82test.xlsm (153.55 Ko)

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.Show

tu é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.Show

pour 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 Sub

Comme 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 Sub

Si 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 Sub

Le fichier :

173copie-de-test.xlsm (143.64 Ko)

Cordialement,

Bonjour,

C'est exactement ça, un grand.. non plutot un immense merci! J'ai compris ce que tu me suggères pour la conservation des choix via un array que je vais étudier dès que possible.

Encore merci,

Bonne journée.

Rechercher des sujets similaires à "rafraichir listbox perdre selections cours"