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.
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 Sheet1
A1
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
.
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))
Ajoutez la liste de validation sur la cellule Sheet1!A1
qui fera référence à la liste =MyList
Mises en garde
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
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
Votre liste de sources doit être triée
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.
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))
=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)
Créez le nom de la feuille en tant que Namelist
. En colonne Une liste de remplissage des données.
Créez un autre nom de feuille en tant que FillData
pour créer la liste de validation des données à votre guise.
Tapez le premier alphabet et sélectionnez, le menu déroulant apparaîtra selon votre saisie.
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.
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