VBA动态列表框实例
图一<效果图>功能介绍,采用动态序列,输入姓名首字,按回车键,该首字对应的姓名序列就会出现在列表内,单击列表的值,数据输入单元格内。
学习是件痛并快乐的事儿。痛的是在过程中,反复去看去读也无法理解产生的焦虑与挫败感,快乐的是理解的那一刻,从内心升腾出的喜悦,过程有多难受,结果就有多喜悦。
上篇文我制定了月度内的三个计划,第一个是做一个实用的下拉菜单。excel自带的数据有效性序列,在一些情况下不是特别的实用,例如图二<列表数据>,人名过百,其实也没什么,当点击序列的时候很壮观。
这个例子虽然简单,但我在实际运用过程中,也碰到不少问题。
第一个问题,起初我用的是组合框,和序列差不多的效果,把组合框放在单元格内,然而组合框覆盖单元格,而且组合框自带记忆功能,上一个人名会自然覆盖下一个想要输入的单元格,于是把组合框放在单元格外,这样才能确定是否用鼠标单击过了组合框的值。
然而组合框每次都要点击下拉的三角图标,于是我改为列表框。
第二个问题,就是selectchange事件本身,当单元格发生改变时才能触发,用过excel表格的人都知道,输入单元格的值只有按方向键或者enter键,单元格的值才能输入,然而按方向键或回车键,活动的单元格就会发生改变,变成不想输入值单元格。
怎样按enter键,单元格不发生改变?其实想实现的功能很简单,在序列区域按enter键,单元格不发生切换,在其他单元格就可以。于是我录制了宏,也查了很多东西,但是看不懂,只好采用一种投机取巧的方式,在自定义功能区,高级选项卡里,把enter键上下左右移动的功能关闭。
代码如下,初学vba,欢迎大家批评指正。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ’seleciton change 事件
Dim rng As Range
Application.ScreenUpdating = False
Me.ListBox1.Clear
On Error Resume Next
If Target.Column = 51 Or _
Target.Column = 53 Or _
Target.Column = 55 Or _
Target.Column = 57 Or _
Target.Column = 59 Then
With Me.ListBox1
.Top = Target.Top
.Left = Target.Offset(0, 1).Left
.Width = Target.Width
.Height = Target.Height * 5
For Each rng In Worksheets("效益工资").Range("a2", Worksheets("效益工资").[a63356].End(xlUp))
If Left(Target.Value, 1) = Left(rng.Value, 1) Then
Me.ListBox1.AddItem rng.Value
End If
Next
End With
End If
Application.ScreenUpdating = ture
End Sub
Private Sub ListBox1_Click()`单击事件
Dim xlrng
ActiveCell = Me.ListBox1.Text
End Sub