VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feuille

  • Initiateur de la discussion Initiateur de la discussion fb62840
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

fb62840

XLDnaute Impliqué
Bonjour à toutes et tous,

J'ai besoin de votre aide pour réussir à partir d'une listbox1 à plusieurs colonnes sur la page 1 d'un multipages
de :
comparer la valeur contenu dans cette listbox1 dans la colonne 1 aux lignes de la colonne A sur une feuille (nommée COMP) du classeur (un même identifiant peut être répété plusieurs fois sur la feuille COMP - mais il n'est présent qu'une fois dans la Listbox1)

Et,

Si l'identifiant est identique :

Alimenter une ListboxPage2 placée sur la page2 du multipages avec les données de la feuille COMP aux colonnes A, B, C, D, et E et F

Voir le fichier joint.

Merci beaucoup pour votre aide.
 

Pièces jointes

Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonjour Fb, bonjour le forum,

Tout d'abord quelques remarques...
• Il me semble que les variables publiques doivent être déclarées en haut d'un module ordinaire et là elles le sont mais dans une UserForm (Feuille). Peut-être elles perdront leur portée (non testé)
Code:
Public aa
Public mem1 As Boolean

• à l'ouverture de l'UserForm il y a un bug :
Code:
Private Sub UserForm_Initialize()
C3.Visible = 0: C4.Visible = 0
End Sub
j'ai commenté la ligne pour l'éviter...

Comme tu n'as pas préciser par quel moyen tu allais alimenter la listbox ListBoxPage2 j'ai utilisé la procédure Exit de la TextBox5. Tu adapteras si nécessaire...
Les codes :
Code:
Private Sub TextBox5_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'à la sortie de la TextBox5
Dim id As String 'déclare la variable id (IDentifiant)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)

If Me.TextBox5.Value = "" Then Exit Sub 'si la TextBox5 est vide, sort de la procédure
id = Me.TextBox5.Value 'définit l'identifiant id
With Sheets("COMP") 'prend en compte l'onglet "COMP"
    dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet
    Set pl = .Range("A2:D" & dl) 'définit la plage pl
    .Range("A1").AutoFilter 'lance le filtre automatique
    .Range("A1").AutoFilter Field:=1, Criteria1:=id 'filtre la colonne 1 avec l'identifiant id comme critère
    Me.ListBoxPage2.List = pl.SpecialCells(xlCellTypeVisible).Value 'alimente la listbox "ListBoxPage2"
    .Range("A1").AutoFilter 'annule le filtre automatique
End With 'fin de la prise en compte de l'onglet "COMP"
End Sub

Code:
Private Sub ListBoxPage2_Click() 'au clic dans la listbox "ListBoxPage2"
Dim i As Byte 'déclare la variable i (Incrément de textboxes)

With Me.ListBoxPage2 'prend en compte la listbox "ListBoxPage2"
    For i = 6 To 8 'boucle sur les 3 textboxes
        Me.Controls("TextBox" & i).Value = .Column(i - 5, .ListIndex) 'récupère la valeur de l'élément sélectionné
    Next i 'prochaine textbox de la boucle
End With 'fin de la prise en compte de la listbox "ListBoxPage2"
End Sub
Le fichier :
 

Pièces jointes

Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonsoir Robert,

Merci beaucoup pour ces explications.

J'ai modifié les macros et je vais tenir compte de vos remarques pour essayer encore d'améliorer les codes (notamment dans la déclaration des variables).

J'ai un problème sur lequel je peine depuis un bon moment.
J'ai réussi à collecter les données à insérer dans les colonnes de la listbox2 mais ce qui se produit avec le code que j'ai saisi est étonnant, je collecte bien les valeurs à placer en première ligne par contre lorsque je dois passer aux lignes suivantes je ne parviens pas à récupérer les données lignes à ligne).

J'explique :
Je vérifie si dans la colonne A de la feuille COMP je trouve l'identifiant de l'enregistrement,
A chaque ligne sur lesquels il est présent, je voudrais ajouter une ligne à la listbox avec les données de la colonne B, C, D.

Merci pour vos conseils.
 

Pièces jointes

Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonsoir François, bonsoir le forum,

je t'avais proposé une solution fiable dans mon post précédent. Voici le code adapté :
Code:
Private Sub T5_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'à la sortie de la textbox T5
Dim id As String 'déclare la variable id (IDentifiant)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)

If Me.T5.Value = "" Then Exit Sub 'si la T5 est vide, sort de la procédure
id = Me.T5.Value 'définit l'identifiant id
With Sheets("COMP") 'prend en compte l'onglet "COMP"
    dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet
    Set pl = .Range("A2:D" & dl) 'définit la plage pl
    .Range("A1").AutoFilter 'lance le filtre automatique
    .Range("A1").AutoFilter Field:=1, Criteria1:=id 'filtre la colonne 1 avec l'identifiant id comme critère
    Me.ListBox1.List = pl.SpecialCells(xlCellTypeVisible).Value 'alimente la listbox1
    Me.ListBoxPage2.List = pl.SpecialCells(xlCellTypeVisible).Value 'alimente la listbox "ListBoxPage2"
    .Range("A1").AutoFilter 'annule le filtre automatique
End With 'fin de la prise en compte de l'onglet "COMP"
End Sub
Mais j'avais oublié de te dire qu'il fallait changer la propriété ColumnCount des deux listboxes en passant de 1 à 4.

Le fichier :
 

Pièces jointes

Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonjour

Effectivement ce code est bien mieux rédigé et il fonctionne bien, sauf sur la partie qui doit alimenter la ListBox2, comme dans le fichier que j'ai envoyé précédemment, il y a un problème pour les lignes suivants la ligne 1 de la ListBox2...

Je ne vois pas d'où cela peut venir.

Merci
 
Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonsoir François, bonsoir le forum,

Je ne comprend pas où est le problème ? Chez moi il semblerait qu'il n'y en ai pas... Pourrais-tu me détaillé la procédure pour faire buger.

Sinon, je me suis rendu compte que si on entrait un identifiant qui n'existait pas dans l'onglet COMP ça plantait car il n'y a plus de cellules visibles après filtrage. On peut corriger avec juste un On Error Resume Next :
Code:
Private Sub T5_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'à la sortie de la T5
Dim id As String 'déclare la variable id (IDentifiant)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)

If Me.T5.Value = "" Then Exit Sub 'si la T5 est vide, sort de la procédure
id = Me.T5.Value 'définit l'identifiant id
With Sheets("COMP") 'prend en compte l'onglet "COMP"
    dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet
    Set pl = .Range("A2:D" & dl) 'définit la plage pl
    .Range("A1").AutoFilter 'lance le filtre automatique
    .Range("A1").AutoFilter Field:=1, Criteria1:=id 'filtre la colonne 1 avec l'identifiant id comme critère
    On Error Resume Next
    Me.ListBoxPage2.List = pl.SpecialCells(xlCellTypeVisible).Value 'alimente la listbox "ListBoxPage2"
    Me.ListBox1.List = pl.SpecialCells(xlCellTypeVisible).Value 'alimente la listbox "ListBoxPage2"
    On Error GoTo 0
    .Range("A1").AutoFilter 'annule le filtre automatique
End With 'fin de la prise en compte de l'onglet "COMP"
End Sub
 
Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Re-bonsoir,

En fait voici ce qui se produit si je sélectionne ID01

Sur la page 2 du multipage, dans la listbox2 j'ai :

Une ligne avec : ID01 CROM Arras 1997
suivi de deux lignes avec seulement :
ID01
ID01.

C'est tout.
 
Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonsoir François, bonsoir le forum,

tu sélectionnes ID01 où ?
Moi je le tapes dans la textbox T5 etchez moi les deux listboxes sont correctement alimentées. Toutes les lignes, sont bien renseignées...
 
Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Re...

En fait je commence à saisir les premiers caractères de ID05 et dans la listbox1 apparaissent toutes les lignes dans lesquelles se trouvent un identifiant commençant par ID, si je sélectionne dans la listbox l'ID05 j'obtiens ce que j'ai décrit dans le message précédent.

Si je saisi ID01 dans la textbox T5 après avoir validé par entrée j'obtiens bien dans la listbox2 les bonnes lignes.

J'aimerais en fait obtenir ce résultat non pas sur T5_Exit mais sur un clic dans la listbox (après saisie de toute ou partie des caractères dans la T1.

Merci
 
Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonjour,

Merci à vous pour ces efforts. Avec la version Fb_V03 j'ai toujours un problème d'actualisation de la LisbBox2,
En fait elle reste "bloquée" avec les données de ID01, je m'explique :
Si je saisi ID dans le champ Recherche, la ListBox1 affiche toutes les lignes de la feuille Base
Si ensuite je clic dans la ListBox1 sur la première ligne voici ce que j'obtiens dans la listbox2 :
4 lignes avec ID01, les 3 premières qui affichent correctement les valeurs en colonne, une 4ème avec seulement ID01

Et Si ensuite je reviens sur la première page du multipage, que je saisie un nouvel identifiant de recherche exemple :
ID et que je clique dans la ListBox1 sur la ligne ID03 alors j'obtiens dans la listbox2 :
4 lignes avec ID01, les 3 premières qui affichent correctement les valeurs en colonne, une 4ème avec seulement ID01

Bonne journée.
 
Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonjour Robert,

Le comportement est étonnant,
Si je saisie les premiers caractères ID dans le champ de recherche, la listbox1 affiche l'ensemble des lignes de la feuille "RECAP"
Si je clic sur une ligne (quelque soit la ligne) de la listbox1 alors voici ce qui se passe :

- la textbox2 prend comme valeur ID01
- la listbox1 affiche les données en lignes pour l'identifiant ID01
- la listbox2 affiche les données en lignes pour l'identifiant ID01

Merci.
 
Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonjour François, bonjour le forum,

En fait j'avais mal compris ta demande et par conséquent, fait un code inapproprié...
En pièce jointe la version 5 qui devrait répondre à tes attentes :
 

Pièces jointes

Re : VBA sur Userform comparant une valeur dans une listbox à une valeur sur une feui

Bonjour François, bonjour le forum,

En fait j'avais mal compris ta demande et par conséquent, fait un code inapproprié...
En pièce jointe la version 5 qui devrait répondre à tes attentes :

Bonjour Robert,

Merci vraiment beaucoup pour ces multiples corrections, c'est très gentil à vous d'avoir fais tous ces efforts. J'ai sans doute été maladroit dans mon explication, ce qui explique la confusion.

Il reste un problème :
Si je clique une première fois dans la ListBox1, les champs et la listbox2 s'alimentent correctement
Mais, si après avoir cliqué une première fois, je clique dans la listbox1 sur une autre ligne alors la ligne du code suivante s'active :
Code:
If Err <> 0 Then MsgBox "L'identifiant sélectionné n'apparaît pas dans la liste"

J'ai mis cette ligne en commentaire car en fait, si la listbox1 n'est pas vide, alors le cas Err <>0 ne peut pas se produire.

Bon après-midi,
Fabrice
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour