今天給大家分享的表格小技巧是:如何制作顯示多列同時可以選擇多項的下拉菜單?
比如下圖,顯示三列下拉菜單,可以選擇任意多個項目合并到一個單元格……
首先,咱們得有個數(shù)據(jù)表,用來填充選項菜單的數(shù)據(jù)。嗯,我們把這份工作表命名為“參數(shù)表”,數(shù)據(jù)如下圖所示。A列是商品代碼,B列是商品,C列是負責人。
然后,我們在需要制作選項菜單的工作表放一個列表框控件。
在【開發(fā)工具】選項卡下單擊【插入】按鈕,在彈出來的選項菜單中選擇ActiveX控件列表框,畫在當前工作表。位置隨便,大小不論,丑美無關(guān)……畢竟這些你說了都不算,待會代碼會重置。
需要說明的是,如果這是你在當前工作簿放置的第1個列表框控件,它會被系統(tǒng)默認名稱為ListBox1。名字很重要,名字取不好,老婆娶不到,還記得你那個名字叫楊偉的同學嗎?——下面的代碼,我們都是通過名字來控制控件的一生的。
最后退出設(shè)計模式,也就是點擊【開發(fā)工具】選項卡下的【設(shè)計模式】按鈕。
OK,最后把以下代碼復制粘貼到目標工作表的VBE編輯窗口即可。比如我們這里是粘貼到名稱為“入庫單”工作表。
代碼如下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column <> 2 Or Target.Row < 4 Then ListBox1.Visible = False: Exit Sub
'如果選中的單元格不是第2列,或者小于4行,也就是不在目標范圍內(nèi),則退出程序
If Target.Columns.Count > 1 Or Target.Rows.Count > 1 Then ListBox1.Visible = False: Exit Sub
'如果選中的單元格大于1個,則退出程序
With Sheets("參數(shù)表")
r = .Range("a1:c" & .Cells(Rows.Count, "a").End(xlUp).Row).Value
End With
With ListBox1
'調(diào)整位置到單元格處
.Top = Target.Top 'listbox的頂端位置
.Left = Target.Left + Target.Width 'listbox的左端位置
.Width = 250 '寬度
.Height = 150 '高度
.Visible = True '可見
'.ColumnHeads = True '顯示標題行
.ColumnCount = 3 '三列
.ColumnWidths = "50;120;50" '設(shè)置第一列寬度50第二列寬度120……
.List = r '數(shù)據(jù)來源
.MultiSelect = fmMultiSelectMulti '允許通過鼠標點擊的方式進行多選
.ListStyle = fmListStyleOption '選項按鈕設(shè)置為方形
End With
End Sub
Private Sub ListBox1_Change()
Dim i As Long, strMy As String
With ListBox1
If .Selected(0) = True Then .Selected(0) = False
'如果用戶選取的是標題行那么撤銷選取
For i = 1 To .ListCount - 1
'遍歷listbox的記錄,如果被選中則按換行符合并
If .Selected(i) = True Then
strMy = strMy & vbCrLf & .List(i, 1)
'取list的第二列
'無論列還是行的索引都是從0開始的,因此第二列為1
End If
Next
End With
ActiveCell.Value = Mid(strMy, 3)
'數(shù)據(jù)寫入單元格
End Sub
代碼有兩個部分組成。
一部分是工作表的Worksheet_SelectionChange事件。當用戶選擇目標范圍內(nèi)的單元格時,顯示設(shè)置列表框的位置、大小和數(shù)據(jù)。
本例中列表框只出現(xiàn)在B列,且行數(shù)大于3的情況下。這個可以根據(jù)實際情況,自己進行修改。
另一部分是列表框的ListBox1_Change事件,當用戶選擇列表框的數(shù)據(jù)時,將數(shù)據(jù)寫入單元格。
承擔因您的行為而導致的法律責任,
本站有權(quán)保留或刪除有爭議評論。
參與本評論即表明您已經(jīng)閱讀并接受
上述條款。