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:
Sinon voilà ce que j'avais teste, mais qui ne me donne pas satisfaction puisque je ne récupère que la colonne nom.
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
Dans le formulaire j'ajoute ça:
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
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
J'espère avoir réussi à me faire comprendre. et Merci d'avance.
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
Je peux fournir le fichier excel complet si besoin.
Partager