目录
写在前面
组合框ComboBox是在VBA开发中广泛应用的一个控件,通常我们用组合框来供用户选择一个关键词,然后以该关键词来查询其他相关数据。然而,当数据量比较庞大时,用户选择关键词就比较麻烦,需要在列表项中上下来回搜寻,花费较多时间。这时候,大家可能会想起联想输入法或者智能拼音输入法,只要输入一个字,就能将与这个字相关的词语都显示出来,随着我们输入的字越来越多,最终就能智能联想到需要的词组。那么,在组合框的编程中,我们能不能实现类似的智能联想功能,让用户在组合框里面输入几个字符就智能填充其他的字符,实现快速定位到用户需要的选项呢?答案当然是肯定的。
按照本栏的惯例,我们直接用例程来演示。
我们假设有一个学号查询系统,有1000名学生的信息,要求在组合框中选择学号,然后就能查询到学生的其他信息。示例中主要用到的知识点如下:
1)用AddItem方法为ComboBox添加数据
2)在ComboBox的change事件中编程,运用Like语句,selStart和SelLength属性,实现智能联想输入。
3)在ComboBox的Key Down事件中编程,自定义BackSpace按键。
1.创建控件
我们首先创建两个ActiveX按钮“学号更新”,”信息查询”,一个ComboBox组合框。如图一所示
2.为组合框添加数据
在ComboBox中填充学号信息,需要使用ComboBox的AddItem方法。实际开发应用时,我们一般时先打开学号存储的文件,读入到内存数组中,然后再写入到ComboBox控件。这里我们为了简化,就直接通过一个For循环写入学号。
Private Sub CommandButton1_Click()
For i = 1 To 1000
ComboBox1.AddItem CStr(1020000 + i)
Next
End Sub
3.实现智能输入
我们在ComboBox的Change事件中编程。这样用户只要在组合框的任意输入文本就能触发该事件。实现智能输入的逻辑如下:
- 输入文本小于触发联想字数时,不触发智能联想功能。触发联想字数是可以根据列表数据的具体情况改变的,主要是避免产生过多的错误联想。示例里面设定为3。
- 当输入文本达到我们上一条设定的触发联想字数时,使用 Like语句来比较输入的文本与列表文本,如果有相似的,则将最后一条类似的显示在ComboBox框中。
- 根据输入文本在相似文本中的位置,重新确定SelStart和SelLength属性,以便用户进一步输入文本缩小智能联想范围。
- 循环执行,直到智能联想的结果符合用户的要求。
Private Sub ComboBox1_Change()
Dim V As String
V = Left(UCase(ComboBox1.text), ComboBox1.SelStart)
If Len(V) < 3 Then
ComboBox1.text = V
Exit Sub
End If
For i = ComboBox1.ListCount - 1 To 0 Step -1 '倒序以便选择最新的,更符合使用的需求
If UCase(ComboBox1.List(i)) Like "*" & V & "*" Then
ComboBox1.text = ComboBox1.List(i)
myselected = 1
If StrComp(V, Left(ComboBox1.text, Len(V)), 1) = 0 Then '如果是从头开始的输入
ComboBox1.SelStart = Len(V) '选择框开始定位项
ComboBox1.SelLength = Len(ComboBox1.text) - Len(V) '选择项长度
Else
ComboBox1.SelStart = InStr(UCase(ComboBox1.text), V) - 1
ComboBox1.SelLength = 3
If ComboBox1.SelStart > 3 Then '如果匹配字符不是从第4个开始的字符
myselected = 0
End If
End If
If myselected = 1 Then
Exit For
End If
End If
Next
End Sub
4.智能联想输入错误时的处理
特殊情况下,可能会出现智能联想错误的情形,此时需要用backspace键删除,如果不对删除按键进行编程的话,会导致需要多次删除的情形。此时可以在ComboBox的KeyDown事件中进行编程,当BackSpace键按下时,直接退回到SelStart处。具体的退回位置,可以根据ComboBox列表项的数据格式调整。
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 8 Then 'backspace键按下
ComboBox1.SelStart = ComboBox1.SelStart
End If
End Sub