Page 1 sur 1

Liste déroulante avec saisie semi automatique

Posté : 19 juin 2017, 10:59
par david79230
Bonjour à tous,

je suis bloqué par un problème qui est expliqué dans le titre.

Dans le fichier joint, je souhaiterais que sur la feuille test je puisse avoir une saisie semi auto sur Nom/Prénom.

Actuellement, j'ai sur une liste déroulante simple mais ce serait plus rapide de pouvoir taper quelques caractères.

je viens de chercher sur plusieurs forums et à chaque fois que j'essaye d'incorporer la fonction DECALER ca ne fonctionne pas.

Merci de votre aide

Re: Liste déroulante avec saisie semi automatique

Posté : 19 juin 2017, 12:08
par MFerrand
Bonjour,

Solution macro que j'ai eu l'occasion de réaliser il y a peu de temps...
Option Compare Text

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim tx$, i%, j%
    If Target.Address = "$F$3" Then
        ThisWorkbook.Names.Add "ListA", "=Liste"
        If Target.Value <> "" Then
            tx = Target & "*"
            With [Liste]
                For i = 1 To .Rows.Count
                    If .Cells(i, 1) Like tx Then Exit For
                Next i
                If i <= .Rows.Count Then
                    Do While .Cells(i + j, 1) Like tx
                        j = j + 1
                    Loop
                    ThisWorkbook.Names.Add "ListA", "=OFFSET(Liste," & i - 1 & ",," & j & ")"
                    Application.EnableEvents = False
                    If j = 1 Then Target = .Cells(i, 1)
                    Application.EnableEvents = True
                    Exit Sub
                End If
            End With
        End If
    End If
End Sub
La macro est très proche de la solution formule. Dans les 2 cas tu nommes la liste de base (ici nommée Liste), de préférence en dynamique si elle peut varier. La liste doit être triée par ordre alpha. Tu décoches dans la validation la case Quand des données non valides sont tapées. Dans la version macro, tu crées un 2e nom (ici ListA) que tu définis au départ =Liste. Et en validation tu mets =ListA. La macro définit les éléments de Liste correspondant à ta frappe initiale et redéfinit ListA avec une formule DECALER...
En formule, c'est la même formule DECALER que tu tapes comme validation. C'est donc quasi identique...
Petit avantage pour la macro : si un seul item correspond à ta frappe initiale, elle l'affecte avant que tu aies besoin de le sélectionner dans la liste résiduelle (ce que la formule ne peut faire !)

Par contre il conviendrait de normaliser ta liste sous la forme : NOM Prénom. Elle comporte des anomalies à cet égard.

Possibilités supplémentaires qui peuvent s'ajouter : Tri de la liste en cas d'ajout ou modification (déclenchement manuel ou automatique). [autre petite macro à faire]
Décochage des cases à cocher lors de changement en F3 : ça c'est à ajouter dans la macro.

Cordialement.

Re: Liste déroulante avec saisie semi automatique

Posté : 19 juin 2017, 20:15
par ceuzin
Bonsoir,

Vraie saisie intuitive type Google.
Private Sub ComboBox1_Change()
 If Me.ComboBox1 <> "" Then
  Set d1 = CreateObject("Scripting.Dictionary")
  clé = UCase(Me.ComboBox1) & "*"
  For Each c In Sheets("liste employé").[Liste]
    If UCase(c) Like clé Then d1(c.Value) = ""
  Next c
  Me.ComboBox1.List = d1.keys
  Me.ComboBox1.DropDown
  [F3] = Me.ComboBox1
 End If
End Sub

Private Sub ComboBox1_DropButtonClick()
  ComboBox1.List = Sheets("liste employé").Range("liste").Value
End Sub
Pour une recherche par le prénom : clé = "*" & UCase(Me.ComboBox1) & "*"

Ceuzin

Re: Liste déroulante avec saisie semi automatique

Posté : 20 juin 2017, 11:22
par david79230
Bonjour,

ca marche nickel merci a vous deux.

Je vais essayer la saisie intuitive google pour un autre fichier

Merci encore

Re: Liste déroulante avec saisie semi automatique

Posté : 20 juin 2017, 11:46
par david79230
Donc je viens d'essayer la saisie intuitive et c'est ce qu'il me fallait.

C'est parfait sauf que je n'arrive pas à récupérer la valeur de la combobox .
Je souhaiterais que la valeur soit retournée dans une variable en string.

Comment faire?
:D