Problème d'utilisation d'un listbox

Bonjour à tous,

J'ai créé un userform afin de remplir une feuille de données. Ce formulaire contient des TextBox et surtout une Listbox qui me permet d'ouvrir un sous formulaire afin d'ajouter des données liées avec la donnée principale du formulaire "père". je m'explique :

Le formulaire "père" me sert à rentrer les données d'une famille : nom de famille, adresse, etc ... et en particulier une listbox me demande de préciser le nombre d'enfants dans cette famille, et lorsque je choisis un item (nombre d'enfants) un sous formulaire s'ouvre afin que je puisse indiquer des éléments concernant ces enfants. Enfant par enfant, une fois les renseignements écrits, je passe au suivant en réinitialisant les textbox de ce sous formulaire. Arrivé au dernier le sous formulaire se ferme et fait place au formulaire principal que je ferme ou réutilise une fois toutes les données écrites. Et c'est là que j'ai un problème, car si je désire réutiliser mon formulaire "père" pour une autre famille (grâce à un bouton "autre famille") , le choix du nombre d'enfants de la famille précédente est conservé donc apparaît dans le formulaire "père" pour lequel tous les textbox ont été remis à zéro, et je n'arrive pas modifier ma listbox "nombre d'enfants" qui reste égale au nombre d'enfants de la famille précédente. ..... ouf!

Comment m'en sortir ? C'est surement bête, mais je ne vois pas.

Voici un bout de mon code

' occupant suivant
        K = 1
        If K = nb Then
        Usf_occupant1.Hide
        Usf_Creation.nb_occupants = ""
        Exit Sub

        Else
        Usf_occupant1.Hide
        Usf_occupant2.Show
        End If

Occupant est l'enfant,Usf_Ctreation est le formulaire "père", Usf_occupantx est le sous formulaire pour l'enfant x, nb est le nombre d'enfants choisis dans la listbox

Voici une image de mon sous formulaire et du bouton "suivant" auquel est adjoint le code précédent. En vert il s'agit du formulaire "père" vers lequel je retourne quand tous les enfants ont été "traités"

formulaire

Merci beaucoup et bonne journée

Jacky

Bonjour.

Pour une remise à zéro compléte d'un formulaire on se contente simplement de le fermer puis de le réouvrir dans la foulée.

unload.me
userform.show

userform a remplacer par le nom du formulaire principal.

Merci pour cette proposition, mais malheureusement elle produit une erreur :

Unload.me ou Unload(Usf_pere) donne l'erreur "Argument non facultatif" ! Je ne vois pas

Bonjour

tu enlève le point a voir

Unload Me

A+

Maurice

En effet le "." était de trop

Merci beaucoup et bonne journée

Jacky

Bonsoir,

Je reviens sur ma question. Le code fonctionne sans problème, mais j'ai encore une petite "exigence" : le choix effectué sur la Listbox avec l'occupant 1 est mis en surbrillance (bleu) et quand je passe à l'occupant 2, le suivant, je souhaiterais que cette surbrillance disparaisse, ce qui n'est pas le cas (voir la photo ci-dessous)

occupants

Est ce possible ?

Merci

Bonjour,

Difficile de se faire une idée avec seulement une image et un bout de code.

Le plus simple serait un fichier exemple sans informations personnelles evidemment.

Bonjour Xmenpl,

Mon bout de code correspond exactement à celui que tu m'as proposé, et il fonctionne très bien.

unload.me
userform.show

si ce n'est qu'au petit détail près, sans grande importance, l'item précédemment choisi (3 dans mon image) ne perd pas sa surbrillance à la réouverture du userform.

Mais même si le 3 reste en surbrillance les items sont accessibles et si on choisi, par exemple, 5, alors c'est 5 qui passera en surbrillance et ce 5 sera bien pris en compte.

petite question : avant de "unloader" l'userform, faut-il ajouter Me.liste.Value ="" (où liste est la ListBox) ?

Il s'agit tout simplement d'un problème "d'esthétique"

Voici mon code :

    reponse = MsgBox("Voulez vous enregistrer une autre fiche ?", vbYesNo)
    If reponse = vbYes Then
        Usf_Creation.liste.Value = ""    ' est-ce pertinent ?
    Else:
    unload Usf_creation
    Menu.Show
    End If

Bonne journée

Jacky

Private Sub Usf_Creation_initialize()
ListBox1.ListIndex = -1
End Sub

Re bonjour,

Je vois dans ce cas pour qu'aucune selection ne s'affiche par défaut dans votre Listbox ; ce n'est pas à la fermeture du userform qu'il faut l'indiquer

mais à l'ouverture : ( listbox1 à remplacer par le nom que vous avez utilisé pour cette listebox ? )

Bonjour Xmenpl

J'ai bien suivi le conseil mais malheureusement en mettant l'instruction

ListBox1.ListIndex = -1

à l'ouverture de l'userform contenant la ListBox, évidemment cette dernière se réinitialise à chaque accès à cet userform. or comme vous pouvez le voir sur la photo de mon premier message en choisissant un nombre (nb) dans ma listebox je désire ouvrir successivement les formulaires xème occupant jusqu'à concurrence du nème, (nb) correspondant au nombre choisi. pour se faire j'utilise le petit bout de code suivant

' occupant suivant
        K = 1
        If K = nb Then
        Usf_occupant1.Hide
        Exit Sub

        Else
        Usf_occupant1.Hide
        Usf_occupant2.Show
        End If

et c'est là que ça se corse, car le nb est remis à zéro du fait de la réinitialisation de la listbox

Je tourne en rond !

Comme je vous l'ai indiqué précédemment sans fichier impossible de voir toutes les actions de tous les évènements.

L'évenement qui "unload" le premier userform est peut-être mal choisit ?

Bonjour…

Comme dans 99,9999 % des cas on n’a aucune idée du contexte donc, à titre d’exemple, dans celui-ci

deux contrôles formulaire nommés U1 et U2, contenant chacun un contrôle Listbox nommés respectivement L1 et L2 et initialisées respectivement par le tableau Ln et le tableau LP ; Dans le premier un contrôle TextBox nommé T pour voir l’effet des choix :

- pour le premier :

Private Sub UserForm_Initialize()
  L1.List = [Ln].Value 'ou autre
End Sub
Private Sub L1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  T = L1: Me.Hide: U2.Show
End Sub

- pour le second :

Private Sub UserForm_Initialize()
  L2.List = [LP].Value 'ou autre
End Sub
Private Sub L2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  U1.T = U1.T & " " & L2
  U1.L1.MultiSelect = 1: U1.L1.MultiSelect = 0
  Unload Me
  U1.Show
End Sub 

Nota : dans toute base de données l’indexation (numérotation) est de rigueur pour simplifier les choses. Il en est de même pour l’outil Tableau !
Ici, je privilégie l’évènement _MouseUp(…) car contrairement aux _Click, _Change voire _Enter, il n’y a pas d’appels récursifs conduisant à des réponses inattendues.

bonjour Ordonc,

Votre proposition ne correspond pas à mes besoins.

Mon problème est le suivant : à partir d'un nombre choisi (nb) dans une listbox appartenant à un userform (Usf_Création) je désire ouvrir successivement des formulaires (Usf_occupantsx, x étant tous les nombres de 1 à nb). Or je perds la valeur de la variable nb quand je passe de Usf_occupants1 à Usf_occupants2. De plus je désire "nettoyer" la listBox" (plus de surbrillance bleue sur le nombre choisi) à la fermeture du dernier Usf_occupantsx.

Mes explications étant assez nébuleuses, rien de tel que le fichier sous les yeux. Je l'ai édulcoré et simplifié au maximum pour l'alléger.

Bonjour Xmenpl , je vous ai également envoyé ce fichier en MP

Merci à vous deux

Cordialement

Jacky

18travail.xlsm (124.83 Ko)

Rebonjour,

J'ai réussi à résoudre mon problème en le biaisant : au lieu d'utiliser une listbox pour obtenir la valeur de ma variable nb, j'utilise un TextBox et de plus je stocke la valeur tapée de ce Textbox dans une cellule le temps de "passer en revue" les nb Userform "occupants".

Cette ruse de sioux fonctionne mais me laisse quand même sur ma faim. J'aimerais savoir pourquoi avec la ListBox je n'arrivais pas à m'en sortir. A force de chercher je me suis rendu compte que la variable nb était remise à zéro au passage d'un Usf_occupantx au Usf_occupants(x+1). J'ai bien essayé en utilisant pour nb une variable Public et également une variable Static, mais rien n'y faisait (il faut dire que je ne suis pas à l'aise avec ces types de variables).

Bref, afin de ne pas mourir idiot je serais heureux que l'on puisse m'expliquer ce phénomène

Merci à tous

C'est encore moi !

Ouf, j'ai enfin résolu mon problème tout en utilisant une listbox et non un textbox, et pour ce faire j'ai fait référence à mes recherches expliquées précédemment (utilisation avec un textbox et sauvegarde momentanée de la variable dans une feuille) et aux conseils de Xmenpl ( "unloader" l'userform Création, le recharger avec l'instruction "Usf_Creation.nb_occupants.ListIndex = -1")

J'arrête donc là toute ma prose qui a peut être dérangé certains et si c'est le cas je m'en excuse.

Donc un grand merci à tous et en particulier à Xmenpl, je peux mourir tranquille mais évidemment le plus tard possible .... !

Jacky

Rechercher des sujets similaires à "probleme utilisation listbox"