我想在用户单击的单元格上创建一个组合框,并允许用户编写和/或选择(类似于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
问题在于创建的组合框仅允许用户选择,而不能写入
答案 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
时,用户输入将限于下拉列表中的内容。
...这样说,Data Validation可能是一个更好的选择(较不易出错,与工作表/ Excel更好地集成,没有MSForm
依赖性),如果您可以忍受“圆圈”无效数据”在允许输入但不在下拉列表中的“无效数据”周围划上红色圆圈: