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"
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)
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
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
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