[VBA] Récupérer numéro de ligne source d'une sélection listbox

Momo78

XLDnaute Nouveau
Bonjour à tous,

Je bosse actuellement sur l'exploitation d'une base de données de contacts sur excel grace à des UserForm en VBA.
Je rencontre un souci qui me parraissait mineur mais que je n'arrive pas à traiter.

Pour mettre en situation et expliquer mon UserForm :
1) Je sélectionne une ville depuis une ComboBox qui va chercher toutes les différentes possibilités dans la colonne A de ma BdD (feuille excel).
2) La sélection faite précédemment fait le tri dans ma BdD et renvoi les différentes valeurs de la colonne B comprenant dans la colonne A la sélection précédente, dans une listbox.
3) La sélection dans ma listbox me renvoie toutes mes données dans différentes Textbox.

Tout ça, ça fonctionne.

Ce que je voudrais faire, c'est récupérer le numéro de ligne (de ma feuille excel de base) liée à la sélection que j'ai fait dans ma listbox. La, je coince !

Attention, je ne souhaite pas connaitre le numéro de ligne de ma sélection dans la listbox (faisable avec listIndex), c'est bien le numéro de ma ligne dans ma BdD que je veux.

Merci d'avance,

Momo
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] Récupérer numéro de ligne source d'une sélection listbox

Rien à voir. Vous vous trompez apparemment. Le nombre de lignes serait c.Rows.Count. Vaudrait 1. c.Row c'est bien le numéro de la ligne de la cellule c. Il ne faut le noter que lorsque vous trouvez la correspondance, bien évidemment ! Si vous le notez tout à la fin vous avez la ligne de la dernière cellule examinée, ça va de soit !
 
Dernière édition:

Momo78

XLDnaute Nouveau
Re : [VBA] Récupérer numéro de ligne source d'une sélection listbox

Peut-être s'agit-il d'un bug de mon PC ou plus certainement d'une erreur de ma part (emplacement où j'ai intégré le code ou code lui-même) mais chez moi, quand je note :
- c.Row : ça renvoi le numéro de la dernière ligne de mon tableau (ou nombre de ligne)
- c.Rows.count : ça note "1"

Est-ce que ce problème ne viendrait pas simplement de cette ligne...

For Each c In f.Range("J2:J" & f.[J65000].End(xlUp).Row)

.. qui définierait "c" comme la dernière ligne de mon tableau et non pas comme la ligne sélectionnée ?
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] Récupérer numéro de ligne source d'une sélection listbox

Non. À chaque passage dans la boucle c représente une cellule de J2:Jmax, max étant la ligne de la dernière cellule renseignée.
Si c.Row vous renvoie le numéro de la dernière ligne de votre tableau c'est que vous l'avez utilisé après la boucle au lieu de dedans.
Mais je trouve décidément absurde de refaire des tas de recherches à postériori, alors qu'il est si facile de tout ranger proprement et retrouver instantanément avec mon module MSujetCbx.
 
Dernière édition:

Momo78

XLDnaute Nouveau
Re : [VBA] Récupérer numéro de ligne source d'une sélection listbox

Ok !! Ca fonctionne.

C'était donc bien, entre autre, un pb de positionnement de mon code.
Voilà donc la solution :

Private Sub Listbox1_click()
For Each c In f.Range("J2:J" & f.[J65000].End(xlUp).Row) ' on explore la colonne de niveau 1

' si famille alors on ajoute l'élément de la sous-famille au dictionnaire
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Contact = c.Offset(, 5)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Adresse1 = c.Offset(, -3)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Adresse2 = c.Offset(, -2)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.CodePostal = c.Offset(, -1)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Ville = c.Offset(, 0)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Telephone = Format(c.Offset(, 1), "0#"".""##"".""##"".""##"".""##")
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Fax = Format(c.Offset(, 2), "0#"".""##"".""##"".""##"".""##")
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Mail = c.Offset(, 3)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.URL = c.Offset(, 4)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Role = c.Offset(, 6)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.MailContact = c.Offset(, 7)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.MailPerso = c.Offset(, 8)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.TelContact = Format(c.Offset(, 9), "0#"".""##"".""##"".""##"".""##")
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.TelPerso = Format(c.Offset(, 11), "0#"".""##"".""##"".""##"".""##")
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Divers = c.Offset(, 17)
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.Label17.Caption = c.Row

'Si selection de structure, on active le bouton de modification et de suppression
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.CommandButton8.Enabled = True
If c = Me.ComboBox2 And c.Offset(, -5) = Me.ListBox1 Then Me.CommandButton10.Enabled = True


' Label17.Caption = c.Row (Je l'utilisai ici, hors boucle, comme tu le dis)

Next c
End Sub

Merci de ton aide.
 

Momo78

XLDnaute Nouveau
Re : [VBA] Récupérer numéro de ligne source d'une sélection listbox

Non. À chaque passage dans la boucle c représente une cellule de J2:Jmax, max étant la ligne de la dernière cellule renseignée.
Si c.Row vous renvoie le numéro de la dernière ligne de votre tableau c'est que vous l'avez utilisé après la boucle au lieu de dedans.
Mais je trouve décidément absurde de refaire des tas de recherches à postériori, alors qu'il est si facile de tout ranger proprement et retrouver instantanément avec mon module MSujetCbx.

Concernant ton module, je ne doute pas du tout qu'il soit efficace, bien au contraire. Le truc c'est que ça ne fonctionne pas sur mon pc et qu'en regardant le code, je ne le comprend pas. Mon métier n'est pas l'informatique ou la programmation. Je fais ça uniquement de manière amateur et ça me parait juste être une montagne de changer l'ensemble d'un code que j'ai fait petit à petit en suivant des étapes qui me paraissent simple (ou pas) à mon niveau.
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] Récupérer numéro de ligne source d'une sélection listbox

Pourquoi diable refaites vous 18 fois ce test ??? Mettez au moins Me.Contact = c.Offset(, 5) sur une nouvelle ligne, ne répétez plus le test sur les suivantes, et seulement APRÈS avoir noté c.Row quelque part, terminez le tout par End If. Parce qu'il est soumis à la même condition !

Pour que le module MSujetCBx fonctionne dans un autre classeur, il faut aussi y rapatrier le module de classe TableIndex.
 
Dernière édition:

Momo78

XLDnaute Nouveau
Re : [VBA] Récupérer numéro de ligne source d'une sélection listbox

Pourquoi diable refaites vous 18 fois ce test ??? Mettez au moins Me.Contact = c.Offset(, 5) sur une nouvelle ligne, ne répétez plus le test sur les suivantes, et seulement APRÈS avoir noté c.Row quelque part, terminez le tout par End If. Parce qu'il est soumis à la même condition !

Simplement que j'ai dupliqué quelque-chose qui fonctionne une fois autant de fois que j'avais d'info à récupérer et que, comme je ne suis qu'amateur, je ne savais pas que ça pouvait fonctionner autrement...


Pour que le module MSujetCBx fonctionne dans un autre classeur, il faut aussi y rapatrier le module de classe TableIndex.

C'est quoi un module de classe et je le trouve où le TableIndex ?
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] Récupérer numéro de ligne source d'une sélection listbox

À moins d'avoir utilisé le bouton "Basculer les dossiers", auquel cas tout est mélangé, c'est la dernière catégorie de modules d'un projet VBA dans l'explorateur de projets.
On a successivement :
— Microsoft Excel Objets
— Feuilles
— Modules
— Modules de classe
Un module de classe sert à définir des types d'objets. Tous les objets sont définis par des modules de classe, mais la plupart sont dans des bibliothèques mises en référence dans le projet.
Dans le classeur que j'avais joint, il y avait dans cette catégorie un module TableIndex. Il faut le mettre aussi dans un autre classeur pour pouvoir y utiliser des objets de ce type.
 
Dernière édition:

Discussions similaires

Réponses
21
Affichages
1 K
Réponses
6
Affichages
340
Réponses
25
Affichages
644
Réponses
8
Affichages
327
Réponses
18
Affichages
601

Statistiques des forums

Discussions
312 104
Messages
2 085 335
Membres
102 864
dernier inscrit
abderrashmaen