Board logo

標題: 如何利用勾選方塊來篩選資料 [打印本頁]

作者: Jared    時間: 2015-6-8 16:44     標題: 如何利用勾選方塊來篩選資料

想請問各位大大
我現在想要利用表單來篩選資料
[attach]21133[/attach]
下拉式選擇資料還可以執行
但如果想要利用勾選資料的方式
不曉得問題點在哪裡 ><
[attach]21134[/attach]
  1. Dim a, b, c, d, e, f, g, h, i, j, k, l, m
  2. Private Sub CommandButton1_Click() '篩選條件

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

  5. d = CheckBox1.Value
  6. e = CheckBox2.Value
  7. f = CheckBox3.Value
  8. g = CheckBox4.Value
  9. h = CheckBox5.Value
  10. i = CheckBox6.Value
  11. j = CheckBox7.Value
  12. k = CheckBox8.Value
  13. l = CheckBox9.Value
  14. m = CheckBox10.Value

  15. c = Array(d, e, f, g, h, i, j, k, l, m)


  16. With ActiveSheet.Range("$A$1:$K$121")
  17.     .Parent.AutoFilterMode = False   '顯示全部資料 ->新的 多重篩選
  18.    
  19.     '多重篩選  ..........
  20.     If a <> "" Then .AutoFilter Field:=1, Criteria1:=a
  21.     If b <> "" Then .AutoFilter Field:=2, Criteria1:=b
  22.     If c <> "" Then .AutoFilter Field:=3, Criteria1:=c, Operator:=xlFilterValues
  23.     '多重篩選  ..........
  24. End With
  25. End Sub

  26. Private Sub CommandButton2_Click() '清除內容
  27. Me.ComboBox1 = ""
  28. Me.ComboBox2 = ""
  29. Me.CheckBox1 = ""
  30. Me.CheckBox2 = ""
  31. Me.CheckBox3 = ""
  32. Me.CheckBox4 = ""
  33. Me.CheckBox5 = ""
  34. Me.CheckBox6 = ""
  35. Me.CheckBox7 = ""
  36. Me.CheckBox8 = ""
  37. Me.CheckBox9 = ""
  38. Me.CheckBox10 = ""
  39. End Sub

  40. Private Sub CommandButton3_Click() '取消
  41. Test.Hide
  42. End Sub

  43. Private Sub CommandButton4_Click() '展開
  44. ActiveSheet.Range("$A$1:$K$121").AutoFilter Field:=1
  45. ActiveSheet.Range("$A$1:$K$121").AutoFilter Field:=2
  46. ActiveSheet.Range("$A$1:$K$121").AutoFilter Field:=3
  47. End Sub
  48. Private Sub UserForm_Initialize()

  49.     ComboBox1.List = Array("Q1", "Q2", "Q3", "Q4") '季
  50.    
  51.     ComboBox2.List = Array("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月") '月

  52. End Sub
複製代碼

作者: luhpro    時間: 2015-6-11 23:35

本帖最後由 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 也可以考慮做物件陣列,
不過因為程式並不複雜,
所以這部份我就先不考慮了.
[attach]21161[/attach]
作者: Jared    時間: 2015-6-26 09:30

回復 2# luhpro


    謝謝大大 :)




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)