使用VBA创建可写组合框

时间:2019-05-28 15:20:00

标签: excel vba combobox

我想在用户单击的单元格上创建一个组合框,并允许用户编写和/或选择(类似于Google的自动完成功能),将其设置为该单元格并关闭组合框。

我有创建框的代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim lst
If Not Intersect([4:7], Target) Is Nothing And Target.Count = 1 Then
        Me.DropDowns.Delete
        With Worksheets("Listing")
            lst = "'" & .Name & "'!" & _
              .Range(.Range("a1"), _
              .Cells(.Rows.Count, 1).End(xlUp)).Address()
         End With
        With Me.Shapes.AddFormControl(xlDropDown, Left:=Target.Left, _
                                  Top:=Target.Top, Width:=60, Height:=15)
             .Name = "CB"
            .OnAction = "CB_Change"
            .ControlFormat.ListFillRange = lst

        End With
    End If
End Sub

问题在于创建的组合框仅允许用户选择,而不能写入

2 个答案:

答案 0 :(得分:2)

如果可能,请改用数据验证。这将基于单元格J3:J5

中的值创建一个可写的组合
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect([4:7], Target) Is Nothing And Target.Count = 1 Then
        With Target.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$J$3:$J$5"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = False
        End With

        ' This will expand the list
        Target.Select
        SendKeys "%{DOWN}"
    End If
End Sub

答案 1 :(得分:1)

ActiveX控件比表单控件更易于配置。 MSForm.ComboBox控件具有Style属性,当该属性设置为fmStyleDropDownCombo时,可使文本框区域可编辑;当样式为fmStyleDropDownList时,用户输入将限于下拉列表中的内容。

ComboBox1 properties

...这样说,Data Validation可能是一个更好的选择(较不易出错,与工作表/ Excel更好地集成,没有MSForm依赖性),如果您可以忍受“圆圈”无效数据”在允许输入但不在下拉列表中的“无效数据”周围划上红色圆圈:

DV red circle around invalid data