首页 > 解决方案 > ComboBox.MatchEntry 属性如何具有 `fmMatchEntryComplete` 值但能够覆盖自动完成功能?

问题描述

我的问题是我有一个列表框被植入到组合框中,ComboBox.List = MyArr作为框中的列表数据。我希望它的工作方式与您在其他应用程序中看到的大多数用户表单类似,在组合框中键入将显示与用户输入相关的最佳匹配,但是当您按下键盘上的退格键时会删除自动完成功能。

当我尝试仅输入文本的缩短版本时会出现问题。例如,当预定义列表包含单词:“SUNNIES”,但我想输入“SUN”时。无论我做什么,组合框都会自动完成“SUNNIES”。但我也不想删除自动完成功能。

以下是我的表格示例: 在此处输入图像描述

标签: excelvba

解决方案


我认为有一种解决方法可以使用该_KeyDown事件实现您想要的行为。

您可以ComboBox1使用以下方法更改您的行为:

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Me.ComboBox1.SelLength > 0 And KeyCode = 8 Then
        KeyCode = 46
    End If
End Sub

它会查看是否有选定的文本,如果按下退格键,KeyCode = 8则将其更改为 delete KeyCode = 46。如果没有选择任何内容,它将像往常一样退格。


如果您想将此应用到您的用户窗体中的所有组合框......</h3>

... 执行以下操作而不是上述_KeyDown事件。

  1. 添加一个类模块并CmbClass使用以下代码命名它:

    Option Explicit
    
    Public WithEvents ComboBoxGroup As MSForms.ComboBox
    
    Private Sub ComboBoxGroup_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If ComboBoxGroup.SelLength > 0 And KeyCode = 8 Then
            KeyCode = 46
        End If
    End Sub
    
  2. 将以下代码添加到要应用该行为的每个用户窗体:

    Option Explicit
    
    Dim ComboBoxes() As New cmbClass
    
    Private Sub UserForm_Initialize()
        Dim ComboBoxCount As Integer
        Dim ctl As Control
        ComboBoxCount = 0
        For Each ctl In Me.Controls
            If TypeName(ctl) = "ComboBox" Then
                ComboBoxCount = ComboBoxCount + 1
                ReDim Preserve ComboBoxes(1 To ComboBoxCount)
                Set ComboBoxes(ComboBoxCount).ComboBoxGroup = ctl
            End If
        Next ctl
    End Sub
    


推荐阅读