我們在制作excel表格模板的時候,為了控制用戶的輸入,會將單元格設置數(shù)據(jù)驗證格式,如下圖:

但數(shù)據(jù)驗證只支持單選項,無法支持多選,那么,我們?nèi)绾螌崿F(xiàn)下拉復選框,實現(xiàn)多個選項勾選呢?(如下圖)

實驗開始:
環(huán)境:Excel 2016
支持:VBA支持庫(沒有安裝的,需要安裝哦)
第一步:準備數(shù)據(jù)源
新建一個Excel表格,sheet1創(chuàng)建4列表頭字段,sheet2用來存放選項值,我們以“愛好”、“學習課程”為例來實現(xiàn)下拉復選框


第二步:調(diào)出開發(fā)工具
文件 >> 選項 >> 勾選 “開發(fā)工具”,點擊“確定”。



第三步:插入列表框控件
開發(fā)工具 >> 插入 >> ActiveX 控件? >> 列表框控件,繪制控件。


第四步:設置列表框控件屬性
如下圖,繪制好的列表框控件名稱默認為“ListBox1”,當前為“設計模式”,點擊“屬性”,進入設置。

在彈出的屬性設置框中,設置好樣式、多選、選項值的數(shù)據(jù)源范圍(即sheet2 "愛好"一列的數(shù)據(jù),不包括表頭)。

用同樣的方法,新添加一個列表框控件,注意第二個列表框為ListBox2,并設置相關屬性,多選項的數(shù)據(jù)源范圍為“Sheet2!B2:B8”。

第五步:啟用VBA代碼
在狀態(tài)欄找到并點擊“查看代碼”,或是在活動表Sheet1右擊,選擇“查看代碼”,進入VBA編輯器。
注:如果Excel沒有安裝VBA支持庫的,需要先安裝好哦~


將下方代碼復制,并調(diào)試編譯
Private Sub ListBox1_Change()
If Reload Then Exit Sub '加載ListBox1
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 ListBox2_Change()
If Reload Then Exit Sub '加載ListBox2
For i = 0 To ListBox2.ListCount - 1
If ListBox2.Selected(i) = True Then t = t & "," & ListBox2.List(i)
Next
ActiveCell = Mid(t, 2)
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With ListBox1
? ? ? ? '第 2 列 且 單元格大于 1,因為表頭的字段不需要進行多選
? ? ? ? If ActiveCell.Column = 2 And ActiveCell.Row > 1 Then
? ? ? ? ? ? t = ActiveCell.Value
? ? ? ? ? ? Reload = True '如果是根據(jù)單元格的值修改列表框,則暫時屏蔽listbox的change事件。
? ? ? ? ? ? For i = 0 To .ListCount - 1 '根據(jù)活動單元格內(nèi)容修改列表框中被選中的內(nèi)容
? ? ? ? ? ? ? ? If InStr(t, .List(i)) Then
? ? ? ? ? ? ? ? ? ? .Selected(i) = True
? ? ? ? ? ? ? ? ? ? Else
? ? ? ? ? ? ? ? ? ? .Selected(i) = False
? ? ? ? ? ? ? ? End If
? ? ? ? ? ? Next
? ? ? ? ? ? Reload = False
? ? ? ? ? ? .Top = ActiveCell.Top + ActiveCell.Height '以下語句根據(jù)活動單元格位置顯示列表框
? ? ? ? ? ? .Left = ActiveCell.Left
? ? ? ? ? ? .Width = ActiveCell.Width
? ? ? ? ? ? .Visible = True
? ? ? ? ? ? Else
? ? ? ? ? ? .Visible = False
? ? ? ? End If
? ? End With
With ListBox2
? ? ? ? '第 4 列 且 單元格大于 1,因為表頭的字段不需要進行多選
? ? ? ? If ActiveCell.Column = 4 And ActiveCell.Row > 1 Then
? ? ? ? ? ? t = ActiveCell.Value
? ? ? ? ? ? Reload = True '如果是根據(jù)單元格的值修改列表框,則暫時屏蔽listbox的change事件。
? ? ? ? ? ? For i = 0 To .ListCount - 1 '根據(jù)活動單元格內(nèi)容修改列表框中被選中的內(nèi)容
? ? ? ? ? ? ? ? If InStr(t, .List(i)) Then
? ? ? ? ? ? ? ? ? ? .Selected(i) = True
? ? ? ? ? ? ? ? ? ? Else
? ? ? ? ? ? ? ? ? ? .Selected(i) = False
? ? ? ? ? ? ? ? End If
? ? ? ? ? ? Next
? ? ? ? ? ? Reload = False
? ? ? ? ? ? .Top = ActiveCell.Top + ActiveCell.Height '以下語句根據(jù)活動單元格位置顯示列表框
? ? ? ? ? ? .Left = ActiveCell.Left
? ? ? ? ? ? .Width = ActiveCell.Width
? ? ? ? ? ? .Visible = True
? ? ? ? ? ? Else
? ? ? ? ? ? .Visible = False
? ? ? ? End If
? ? End With
End Sub
調(diào)試 >> 編譯

再點擊一次“設計模式”,讓我們看看效果吧

超棒!nice!完結,撒花~