VBA开发:巧妙实现组合框ComboBox的智能联想输入

本文介绍了如何在VBA开发中为组合框ComboBox实现智能输入功能,通过添加数据、Change事件的Like语句和SelStart/SelLength属性以及KeyDown事件的自定义处理,提升用户查询效率。
摘要由CSDN通过智能技术生成

目录

 

写在前面

1.创建控件

2.为组合框添加数据

3.实现智能输入

4.智能联想输入错误时的处理


写在前面

        组合框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事件中编程。这样用户只要在组合框的任意输入文本就能触发该事件。实现智能输入的逻辑如下:

  1. 输入文本小于触发联想字数时,不触发智能联想功能。触发联想字数是可以根据列表数据的具体情况改变的,主要是避免产生过多的错误联想。示例里面设定为3。
  2. 当输入文本达到我们上一条设定的触发联想字数时,使用 Like语句来比较输入的文本与列表文本,如果有相似的,则将最后一条类似的显示在ComboBox框中。
  3. 根据输入文本在相似文本中的位置,重新确定SelStart和SelLength属性,以便用户进一步输入文本缩小智能联想范围。
  4. 循环执行,直到智能联想的结果符合用户的要求。
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZevieZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值