VBA动态列表框实例

作者: 猛犸象和剑齿虎 | 来源:发表于2018-10-07 18:24 被阅读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

    相关文章

      网友评论

        本文标题:VBA动态列表框实例

        本文链接:https://www.haomeiwen.com/subject/eimlaftx.html