XL 2019 Saisie semi-automatique par mots clés Excel

Laurie21700

XLDnaute Nouveau
Bonjour à tous 👋

Malgré de nombreuses heures à chercher des solutions sur des vidéos YouTube avec mon faible niveau en Excel, je jette l’éponge !

Peut-être quelqu’un aurait la solution à mon problème sur ce forum :)

Voilà… j’ai un tableau Excel avec une liste client. Chaque client à un numéro.

J’aimerai qu’en saisissant un mot clé du nom ou prénom du client, exemple : « Cach » pour Lise Cacheux, ça me propose ce client et que dans une autre colonne son numéro de client s’affiche.

Actuellement j’ai juste une liste déroulante où je peux faire juste une recherche avec la 1ère lettre. Mais ayant de nombreux clients, il me faudrait une recherche semi-automatique par « contient » et non « commence par »

J’ai déjà mon tableau de crée. Est-ce que quelqu’un pourrait m’aider pour la création de ces formules svp ?

Je vous joindrais mon tableau.

Merci beaucoup pour votre aide.
Laurie
 

Etoto

XLDnaute Barbatruc
Il y a pour certains clients que ça ne fonctionne pas : Anne Jarry, Coralie Rebai et je pense d'autres aussi du coup. Etrange
Quoi ? Tout fonctionne pour moi :
WhatsApp Image 2022-03-03 at 09.34.14.jpeg


Photo faite avec mon téléphone car l'application capture ne veut pas montrer le liste déroulante 😅

Et Coralie Rebai fonctionne aussi pour moi. Tu utilises qu'elles étapes ?
 

job75

XLDnaute Barbatruc
Bonjour Laurie21700, le fil,

Une solution VBA dans le fichier joint.

Elle nécessite d'avoir une ComboBox dans chaque feuille de mois.

Le code dans ThisWorkbook :
VB:
Dim CB(0) As New Classe1 'mémorise le tableau

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not IsDate(Sh.Name) Then Exit Sub
Set Target = Intersect(Target.EntireRow, Sh.Range("F2:G" & Sh.Rows.Count), Sh.UsedRange.EntireRow)
If Target Is Nothing Then Exit Sub
Dim d As Object, dd As Object, tablo, i&, col%
'---listes des paniers et des clients---
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
dd.CompareMode = vbTextCompare 'la casse est ignorée
tablo = Sheets("Liste Clients").[A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    d(tablo(i, 1)) = tablo(i, 2)
    dd(tablo(i, 2)) = tablo(i, 1)
Next i
'---recherches des paniers et des clients---
Application.EnableEvents = False 'désactive les évènements
For Each Target In Target.Areas 'si entrées multiples (copier-coller)
    tablo = Target 'matrice, plus rapide
    col = ActiveCell.Column
    For i = 1 To UBound(tablo)
        If col = 6 Then
            If d.exists(tablo(i, 1)) Then tablo(i, 2) = d(tablo(i, 1))
        Else
            If dd.exists(tablo(i, 2)) Then tablo(i, 1) = dd(tablo(i, 2))
        End If
    Next i
    Target = tablo 'restitution
Next Target
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Not IsDate(Sh.Name) Then Exit Sub
Set CB(0).CB = Sh.OLEObjects("ComboBox1").Object 'initialise la classe
With CB(0).CB
    .Visible = False
    If Intersect(ActiveCell, Sh.Range("G2:G" & Sh.Rows.Count)) Is Nothing Then Exit Sub
    .Left = ActiveCell.Left
    .Top = ActiveCell.Top
    .Width = ActiveCell.Width
    .Height = 16
    .Visible = True
    .Activate
    .Text = Chr(1)
    .Text = "" 'crée la liste
End With
End Sub
Le code dans le module de classe :
VB:
Public WithEvents CB As MSForms.ComboBox

Private Sub CB_Change()
Dim txt$, tablo, i&, liste(), n&
txt = "*" & LCase(CB) & "*"
tablo = Sheets("Liste Clients").[A1].CurrentRegion.Resize(, 2)
For i = 1 To UBound(tablo)
    If LCase(tablo(i, 2)) Like txt Then
        ReDim Preserve liste(n)
        liste(n) = tablo(i, 2)
        n = n + 1
    End If
Next i
If n Then CB.List = liste Else CB.List = Array("")
CB.DropDown
End Sub

Private Sub CB_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = True
ActiveCell = CB.Text
ActiveCell(1, 0).Select
End Sub
Il permet une recherche intuitive avec la ComboBox, le mode d'emploi est indiqué.

Nota : j'ai supprimé une colonne inutile dans la feuille "Liste Clients".

A+
 

Pièces jointes

  • Tableau clients(1).xlsm
    670.3 KB · Affichages: 16

Etoto

XLDnaute Barbatruc
Bonjour Laurie21700, le fil,

Une solution VBA dans le fichier joint.

Elle nécessite d'avoir une ComboBox dans chaque feuille de mois.

Le code dans ThisWorkbook :
VB:
Dim CB(0) As New Classe1 'mémorise le tableau

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not IsDate(Sh.Name) Then Exit Sub
Set Target = Intersect(Target.EntireRow, Sh.Range("F2:G" & Sh.Rows.Count), Sh.UsedRange.EntireRow)
If Target Is Nothing Then Exit Sub
Dim d As Object, dd As Object, tablo, i&, col%
'---listes des paniers et des clients---
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
dd.CompareMode = vbTextCompare 'la casse est ignorée
tablo = Sheets("Liste Clients").[A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    d(tablo(i, 1)) = tablo(i, 2)
    dd(tablo(i, 2)) = tablo(i, 1)
Next i
'---recherches des paniers et des clients---
Application.EnableEvents = False 'désactive les évènements
For Each Target In Target.Areas 'si entrées multiples (copier-coller)
    tablo = Target 'matrice, plus rapide
    col = ActiveCell.Column
    For i = 1 To UBound(tablo)
        If col = 6 Then
            If d.exists(tablo(i, 1)) Then tablo(i, 2) = d(tablo(i, 1))
        Else
            If dd.exists(tablo(i, 2)) Then tablo(i, 1) = dd(tablo(i, 2))
        End If
    Next i
    Target = tablo 'restitution
Next Target
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Not IsDate(Sh.Name) Then Exit Sub
Set CB(0).CB = Sh.OLEObjects("ComboBox1").Object 'initialise la classe
With CB(0).CB
    .Visible = False
    If Intersect(ActiveCell, Sh.Range("G2:G" & Sh.Rows.Count)) Is Nothing Then Exit Sub
    .Left = ActiveCell.Left
    .Top = ActiveCell.Top
    .Width = ActiveCell.Width
    .Height = 16
    .Visible = True
    .Activate
    .Text = Chr(1)
    .Text = "" 'crée la liste
End With
End Sub
Le code dans le module de classe :
VB:
Public WithEvents CB As MSForms.ComboBox

Private Sub CB_Change()
Dim txt$, tablo, i&, liste(), n&
txt = "*" & LCase(CB) & "*"
tablo = Sheets("Liste Clients").[A1].CurrentRegion.Resize(, 2)
For i = 1 To UBound(tablo)
    If LCase(tablo(i, 2)) Like txt Then
        ReDim Preserve liste(n)
        liste(n) = tablo(i, 2)
        n = n + 1
    End If
Next i
If n Then CB.List = liste Else CB.List = Array("")
CB.DropDown
End Sub

Private Sub CB_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = True
ActiveCell = CB.Text
ActiveCell(1, 0).Select
End Sub
Il permet une recherche intuitive avec la ComboBox, le mode d'emploi est indiqué.

Nota : j'ai supprimé une colonne inutile dans la feuille "Liste Clients".

A+
Trop bien ton code, merci ! 😁
 

Etoto

XLDnaute Barbatruc
Bonjour Laurie21700, le fil,

Une solution VBA dans le fichier joint.

Elle nécessite d'avoir une ComboBox dans chaque feuille de mois.

Le code dans ThisWorkbook :
VB:
Dim CB(0) As New Classe1 'mémorise le tableau

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not IsDate(Sh.Name) Then Exit Sub
Set Target = Intersect(Target.EntireRow, Sh.Range("F2:G" & Sh.Rows.Count), Sh.UsedRange.EntireRow)
If Target Is Nothing Then Exit Sub
Dim d As Object, dd As Object, tablo, i&, col%
'---listes des paniers et des clients---
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
dd.CompareMode = vbTextCompare 'la casse est ignorée
tablo = Sheets("Liste Clients").[A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    d(tablo(i, 1)) = tablo(i, 2)
    dd(tablo(i, 2)) = tablo(i, 1)
Next i
'---recherches des paniers et des clients---
Application.EnableEvents = False 'désactive les évènements
For Each Target In Target.Areas 'si entrées multiples (copier-coller)
    tablo = Target 'matrice, plus rapide
    col = ActiveCell.Column
    For i = 1 To UBound(tablo)
        If col = 6 Then
            If d.exists(tablo(i, 1)) Then tablo(i, 2) = d(tablo(i, 1))
        Else
            If dd.exists(tablo(i, 2)) Then tablo(i, 1) = dd(tablo(i, 2))
        End If
    Next i
    Target = tablo 'restitution
Next Target
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Not IsDate(Sh.Name) Then Exit Sub
Set CB(0).CB = Sh.OLEObjects("ComboBox1").Object 'initialise la classe
With CB(0).CB
    .Visible = False
    If Intersect(ActiveCell, Sh.Range("G2:G" & Sh.Rows.Count)) Is Nothing Then Exit Sub
    .Left = ActiveCell.Left
    .Top = ActiveCell.Top
    .Width = ActiveCell.Width
    .Height = 16
    .Visible = True
    .Activate
    .Text = Chr(1)
    .Text = "" 'crée la liste
End With
End Sub
Le code dans le module de classe :
VB:
Public WithEvents CB As MSForms.ComboBox

Private Sub CB_Change()
Dim txt$, tablo, i&, liste(), n&
txt = "*" & LCase(CB) & "*"
tablo = Sheets("Liste Clients").[A1].CurrentRegion.Resize(, 2)
For i = 1 To UBound(tablo)
    If LCase(tablo(i, 2)) Like txt Then
        ReDim Preserve liste(n)
        liste(n) = tablo(i, 2)
        n = n + 1
    End If
Next i
If n Then CB.List = liste Else CB.List = Array("")
CB.DropDown
End Sub

Private Sub CB_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = True
ActiveCell = CB.Text
ActiveCell(1, 0).Select
End Sub
Il permet une recherche intuitive avec la ComboBox, le mode d'emploi est indiqué.

Nota : j'ai supprimé une colonne inutile dans la feuille "Liste Clients".

A+
Juste une question, ta liste fonctionne vraiment bien mais je n'arrive pas à faire que si on sélectionne le nom, il soit validé. Comment on valide un nom avec ta méthode ? (Je parie que je me suis loupé avec un truc tout c**).
 

Marie-C

XLDnaute Nouveau
Bonjour à tous,
j'ai suivi avec intérêt les réponses à la question de Laurie21770 mais je vois que cela ne fonctionne que pur les 1ères lettres du mot recherché. J'ai un fichier de produits en liste déroule et pour gagner du temps, je voudrais juste taper un mot qui se trouve sur cette liste mais pas forcément au début.
Je ne sais pas si je me fais bien comprendre.
Merci pour votre aide
 

Discussions similaires

Statistiques des forums

Discussions
315 095
Messages
2 116 169
Membres
112 676
dernier inscrit
little_b