いくつかのvlookup()関数が依存する大きな検証リストを使用しています。このリストはどんどん大きくなっています。アイテムを検索するリストを手動でスクロールする代わりに、探しているリストアイテムの最初の文字を入力する方法はありますか?
私はいくつかのグーグルを行いましたが、これはこれがExcelの以前のバージョンでは実際に可能であることを示唆していますが、Excel 2010ではそうではありません。
これを処理する非常に良い方法があります( ozgrid にあります):
リストが_Sheet2
_にあり、_Sheet1
_のオートコンプリートで検証リストを使用するとします。
_Sheet1
_で_A1
_ _=Sheet2!A1
_と入力し、必要な数のスペア行(合計300行など)を含めてコピーします。これらの行を非表示にして、参照先で次の式を使用します。MyListという動的な名前付き範囲の場合:
_=OFFSET(Sheet1!$A$1,0,0,MATCH("*",Sheet1!$A$1:$A$300,-1),1)
_
これで、最後の非表示行のすぐ下のセルでデータ検証を使用し、リストソースには_=MyList
_を使用します
[編集]Excel 2007+用に修正されたバージョン(ただし2010年にはテストできませんでしたが、バージョンに固有のことは何もありません)。
データソースが_Sheet2!A1:A300
_にあり、検証リスト(別名autocomplete)がセル_Sheet1!A1
_にあると仮定しましょう。
検証を配置したセルの値に依存する動的な名前付き範囲MyList
を作成します
=OFFSET(Sheet2!$A$1,MATCH(Sheet1!$A$1&"*",Sheet2!$A$1:$A$300,0)-1,0,COUNTA(Sheet2!$A:$A))
リスト_Sheet1!A1
_を参照するセル_=MyList
_に検証リストを追加します
注意事項
最初に入力してから検証矢印をクリックする必要があるため、これはrealオートコンプリートではありません:リストはbeginリストの最初に一致する要素で
リストはデータの最後まで続きます。より正確にしたい場合(リストにmatching要素のみを保持する)、COUNTA
をSUMLPRODUCT
で変更して、一致する要素の数を計算する
ソースリストを並べ替える必要があります
Excelは、アイテムの垂直列がある場合に自動的にこれを行います。列の下(または上)にある空白のセルを選択して入力を開始すると、列のすべてに基づいて自動補完されます。
JMax の答えに基づいて、動的な名前付き範囲に次の式を使用して、ソリューションが複数の行で機能するようにします。
=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)
シート名をNamelist
として作成します。列Aにデータのリストを記入します。
必要に応じてデータ検証リストを作成するために、FillData
として別のシート名を作成します。
最初のアルファベットを入力して選択すると、入力内容に応じてドロップダウンメニューが表示されます。
他の人が示唆したように、コンボボックスを使用する必要があります。ただし、ほとんどのチュートリアルでは、コンボボックスを1つだけセットアップする方法を示していますが、このプロセスは非常に面倒です。
以前にリストから大量のデータを入力するときにこの問題に直面したため、 this autocomplete add-in を使用することをお勧めします。選択したセルにコンボボックスを作成するのに役立ち、ドロップダウンに表示するリストを定義できます。
別のオプションがあります。検証を有効にしてセルの上にActiveX ComboBoxを配置し、代わりに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