最近因爲項目需求,要製作一個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小白急需完成功能參考,讓大神見笑了。