每周500字有些文章不一定是为了上首页投稿工具癖

VBA动态列表框实例

2018-10-07  本文已影响2人  猛犸象和剑齿虎
效果图 列表数据

图一<效果图>功能介绍,采用动态序列,输入姓名首字,按回车键,该首字对应的姓名序列就会出现在列表内,单击列表的值,数据输入单元格内。

学习是件痛并快乐的事儿。痛的是在过程中,反复去看去读也无法理解产生的焦虑与挫败感,快乐的是理解的那一刻,从内心升腾出的喜悦,过程有多难受,结果就有多喜悦。

上篇文我制定了月度内的三个计划,第一个是做一个实用的下拉菜单。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

上一篇下一篇

猜你喜欢

热点阅读