IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Recherche sur 2 colonnes (trié sur la 1ère) [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Bénévole assoc
    Inscrit en
    Mai 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bénévole assoc
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2018
    Messages : 8
    Par défaut Recherche sur 2 colonnes (trié sur la 1ère)
    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.

  2. #2
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    et rajouter une colonne qui contient le Nom & le Prenom ne convient pas ?

  3. #3
    Membre régulier
    Homme Profil pro
    Bénévole assoc
    Inscrit en
    Mai 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bénévole assoc
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2018
    Messages : 8
    Par défaut
    Bonjour Igloobel

    Citation Envoyé par Igloobel Voir le message
    Bonjour,

    et rajouter une colonne qui contient le Nom & le Prenom ne convient pas ?
    Si j'y ai pensé, Concatener les deux dans une colonne masquée dans mon fichier, mais j'espérais trouver une autre solution.

    Je me rabattrai sur cette solution adapter à ce cas, mais j'ai d'autre fichier ou ça serait plus facile de pouvoir triées 2 colonnes dans la même box.

  4. #4
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    autre solution

    avec du VBA

    1°) tu selectionnes ton nom
    2°) tu listes tous les prénoms qui ont ce nom dans une listBox (utiliser la commande DIR)
    3°) tu choisis dans la liste celui qui te convient

  5. #5
    Membre régulier
    Homme Profil pro
    Bénévole assoc
    Inscrit en
    Mai 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bénévole assoc
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2018
    Messages : 8
    Par défaut
    Ok je vais essayé.

  6. #6
    Membre régulier
    Homme Profil pro
    Bénévole assoc
    Inscrit en
    Mai 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bénévole assoc
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2018
    Messages : 8
    Par défaut
    Bon je te remercie te la réponse.

    Je galère encore trop pour créer ce bout de code tout seul, j'ai encore du mal avec les fonctions et comment assembler les lignes de codes.

    J'ai opter pour la 1ère solution, en reprenant le code de Jacques Boigontier dans ce post,en gardant espoir de pouvoir arriver à ce que je recherche plus tard.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [struts]: Pagination et tri sur les colonnes
    Par sleepy2002 dans le forum Struts 1
    Réponses: 3
    Dernier message: 09/07/2007, 15h16
  2. tri sur une colonne
    Par cubepiege dans le forum Langage SQL
    Réponses: 11
    Dernier message: 13/07/2006, 12h16
  3. Tri sur plusieurs colonnes
    Par soso78 dans le forum Access
    Réponses: 2
    Dernier message: 04/03/2006, 15h28
  4. [JSP] tri sur une colonne
    Par soony dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 28/07/2005, 15h02
  5. [VB6][ListView] Tri sur chaque colonne
    Par frlap dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 26/05/2004, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo