返回列表 上一主題 發帖

如何利用勾選方塊來篩選資料

本帖最後由 luhpro 於 2015-6-11 23:43 編輯
想請問各位大大
我現在想要利用表單來篩選資料
下拉式選擇資料還可以執行
但如果想要利用勾選資料的方 ...
Jared 發表於 2015-6-8 16:44

看起來自動篩選同一欄好像不能同時滿足超過一個條件. (即不能在同一欄中同時顯示出來小華與小明)

所以我這裡採用逐列篩選,
未能同時滿足所有條件的列則將其隱藏,
留下的就是我們要的資料了.

也因為採用的是隱藏列的方式,
所以 "按鈕1" 位置要上移到 第 1 列 以免被隱藏而無法點選.

首先, 因應程式調整, 全域變數的宣告內容也做調整:
  1. Dim a, b, s, lRow
複製代碼
"篩選條件" 按鈕程式修改如下:
  1. Private Sub CommandButton1_Click() '篩選條件

  2. ActiveSheet.Rows.Hidden = False

  3. a = Test.ComboBox1.Value '季節
  4. b = Test.ComboBox2.Value '月份

  5. s = ""
  6. s = s & IIf(CheckBox1, CheckBox1.Caption & ",", "")
  7. s = s & IIf(CheckBox2, CheckBox2.Caption & ",", "")
  8. s = s & IIf(CheckBox3, CheckBox3.Caption & ",", "")
  9. s = s & IIf(CheckBox4, CheckBox4.Caption & ",", "")
  10. s = s & IIf(CheckBox5, CheckBox5.Caption & ",", "")
  11. s = s & IIf(CheckBox6, CheckBox6.Caption & ",", "")
  12. s = s & IIf(CheckBox7, CheckBox7.Caption & ",", "")
  13. s = s & IIf(CheckBox8, CheckBox8.Caption & ",", "")
  14. s = s & IIf(CheckBox9, CheckBox9.Caption & ",", "")
  15. s = s & IIf(CheckBox10, CheckBox10.Caption & ",", "")

  16. lRow = 2
  17. With ActiveSheet
  18.   While .Cells(lRow, 1) <> ""
  19.     If Not (.Cells(lRow, 1) = a And .Cells(lRow, 2) = b And _
  20.         InStr(1, s, .Cells(lRow, 3)) <> 0) Then .Rows(lRow).Hidden = True
  21.     lRow = lRow + 1
  22.   Wend
  23. End With
  24. End Sub
複製代碼
"清除內容" 按鈕程式中,
CheckBox 的值在此不能設為 "" 而應設為 False 或 true ,
另外既然篩選的條件已經被清除了,
篩選結果自然應該一併做還原.
故修改如下:
  1. Private Sub CommandButton2_Click() '清除內容
  2. Me.ComboBox1 = ""
  3. Me.ComboBox2 = ""
  4. Me.CheckBox1 = False
  5. Me.CheckBox2 = False
  6. Me.CheckBox3 = False
  7. Me.CheckBox4 = False
  8. Me.CheckBox5 = False
  9. Me.CheckBox6 = False
  10. Me.CheckBox7 = False
  11. Me.CheckBox8 = False
  12. Me.CheckBox9 = False
  13. Me.CheckBox10 = False
  14. ActiveSheet.Rows.Hidden = False
  15. End Sub
複製代碼
"展開" 按鈕程式也要跟著做調整:
  1. Private Sub CommandButton4_Click() '展開
  2.   ActiveSheet.Rows.Hidden = False
  3. End Sub
複製代碼
另外你的檔案  ComboBox2.List 內容並不能與 B 欄對應, (例如 : "一" 不能對應 "一月"),
同時可以考慮一併都賦與初值,
所以我做了以下的修改:
  1. Private Sub UserForm_Initialize()

  2.     With ComboBox1
  3.       .List = Array("Q1", "Q2", "Q3", "Q4") '季
  4.       .Value = "Q1"
  5.     End With
  6.     With ComboBox2
  7.       .List = Array("一", "二", "三") '月
  8.       .Value = "一"
  9.     End With
  10. End Sub
複製代碼
最後 Q1 不會有 "一","二","三" 以外的月份,
故可以在變更 ComboBox1 內容時一併把 ComboBox2 的選單調整好:
  1. Private Sub ComboBox1_Change()
  2.   Select Case ComboBox1
  3.   
  4.     Case "Q1"
  5.       ComboBox2.List = Array("一", "二", "三") '月
  6.    
  7.     Case "Q2"
  8.       ComboBox2.List = Array("四", "五", "六")  '月
  9.    
  10.     Case "Q3"
  11.       ComboBox2.List = Array("七", "八", "九") '月
  12.    
  13.     Case "Q4"
  14.       ComboBox2.List = Array("十", "十一", "十二")  '月
  15.   End Select
  16.   
  17. End Sub
複製代碼
當然, 程式還有簡化的空間,
且 CheckBox 也可以考慮做物件陣列,
不過因為程式並不複雜,
所以這部份我就先不考慮了.
測試-a.zip (18.13 KB)

TOP

        靜思自在 : 話多不如話少,話少不如話好。
返回列表 上一主題