1. 程式人生 > >【已解決】如何做excel表的下拉框多選

【已解決】如何做excel表的下拉框多選

最近因為專案需求,要製作一個excel匯入的模板,模板中要求某幾列的下拉框是多選的。。不得不臨時研究了一下vba。其間各種心酸不多說。。。。。。

首先,這個是需要啟用巨集,在vb編輯器裡寫程式碼,所以你要確保你的excel是可以啟用巨集的。如果是正式版的office是可以直接用(破解版就不知道了)。我用的是wps。需要裝個外掛(網上可下載)

 完成效果是這樣的:可多選,不可重複。

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

第二步,在【設計模式】下右擊控制元件,給控制元件註明相關屬性,注意標紅的三處。其中ListFillRange引數意為該listBox列表的值取自名為date的sheet的第一列(A列)中的1~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小白急需完成功能參考,讓大神見笑了。