【已解决】如何做excel表的下拉框多选

最近因为项目需求,要制作一个excel导入的模板,模板中要求某几列的下拉框是多选的。。不得不临时研究了一下vba。其间各种心酸不多说。。。。。。

首先,这个是需要启用宏,在vb编辑器里写代码,所以你要确保你的excel是可以启用宏的。如果是正式版的office是可以直接用(破解版就不知道了)。我用的是wps。需要装个插件(网上可下载)

 完成效果是这样的:【已解决】如何做excel表的下拉框多选_第1张图片可多选,不可重复。

第一步:在excel中加入ListBox控件,

【已解决】如何做excel表的下拉框多选_第2张图片

第二步,在【设计模式】下右击控件,给控件注明相关属性,注意标红的三处。其中ListFillRange参数意为该listBox列表的值取自名为date的sheet的第一列(A列)中的1~3行。

【已解决】如何做excel表的下拉框多选_第3张图片     

第三步:双击该控件,进入编码区:注意【2】处,vb的方法名是生成的,例如需要选择【listBox1】再选择【change】会自动生成ListBox1_Change()这个方法,而不是写出来的。。。(做java的表示在这里卡了很久)

 下面贴上Sheet1(Sheet1)中的代码:

Private Sub ListBox1_Change()
    If ReLoad Then Exit Sub '见下方说明
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i)
    Next
    ActiveCell = Mid(t, 2)
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveCell.Column = 3 And ActiveCell.Row > 1 Then
            t = ActiveCell.Value
            ReLoad = True '如果是根据单元格的值修改列表框,则暂时屏蔽listbox的change事件。
    With ListBox1
            For i = 0 To .ListCount - 1 '根据活动单元格内容修改列表框中被选中的内容
                If InStr(t, .List(i)) Then
                    .Selected(i) = True
                    Else
                    .Selected(i) = False
                End If
            Next
            ReLoad = False
            .Top = ActiveCell.Top + ActiveCell.Height '以下语句根据活动单元格位置显示列表框
            .Left = ActiveCell.Left
            .Width = ActiveCell.Width
            .Visible = True
    End With
Else
           ListBox1.Visible = False                   
End If
End Sub

 Sheet2(date)中的代码:

Private Sub Worksheet_Change1(ByVal Target As Range)
    Sheets("Sheet1").ListBox1.ListFillRange = "data!a1:a" & Cells(1, 1).End(xlDown).Row
End Sub

模块1中的代码:

Public ReLoad As Boolean '开关listbox的change事件

 模块2中的代码:

Option Explicit
Sub ShowFM()
UserForm1.Show
End Sub

 这个适合vb小白急需完成功能参考,让大神见笑了。

这里是实现后的excel,有需要的可以直接下载了,稍微改改就能用了----多选下拉框下载链接

 

你可能感兴趣的:(功能实现)