web-dev-qa-db-fra.com

Excel 2010: comment utiliser la saisie semi-automatique dans la liste de validation

J'utilise une grande liste de validation sur laquelle dépendent deux fonctions vlookup (). Cette liste devient de plus en plus grande. Existe-t-il un moyen de taper les premières lettres de l'élément de la liste que je recherche plutôt que de faire défiler manuellement la liste pour rechercher l'élément?

J'ai fait quelques recherches sur Google, mais cela suggère que c'est effectivement possible dans les versions antérieures d'Excel, mais pas dans Excel 2010. J'espère que vous pourrez aider.

19
Pieter

Voici un très bon moyen de gérer ceci (trouvé sur ozgrid ):

Supposons que votre liste est sur Sheet2 et que vous souhaitez utiliser la liste de validation avec la saisie semi-automatique sur Sheet1.

On Sheet1A1 Entrez =Sheet2!A1 et copiez-le en ajoutant autant de lignes de réserve que nécessaire (soit un total de 300 lignes). Cachez ces lignes et utilisez cette formule dans le champ Se réfère à: pour une plage nommée dynamique appelée MyList:

=OFFSET(Sheet1!$A$1,0,0,MATCH("*",Sheet1!$A$1:$A$300,-1),1)

Maintenant, dans la cellule juste en dessous de la dernière ligne cachée, utilisez la validation de données et pour la source la liste, utilisez =MyList

[EDIT] Version adaptée pour Excel 2007+ (n'a pas pu être testée en 2010 mais, autant que je sache, rien n'est vraiment spécifique à une version).
Supposons que votre source de données se trouve sur Sheet2!A1:A300 et supposons que votre liste de validation (aka autocomplete ) se trouve sur la cellule Sheet1!A1.

  1. Créez une plage dynamique nommée MyList qui dépend de la valeur de la cellule dans laquelle vous avez placé la validation

    =OFFSET(Sheet2!$A$1,MATCH(Sheet1!$A$1&"*",Sheet2!$A$1:$A$300,0)-1,0,COUNTA(Sheet2!$A:$A))

  2. Ajoutez la liste de validation sur la cellule Sheet1!A1 qui fera référence à la liste =MyList

Mises en garde

  1. Ce n'est pas un autocomplet réel , car vous devez d'abord taper puis cliquer sur la flèche de validation: la liste va alors commencer au premier élément correspondant de votre liste

  2. La liste ira jusqu'à la fin de vos données. Si vous voulez être plus précis (ne garder dans la liste que les éléments correspondants ), vous pouvez changer le COUNTA avec un SUMLPRODUCT qui calculera le nombre d'éléments correspondants

  3. Votre liste de sources doit être triée

11
JMax

Excel le fait automatiquement chaque fois que vous avez une colonne d’éléments verticale. Si vous sélectionnez la cellule vide en dessous (ou au-dessus) de la colonne et commencez à taper, la saisie semi-automatique est effectuée en fonction de tout le contenu de la colonne.

1
Joel Spolsky

En vous basant sur la réponse de JMax , utilisez cette formule pour la plage nommée dynamique pour que la solution fonctionne pour plusieurs lignes:

=OFFSET(Sheet2!$A$1,MATCH(INDIRECT("Sheet1!"&ADDRESS(ROW(),COLUMN(),4))&"*",Sheet2!$A$1:$A$300,0)-1,0,COUNTA(Sheet2!$A:$A))
1
gwapongkabayo
=OFFSET(NameList!$A$2:$A$200,MATCH(INDIRECT("FillData!"&ADDRESS(ROW(),COLUMN(),4))&"*",NameList!$A$2:$A$200,0)-1,0,COUNTIF($A$2:$A$200,INDIRECT("FillData!"&ADDRESS(ROW(),COLUMN(),4))&"*"),1)
  1. Créez le nom de la feuille en tant que Namelist. En colonne Une liste de remplissage des données.

  2. Créez un autre nom de feuille en tant que FillData pour créer la liste de validation des données à votre guise.

  3. Tapez le premier alphabet et sélectionnez, le menu déroulant apparaîtra selon votre saisie.

0
Anan Phungmit

Comme d'autres personnes l'ont suggéré, vous devez utiliser une liste déroulante. Cependant, la plupart des tutoriels vous montrent comment configurer une seule liste déroulante et que le processus est fastidieux. 

Comme j'ai déjà rencontré ce problème lors de la saisie d'une grande quantité de données dans une liste, je peux vous suggérer d'utiliser ce complément autocomplet . Il vous aide à créer la liste déroulante sur toutes les cellules sélectionnées et vous permet de définir une liste à afficher dans la liste déroulante.

0
Donna C

Voici une autre option. Cela fonctionne en plaçant une ComboBox ActiveX au-dessus de la cellule avec la validation activée, puis en fournissant la complétion automatique dans la ComboBox.

Option Explicit

' Autocomplete - replacing validation lists with ActiveX ComboBox
'
' Usage:
'   1. Copy this code into a module named m_autocomplete
'   2. Go to Tools / References and make sure "Microsoft Forms 2.0 Object Library" is checked
'   3. Copy and paste the following code to the worksheet where you want autocomplete
'      ------------------------------------------------------------------------------------------------------
'      - autocomplete
'      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'          m_autocomplete.SelectionChangeHandler Target
'      End Sub
'      Private Sub AutoComplete_Combo_KeyDown(ByVal KeyCode As msforms.ReturnInteger, ByVal Shift As Integer)
'          m_autocomplete.KeyDownHandler KeyCode, Shift
'      End Sub
'      Private Sub AutoComplete_Combo_Click()
'          m_autocomplete.AutoComplete_Combo_Click
'      End Sub
'      ------------------------------------------------------------------------------------------------------

' When the combobox is clicked, it should dropdown (expand)
Public Sub AutoComplete_Combo_Click()
    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim cbo As OLEObject: Set cbo = GetComboBoxObject(ws)
    Dim cb As ComboBox: Set cb = cbo.Object
    If cbo.Visible Then cb.DropDown
End Sub

' Make it easier to navigate between cells
Public Sub KeyDownHandler(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Const UP As Integer = -1
    Const DOWN As Integer = 1

    Const K_TAB_______ As Integer = 9
    Const K_ENTER_____ As Integer = 13
    Const K_ARROW_UP__ As Integer = 38
    Const K_ARROW_DOWN As Integer = 40

    Dim direction As Integer: direction = 0

    If Shift = 0 And KeyCode = K_TAB_______ Then direction = DOWN
    If Shift = 0 And KeyCode = K_ENTER_____ Then direction = DOWN
    If Shift = 1 And KeyCode = K_TAB_______ Then direction = UP
    If Shift = 1 And KeyCode = K_ENTER_____ Then direction = UP
    If Shift = 1 And KeyCode = K_ARROW_UP__ Then direction = UP
    If Shift = 1 And KeyCode = K_ARROW_DOWN Then direction = DOWN

    If direction <> 0 Then ActiveCell.Offset(direction, 0).Activate

    AutoComplete_Combo_Click
End Sub

Public Sub SelectionChangeHandler(ByVal Target As Range)
    On Error GoTo errHandler

    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim cbo As OLEObject: Set cbo = GetComboBoxObject(ws)
    Dim cb As ComboBox: Set cb = cbo.Object

    ' Try to hide the ComboBox. This might be buggy...
    If cbo.Visible Then
        cbo.Left = 10
        cbo.Top = 10
        cbo.ListFillRange = ""
        cbo.LinkedCell = ""
        cbo.Visible = False
        Application.ScreenUpdating = True
        ActiveSheet.Calculate
        ActiveWindow.SmallScroll
        Application.WindowState = Application.WindowState
        DoEvents
    End If

    If Not HasValidationList(Target) Then GoTo ex

    Application.EnableEvents = False

    ' TODO: the code below is a little fragile
    Dim lfr As String
    lfr = Mid(Target.Validation.Formula1, 2)
    lfr = Replace(lfr, "INDIREKTE", "") ' norwegian
    lfr = Replace(lfr, "INDIRECT", "") ' english
    lfr = Replace(lfr, """", "")
    lfr = Application.Range(lfr).Address(External:=True)

    cbo.ListFillRange = lfr
    cbo.Visible = True
    cbo.Left = Target.Left
    cbo.Top = Target.Top
    cbo.Height = Target.Height + 5
    cbo.Width = Target.Width + 15
    cbo.LinkedCell = Target.Address(External:=True)
    cbo.Activate
    cb.SelStart = 0
    cb.SelLength = cb.TextLength
    cb.DropDown

    GoTo ex

errHandler:
    Debug.Print "Error"
    Debug.Print Err.Number
    Debug.Print Err.Description
ex:
    Application.EnableEvents = True
End Sub

' Does the cell have a validation list?
Function HasValidationList(Cell As Range) As Boolean
    HasValidationList = False
    On Error GoTo ex
    If Cell.Validation.Type = xlValidateList Then HasValidationList = True
ex:
End Function

' Retrieve or create the ComboBox
Function GetComboBoxObject(ws As Worksheet) As OLEObject
    Dim cbo As OLEObject
    On Error Resume Next
    Set cbo = ws.OLEObjects("AutoComplete_Combo")
    On Error GoTo 0
    If cbo Is Nothing Then
        'Dim EnableSelection As Integer: EnableSelection = ws.EnableSelection
        Dim ProtectContents As Boolean: ProtectContents = ws.ProtectContents

        Debug.Print "Lager AutoComplete_Combo"
        If ProtectContents Then ws.Unprotect
        Set cbo = ws.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, _
                            Left:=50, Top:=18.75, Width:=129, Height:=18.75)
        cbo.name = "AutoComplete_Combo"
        cbo.Object.MatchRequired = True
        cbo.Object.ListRows = 12
        If ProtectContents Then ws.Protect
    End If
    Set GetComboBoxObject = cbo
End Function
0
tomashm