标签:
AI-Excel
,
deepseek
,
VBA
我想在单元格或文本框中输入数据的时候,能够根据正在输入的数据动态显示可能匹配的数据,就像我们在使用百度搜索时,在搜索框中随着输入而在下方动态显示的条目。
按照我的需求,向
deepseek
提问:
我想在
Excel
中制作一个仿百度的搜索框,当用户在单元格或文本框中输入时会自动显示可能匹配的条目。换句话说,我想查找某列中的数据,在单元格或文本框中输入查找内容时,会随着输入自动动态调整可能匹配的条目。要求:
1.
可以使用工作表单元格实现,在这个单元格中输入要查找的内容;
2.
可以创建一个用户窗体,插入一个文本框,在这个文本框中输入要查找的内容。
deepseek
给出了我需要的两种方法。
方法一:使用工作表单元格实现动态搜索框
deepseek
给出的设置数据验证有误,如下图
1
所示。
图
1
此处,应该是:
=DynamicList
具体实现过程如下:
在列
A
中输入示例数据,按
Ctrl+F3
调出“定义名称”对话框,定义动态名称如下图
2
所示。
图
2
假设输入单元格是
B2
,设置其数据验证如下图
3
所示。
图
3
按
Alt+F11
打开
VBE
,双击示例工作表代码模块名称
Sheet1
,打开其代码窗口,输入代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$2" Then
Application.EnableEvents = False ' 防止循环触发事件
Dim SearchTerm As String
SearchTerm = LCase(Target.Value)
Dim DataRange As Range
Set DataRange = Sheet1.Range("A2:A100")
DataRange.Parent.Range("C2:C100").ClearContents
' 清空辅助列
Dim FilteredData As Collection
Set FilteredData = New Collection
Dim Cell As Range
For Each Cell In DataRange
If Len(Cell.Value) > 0 And InStr(1, LCase(Cell.Value), SearchTerm) > 0
Then
FilteredData.Add Cell.Value
End If
Next Cell
If FilteredData.Count > 0 Then
Sheet1.Range("C2").Resize(FilteredData.Count).Value = Application.Transpose(CollectionToArray(FilteredData))
Me.Names.Add Name:="DynamicList", RefersTo:=Sheet1.Range("C2:C" & FilteredData.Count + 1)
Else
Me.Names.Add Name:="DynamicList", RefersTo:=Sheet1.Range("C2") '引用非空单元格
Sheet1.Range("C2").Value = "无匹配项" ' 添加占位文本
End If
Application.EnableEvents = True
End If
End Sub
' 辅助函数:将集合转为数组
Function CollectionToArray(c As Collection) As Variant()
Dim arr() As Variant
ReDim arr(0 To c.Count - 1)
Dim i As Long
For i = 0 To c.Count - 1
arr(i) = c(i + 1)
Next
CollectionToArray = arr
End Function
回到工作表,在单元格
B2
中输入数据时,效果如下图
4
所示。
图
4
方法二:使用用户窗体实现动态搜索框
按
Alt+F11
打开
VBE
,插入一个用户窗体,在该窗体上放置一个文本框和一个列表框,如下图
5
所示。
图
5
在该用户窗体代码模块中,输入代码:
Private Sub TextBox1_Change()
ListBox1.Clear
Dim SearchTerm As String
SearchTerm = LCase(TextBox1.Text)
Dim DataRange As Range
Set DataRange = Sheet1.Range("A2:A100")
Dim Cell As Range
For Each Cell In DataRange
If InStr(1, LCase(Cell.Value), SearchTerm) > 0 Then
ListBox1.AddItem Cell.Value
End If
Next Cell
' 自动调整列表框大小
If ListBox1.ListCount > 0 Then
ListBox1.Visible = True
ListBox1.Height = Application.Min(120, ListBox1.ListCount * 15)
Else
ListBox1.Visible = False
End If
End Sub
Private Sub ListBox1_Click()
TextBox1.Text = ListBox1.Value
ListBox1.Visible = False
End Sub
Private Sub UserForm_Initialize()
TextBox1.SetFocus
ListBox1.Visible = False
End Sub
运行该用户窗体后的效果如下图
6
所示。
图
6
欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
欢迎到知识星球:
完美
Excel
社群
,进行技术交流和提问,获取更
多电子资料,并通过社群加入专门的微信讨论群,更方便交流。