Bonjour, je suis novice en VBA, j'ai commencé à créer quelque chose de simple en me servant des nombreux exemples trouvés sur la toile. Mais je cale sur une procédure.

J'ai un fichier clients avec une colonne "Code" une "Nom" et une "Prénom" entre autres.

Pour faire ma recherche de client j'utilise le gestionnaire de nom pour sélectionner mes colonnes dans ma feuille, un nom pour les codes et un pour les 2 colonnes nom et prénom et j'utilise la propriété "RowSource" de mes combobox pour les intégrer.

Mon problème est que, si mon fichier clients est trié par code, et que je fais la recherche par nom, ce n'est pas trié, et si plusieurs portent le même nom il n'affiche que le premier.

Si je tri par nom le problème des noms en doublons ne se pose plus, mais si j'enregistre un nouveau client, il va créer son numéro, par rapport au dernier numéro de la colonne "code" et nom par rapport au plus grand numéro de code.

J'ai testé plusieurs méthodes. bien sur remplir mes combobox à l'ouverture du formulaire et les fonction de tri. Mon problème est qu'avec la méthode trouvée, je n'arrive à afficher que la colonne des noms, dans la combobox de ma recherche par nom, alors qu'il me faut aussi les prénoms pour selectionner le bon client.

Voici mon formulaire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
'**************************
'*Procédure permettant  de*
'*fermer le formulaire    *
'**************************
Private Sub btnQuitter_Click()
 
    Unload Me
 
End Sub
 
'**************************
'*Procédure pour activer  *
'*la recherche par nom   *
'**************************
Private Sub btnValiderRecheNom_Click()
 
    Dim no_ligne As Integer
 
    no_ligne = cbxListNom.ListIndex + 2
        txtCivilite.Value = Cells(no_ligne, 2).Value
        txtNom.Value = Cells(no_ligne, 3).Value
        txtPrenom.Value = Cells(no_ligne, 4).Value
        txtAdresse.Value = Cells(no_ligne, 6).Value
        txtCP.Value = Cells(no_ligne, 7).Value
        txtVille.Value = Cells(no_ligne, 8).Value
        txtDateN.Value = Cells(no_ligne, 5).Value
        txtTelephone.Value = Cells(no_ligne, 9).Value
        txtCourriel.Value = Cells(no_ligne, 10).Value
 
 
End Sub
 
 
'**************************
'*Procédure pour activer  *
'*la recherche par code   *
'**************************
Private Sub btnValiderRecheCode_Click()
 
    Dim no_ligne As Integer
 
    no_ligne = cboRecheCode.ListIndex + 2
        txtCivilite.Value = Cells(no_ligne, 2).Value
        txtNom.Value = Cells(no_ligne, 3).Value
        txtPrenom.Value = Cells(no_ligne, 4).Value
        txtAdresse.Value = Cells(no_ligne, 6).Value
        txtCP.Value = Cells(no_ligne, 7).Value
        txtVille.Value = Cells(no_ligne, 8).Value
        txtDateN.Value = Cells(no_ligne, 5).Value
        txtTelephone.Value = Cells(no_ligne, 9).Value
        txtCourriel.Value = Cells(no_ligne, 10).Value
 
 
End Sub
 
'*******************************
'*Enregistrer les modifications*
'*******************************
Private Sub btnModifier_Click()
 
    Dim Rep As Integer
 
    Rep = MsgBox("Êtes vous sûr de vouloir modifier ce client ?", vbYesNo + vbQuestion, "Modification d'un client")
    If Rep = vbYes Then
 
    Dim no_ligne As Integer
 
    Sheets("Liste Clients").Select
 
    no_ligne = cboRecheCode.ListIndex + 2
        Cells(no_ligne, 2) = txtCivilite.Value
        Cells(no_ligne, 3) = txtNom.Value
        Cells(no_ligne, 4) = txtPrenom.Value
        Cells(no_ligne, 6) = txtAdresse.Value
        Cells(no_ligne, 7) = txtCP.Value
        Cells(no_ligne, 8) = txtVille.Value
        Cells(no_ligne, 5) = Format(txtDateN.Value, "DD-MMM-YYYY")
        Cells(no_ligne, 9) = txtTelephone.Value
        Cells(no_ligne, 10) = txtCourriel.Value
 
End If
 
End Sub
Sinon voilà ce que j'avais teste, mais qui ne me donne pas satisfaction puisque je ne récupère que la colonne nom.

Dans le formulaire j'ajoute ça:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Option Explicit
 
Dim Flag As Boolean, Ligne As Long
 
Private Sub UserForm_Initialize()
Dim Noms(), codes(), i As Long, drLig As Long
 
Flag = False
Set Feuille = Worksheets("Liste Clients") ' A ADAPTER
cbxListNom.Clear
cboRecheCode.Clear
 
With Feuille
  drLig = .Range("C" & Rows.Count).End(xlUp).Row
  ReDim Preserve Noms(drLig - 2)
  ReDim Preserve codes(drLig - 2)
  For i = 2 To drLig
    Noms(i - 2) = .Range("C" & i).Value
    codes(i - 2) = .Range("A" & i).Value
  Next
End With
'tri : cf Module1
Call tri(codes, LBound(codes), UBound(codes))
Me.cboRecheCode.List = codes
 
Call tri(Noms, LBound(Noms), UBound(Noms))
Me.cbxListNom.List = Noms
End Sub
 
Private Sub cbxListNom_Change()
If cbxListNom = "" Or Flag = True Then Exit Sub
Flag = True
With Feuille
    'on passe par la variable Ligne qui te permet également
    'de remplir tes autres contrôles avec les données de cette ligne
    Ligne = .Columns(3).Cells.Find(cbxListNom.Value, lookat:=xlWhole).Row
    cboRecheCode.Value = .Range("A" & Ligne)
End With
Flag = False
 
End Sub
 
Private Sub cboRecheCode_Change()
If cboRecheCode = "" Or Flag = True Then Exit Sub
Flag = True
With Feuille
    'on passe par la variable Ligne qui te permet également
    'de remplir tes autres contrôles avec les données de cette ligne
    Ligne = .Columns(1).Cells.Find(cboRecheCode.Value, lookat:=xlWhole).Row
    cbxListNom.Value = .Range("C" & Ligne)
End With
Flag = False
End Sub
et dans un module, ça:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
'évite de référencer systématiquement la feuille qui contient ta bdd
Public Feuille As Worksheet
 
'procédure de tri d'une variable tableau
Sub tri(a, gauc, droi)
'sources : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm
Dim ref, g, d, temp
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
       temp = a(g): a(g) = a(d): a(d) = temp
       g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call tri(a, g, droi)
  If gauc < d Then Call tri(a, gauc, d)
End Sub
J'espère avoir réussi à me faire comprendre. et Merci d'avance.

Je peux fournir le fichier excel complet si besoin.