![Excel カスタム オートコンプリート](https://rvso.com/image/1415055/Excel%20%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%20%E3%82%AA%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%97%E3%83%AA%E3%83%BC%E3%83%88.png)
Excel ファイルのシートに長いリストがあります:
Number Value
123 Text 123
127 Another text
131 Yet another text
... ...
別のシートで、これらの数字を入力する必要があります。しかし、どの数字がどのテキストに属しているかを思い出せないので、どの値がどの数字に属しているかを示す何らかのオートコンプリート機能が欲しいです。たとえば、 と入力すると12
、次の内容を示すツールヒントが表示されます。
123 - Text 123
127 - Another text
123
とは両方とも127
で始まるからです12
。
そのようなことは可能ですか? 組み込み機能で可能か、アドインまたは VBA スクリプトを作成することで可能かは関係ありません。
答え1
結果
これは、VBA (VBScript ではありません!) で実行できることです。セルの値が変更されるたびに、コメントが自動的に作成されます。
コード
ソース範囲
コードを機能させるには、名前付き範囲 Source
ソースデータ用。
標準コードモジュール
これを実現するために必要な 2 つの関数については、Visual Basic エディター ( Alt+ F11) で標準コード モジュールを作成する必要があります。 への参照Microsoft Scripting Runtime
も設定する必要があります。
次のコードを標準コード モジュールに貼り付けます。
Option Explicit
Function GetMatches(strInput As String) As String
Dim dict As Scripting.Dictionary
Dim key As Variant
Dim strOutput As String
strOutput = "Matches found:" & vbCrLf
Set dict = GenerateDictionary()
For Each key In dict.Keys
If key Like strInput & "*" Then strOutput = _
strOutput & vbCrLf & key & " - " & dict(key)
Next
GetMatches = strOutput
Set dict = Nothing
End Function
Private Function GenerateDictionary() As Scripting.Dictionary
Dim source As Range
Dim cell As Range
Dim dict As New Scripting.Dictionary
Dim number As Integer
Dim value As String
Set source = Range("Source").SpecialCells(xlCellTypeConstants)
For Each cell In source
If cell.Row < 2 Then GoTo PassRow
If cell.Column = 1 Then number = cell.value
If cell.Column = 2 Then value = cell.value
If number <> 0 And value <> "" And cell.Column = 2 Then _
dict.Add number, value
PassRow:
Next
Set GenerateDictionary = dict
Set dict = Nothing
End Function
このコードでは、数値が列 1 にあり、値が列 2 にあることを前提としています。また、最初の行はスキップされます。必要に応じて調整することができます。
ワークシートコード
次のコードをワークシートコードに貼り付けます
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim strInput As String
If Not Intersect(Target, Me.Range("D1")) Is Nothing Then
strInput = Target.value
Target.ClearComments
Target.AddComment (GetMatches(strInput))
Target.Comment.Shape.TextFrame.AutoSize = True
End If
End Sub
Me.Range
任意の単一セルに変更できます。
使用法
指定したセルに値を入力するだけで、一致するすべての値を含むコメントが自動的に追加されます。
懸念事項
このコードは、一致を検索するたびに辞書を作成します。小規模から中規模のSource
範囲では大きな問題にはなりません (10,000 までテストしましたが、それでも数ミリ秒で実行されました)。
一致が多数ある場合、コメントが画面からはみ出す傾向があります。これを解決する唯一の方法は、より具体的な値を入力することです。
を使用すると、範囲内の空白セルSource
は無視されますが、これは数式では機能しません。 に切り替えるか、値のあるセルのみを選択する別の方法を見つけるxlCellTypeConstants
必要があります。xlCellTypeFormulas