XL 2016 Listbox et valeur associée

jozerebel

XLDnaute Occasionnel
Bonjour à tous,

Je m'arrache les cheveux avec des listbox d'un userform.

Celle-ci sont alimentées par Rowsource pour les choix déroulants.
Cependant, j'ignore pourquoi, certaines listbox apparaissent avec un choix déjà sélectionné (surligné en bleu). Et ce, de manière aléatoire lors de l'initialisation.

Par ailleurs, lorsque sélectionnés, les choix alimentent une feuille excel.

Lorsque je veux modifier un item, j'ai une macro qui est censée remplir ces listboxs. Cependant, de manière aléatoire, le remplissage ne se fait pas...

Ci-dessous la macro pour remplir les cellules via les sélections des listbox:

Worksheets("bdd_dpt").Range("a" & Lignedpt3).Value = Me.fichedpt_cle_dpt.Value
Worksheets("bdd_dpt").Range("b" & Lignedpt3).Value = Me.fichedpt_nom1.Value
Worksheets("bdd_dpt").Range("c" & Lignedpt3).Value = Me.fichedpt_nom2.Value
Worksheets("bdd_dpt").Range("d" & Lignedpt3).Value = Me.fichedpt_service.Value
Worksheets("bdd_dpt").Range("e" & Lignedpt3).Value = Me.fichedpt_adr1.Value
Worksheets("bdd_dpt").Range("f" & Lignedpt3).Value = Me.fichedpt_adr2.Value
Worksheets("bdd_dpt").Range("g" & Lignedpt3).Value = Me.fichedpt_cp.Value
Worksheets("bdd_dpt").Range("h" & Lignedpt3).Value = Me.fichedpt_ville.Value
Worksheets("bdd_dpt").Range("i" & Lignedpt3).Value = Me.fichedpt_mail.Value
Worksheets("bdd_dpt").Range("j" & Lignedpt3).Value = Me.fiche_dpt_we.Value
Worksheets("bdd_dpt").Range("k" & Lignedpt3).Value = Me.fiche_dpt_abs.Value
Worksheets("bdd_dpt").Range("l" & Lignedpt3).Value = Me.fiche_dpt_hospi.Value
Worksheets("bdd_dpt").Range("m" & Lignedpt3).Value = Me.fiche_dpt_repas.Value
Worksheets("bdd_dpt").Range("n" & Lignedpt3).Value = Me.fiche_dpt_mini.Value
Worksheets("bdd_dpt").Range("o" & Lignedpt3).Value = Me.fiche_dpt_factu.Value

et ci-dessous l'initialisation de l'userform:

Me.fichedpt_cle_dpt.Value = Sheets("selection").Range("p2").Value


With Worksheets("bdd_dpt")
Dim Lignedpt As Long
Lignedpt = Recherche(Me.fichedpt_cle_dpt.Text, 1)
Me.fichedpt_nom1.Value = Range("b" & Lignedpt).Value
Me.fichedpt_nom2.Value = Range("c" & Lignedpt).Value
Me.fichedpt_service.Value = Range("d" & Lignedpt).Value
Me.fichedpt_adr1.Value = Range("e" & Lignedpt).Value
Me.fichedpt_adr2.Value = Range("f" & Lignedpt).Value
Me.fichedpt_cp.Value = Range("g" & Lignedpt).Value
Me.fichedpt_ville.Value = Range("h" & Lignedpt).Value
Me.fichedpt_mail.Value = Range("i" & Lignedpt).Value
Me.fiche_dpt_we.Value = Range("j" & Lignedpt).Value
Me.fiche_dpt_abs.Value = Range("k" & Lignedpt).Value
Me.fiche_dpt_hospi.Value = Range("l" & Lignedpt).Value
Me.fiche_dpt_repas.Value = Range("m" & Lignedpt).Value
Me.fiche_dpt_mini.Value = Range("n" & Lignedpt).Value
End With

je ne comprends pas pourquoi ces listbox agissent de cette manière...

D'avance je vous remercie.
 

Staple1600

XLDnaute Barbatruc
Re

Les Me. ne sont pas nécessaires
Avec ce test, es-tu d'accord avec la valeur qu'affiche le MsgBox ?
Code:
Private Sub UserForm_initialize()
Dim Lignedpt As Long
If Sheets("selection").Range("p3").Value = "New" Then
fichedpt_cle_dpt.Value = Sheets("selection").Range("m2").Value
Else
fichedpt_cle_dpt.Value = Sheets("selection").Range("p2").Value
    With Worksheets("bdd_dpt")
        Lignedpt = Recherche(fichedpt_cle_dpt.Value, 1)
        MsgBox Lignedpt 'pour test
        fichedpt_nom1.Value = Range("b" & Lignedpt).Value
        fichedpt_nom2.Value = Range("c" & Lignedpt).Value
        fichedpt_service.Value = Range("d" & Lignedpt).Value
        fichedpt_adr1.Value = Range("e" & Lignedpt).Value
        fichedpt_adr2.Value = Range("f" & Lignedpt).Value
        fichedpt_cp.Value = Range("g" & Lignedpt).Value
        fichedpt_ville.Value = Range("h" & Lignedpt).Value
        fichedpt_mail.Value = Range("i" & Lignedpt).Value
        fiche_dpt_we.Value = Range("j" & Lignedpt).Value
        fiche_dpt_abs.Value = Range("k" & Lignedpt).Value
        fiche_dpt_hospi.Value = Range("l" & Lignedpt).Value
        fiche_dpt_repas.Value = Range("m" & Lignedpt).Value
        fiche_dpt_mini.Value = Range("n" & Lignedpt).Value
        fiche_dpt_factu.Value = Range("o" & Lignedpt).Value
    End With
End If
End Sub
 

jozerebel

XLDnaute Occasionnel
Merci Staple pour ton aide.

Le code modifié renvoie toujours certaines listbox déjà sélectionnées et d'autres non.

1679177851121.png

Et le fait de retourner dedans désélectionne certaines valeurs, ce qui les supprime de ma feuille excel...

1679177923773.png


1679177968536.png
 

Staple1600

XLDnaute Barbatruc
Re

Ce que je voulais savoir c'est si ce qu'affiche la MsgBox est pour toi cohérent ?
(C'est pour le moment un test)
Car chez moi, sans il affiche 10
Et ce second test nous amène en B10 (qui est vide)
VB:
Private Sub UserForm_initialize()
Dim Lignedpt As Long
If Sheets("selection").Range("p3").Value = "New" Then
fichedpt_cle_dpt.Value = Sheets("selection").Range("m2").Value
Else
fichedpt_cle_dpt.Value = Sheets("selection").Range("p2").Value
    With Worksheets("bdd_dpt")
        Lignedpt = Recherche(fichedpt_cle_dpt.Value, 1)
        MsgBox Lignedpt 'pour test
        MsgBox .Range("b" & Lignedpt).Address 'test 2
        fichedpt_nom1.Value = Range("b" & Lignedpt).Value
        fichedpt_nom2.Value = Range("c" & Lignedpt).Value
        fichedpt_service.Value = Range("d" & Lignedpt).Value
        fichedpt_adr1.Value = Range("e" & Lignedpt).Value
        fichedpt_adr2.Value = Range("f" & Lignedpt).Value
        fichedpt_cp.Value = Range("g" & Lignedpt).Value
        fichedpt_ville.Value = Range("h" & Lignedpt).Value
        fichedpt_mail.Value = Range("i" & Lignedpt).Value
        fiche_dpt_we.Value = Range("j" & Lignedpt).Value
        fiche_dpt_abs.Value = Range("k" & Lignedpt).Value
        fiche_dpt_hospi.Value = Range("l" & Lignedpt).Value
        fiche_dpt_repas.Value = Range("m" & Lignedpt).Value
        fiche_dpt_mini.Value = Range("n" & Lignedpt).Value
        fiche_dpt_factu.Value = Range("o" & Lignedpt).Value
    End With
End If
End Sub
 

Staple1600

XLDnaute Barbatruc
De là où je suis , j'écrirais le code ainsi
NB: J'ai un ajouté une valeur à la propriété Tag des TextBox
sur ce modèle:
c_1
c_2

etc
VB:
Private Sub UserForm_initialize()
Dim Lignedpt As Long, ctrl As Control
If Sheets("selection").Range("p3").Value = "New" Then
fichedpt_cle_dpt.Value = Sheets("selection").Range("m2").Value
Else
fichedpt_cle_dpt.Value = Sheets("selection").Range("p2").Value
Lignedpt = Recherche(Worksheets("bdd_dpt"), CStr(fichedpt_cle_dpt.Value), 1) - 1
MsgBox Lignedpt 'pour test
    With Worksheets("bdd_dpt")
        For Each ctrl In Me.Controls
        If Len(ctrl.Tag) Then
        If TypeName(ctrl) = "TextBox" Then
        ctrl.Value = .Cells(Lignedpt, "B").Offset(, CLng(Split(ctrl.Tag, "_")(1)) - 1).Value
        End If
        End If
        Next
    End With
End If
End Sub
Quand j'affiche l'userform depuis VBE, les TextBox sont bien remplis avec les valeurs présentes sur la dernière ligne non vide de la feuille bdd_dpt
NB:
J'ai également modifié cette procédure
VB:
Function Recherche(F As Worksheet, Valeur, Colonne As Integer) As Long
Dim Trouve As Range
    Set Trouve = F.Columns(Colonne).Find(Valeur, , xlValues, xlWhole)
    If Not Trouve Is Nothing Then  'Trouvé
        Recherche = Trouve.Row
    Else
        Recherche = 0
    End If
End Function
 

ChTi160

XLDnaute Barbatruc
Bonjour le Fil

pour participer a mon petit Niveau

il faut savoir que lorsque l'on utilise la Fonction "RowSource" pour alimenter un Control (ici ListBox) il n'est pas possible de changer les valeurs de la Liste qui a été chargée.
Exemple :
Dans la ListBox "fiche_dpt_repas", tu n'as qu'une Valeur "Aah x 0,01 x nbre repas avec repas plafonnés à 20" entrée via "RowSource" = "valo_repas"
Et lors de la récupération de la Ligne après double Click
La valeur affectée à ce Control est Vide ! Donc erreur car dans la Liste , il n'y a pas de choix "" (vide)
Question : Pourquoi ne pas utiliser des ComboBox plutôt que des ListBox (Sensées)afficher une Liste ?

Bonne Journée
Jean marie
 
Dernière édition:

jozerebel

XLDnaute Occasionnel
De là où je suis , j'écrirais le code ainsi
NB: J'ai un ajouté une valeur à la propriété Tag des TextBox
sur ce modèle:
c_1
c_2

etc
VB:
Private Sub UserForm_initialize()
Dim Lignedpt As Long, ctrl As Control
If Sheets("selection").Range("p3").Value = "New" Then
fichedpt_cle_dpt.Value = Sheets("selection").Range("m2").Value
Else
fichedpt_cle_dpt.Value = Sheets("selection").Range("p2").Value
Lignedpt = Recherche(Worksheets("bdd_dpt"), CStr(fichedpt_cle_dpt.Value), 1) - 1
MsgBox Lignedpt 'pour test
    With Worksheets("bdd_dpt")
        For Each ctrl In Me.Controls
        If Len(ctrl.Tag) Then
        If TypeName(ctrl) = "TextBox" Then
        ctrl.Value = .Cells(Lignedpt, "B").Offset(, CLng(Split(ctrl.Tag, "_")(1)) - 1).Value
        End If
        End If
        Next
    End With
End If
End Sub
Quand j'affiche l'userform depuis VBE, les TextBox sont bien remplis avec les valeurs présentes sur la dernière ligne non vide de la feuille bdd_dpt
NB:
J'ai également modifié cette procédure
VB:
Function Recherche(F As Worksheet, Valeur, Colonne As Integer) As Long
Dim Trouve As Range
    Set Trouve = F.Columns(Colonne).Find(Valeur, , xlValues, xlWhole)
    If Not Trouve Is Nothing Then  'Trouvé
        Recherche = Trouve.Row
    Else
        Recherche = 0
    End If
End Function
Salut Staple,

J'ai essayé ta propo mais j'obtiens une erreur lors de l'initialize de l'usf...

Peut-être ai-je mal compris ?
 

Pièces jointes

  • Factu Simul - Copie.xlsm
    352.7 KB · Affichages: 4

jozerebel

XLDnaute Occasionnel
Bonjour le Fil

pour participer a mon petit Niveau

il faut savoir que lorsque l'on utilise la Fonction "RowSource" pour alimenter un Control (ici ListBox) il n'est pas possible de changer les valeurs de la Liste qui a été chargée.
Exemple :
Dans la ListBox "fiche_dpt_repas", tu n'as qu'une Valeur "Aah x 0,01 x nbre repas avec repas plafonnés à 20" entrée via "RowSource" = "valo_repas"
Et lors de la récupération de la Ligne après double Click
La valeur affectée à ce Control est Vide ! Donc erreur car dans la Liste , il n'y a pas de choix "" (vide)
Question : Pourquoi ne pas utiliser des ComboBox plutôt que des ListBox (Sensées)afficher une Liste ?

Bonne Journée
Jean marie

Salut ChTi160 et merci pour ta réponse,​

Je ne comprends pas car les cellules sont remplies avec le texte stricto sensu sélectionné (et donc contenu dans la liste de choix).

Par ailleurs, je ne souhaite pas que l'utilisateur puisse éditer la liste de choix.
 

ChTi160

XLDnaute Barbatruc
Bonjour,
Dans ton Fichier les Données des "RowSource" sont dans une Feuille (refs) !
si tu charges ta ListView de Puis ta feuille Source
si sur cette Ligne il y a un element qui ne se trouve pas dans une de tes Listes des Controls de Ton Userform (fiche_dpt) , ça cause une erreur !
Bonne Journée
Jean marie
 

jozerebel

XLDnaute Occasionnel
Bonjour,
Dans ton Fichier les Données des "RowSource" sont dans une Feuille (refs) !
si tu charges ta ListView de Puis ta feuille Source
si sur cette Ligne il y a un element qui ne se trouve pas dans une de tes Listes des Controls de Ton Userform (fiche_dpt) , ça cause une erreur !
Bonne Journée
Jean marie
Re,

Ben justement, c'est là que je ne comprends pas. Car la fiche dpt est alimentée par une row source. Puis une fois sélectionné, la ligne de la listbox alimente la bdd_dpt. Quand je clique sur une ligne de la listview, c'est les cellules de la bdd_dpt qui alimentent les listbox de l'usf fiche_dpt. Donc l'item se trouve forcément dans la liste...

Je ne comprends plus rien... :(-/
 

Discussions similaires

Statistiques des forums

Discussions
311 730
Messages
2 081 991
Membres
101 856
dernier inscrit
Marina40