Lọc dữ liệu theo điều kiện

alias1313

Thành viên hoạt động
Tham gia ngày
7 Tháng tư 2017
Bài viết
122
Thích
5
Điểm
170
#1
Em muốn lọc dữ liệu trong sheet : Data.
- Em muốn lọc những người sẽ thi giữ bậc lần 1 ( GB1) trong năm 2017 ( là những người được đánh dấu "x").
Và thêm những người thi giữ bậc lần 2 (GB2) trong năm 2018.

1. Theo năm(hàng 6): Có cách nào để em có thể tùy chọn 1 năm, 2 năm gần nhau(2017,2018), hay 2 năm cách nhau( 2017, 2019).
2. Theo GB1,GB2,NB1,NB2: em phải làm thế nào để sau khi chon năm thì em có thể chọn thêm/bớt các điều kiện GB1,GB2,NB1,NB2.

Mong anh/chị giúp đỡ. em cảm ơn nhiều! ( em có file đính kèm).
 

File đính kèm

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
4,552
Thích
6,583
Điểm
560
#2
Em muốn lọc dữ liệu trong sheet : Data.
- Em muốn lọc những người sẽ thi giữ bậc lần 1 ( GB1) trong năm 2017 ( là những người được đánh dấu "x").
Và thêm những người thi giữ bậc lần 2 (GB2) trong năm 2018.

1. Theo năm(hàng 6): Có cách nào để em có thể tùy chọn 1 năm, 2 năm gần nhau(2017,2018), hay 2 năm cách nhau( 2017, 2019).
2. Theo GB1,GB2,NB1,NB2: em phải làm thế nào để sau khi chon năm thì em có thể chọn thêm/bớt các điều kiện GB1,GB2,NB1,NB2.

Mong anh/chị giúp đỡ. em cảm ơn nhiều! ( em có file đính kèm).
Bạn trang trí lại Form
 

File đính kèm

alias1313

Thành viên hoạt động
Tham gia ngày
7 Tháng tư 2017
Bài viết
122
Thích
5
Điểm
170
#3
Anh ơi! Hình như file bị mất Macro! Em chạy nó báo: "a macro may not available in this workbook or all macros may be disabled".
Em kiểm tra thì có code phần lọc dữ liệu: "Private Sub CommandButton1_Click()".
Mong anh xem giúp em! Em cảm ơn anh @HieuCD rất nhiều!
 

File đính kèm

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
4,552
Thích
6,583
Điểm
560
#4
Anh ơi! Hình như file bị mất Macro! Em chạy nó báo: "a macro may not available in this workbook or all macros may be disabled".
Em kiểm tra thì có code phần lọc dữ liệu: "Private Sub CommandButton1_Click()".
Mong anh xem giúp em! Em cảm ơn anh @HieuCD rất nhiều!
Mình xóa mất module1
 

File đính kèm

alias1313

Thành viên hoạt động
Tham gia ngày
7 Tháng tư 2017
Bài viết
122
Thích
5
Điểm
170
#6
Anh ơi! Hình như file bị mất Macro! Em chạy nó báo: "a macro may not available in this workbook or all macros may be disabled".
Em kiểm tra thì có code phần lọc dữ liệu: "Private Sub CommandButton1_Click()".
Mong anh xem giúp em! Em cảm ơn anh @HieuCD rất nhiều!

Code của anh chạy đúng theo ý em muốn! Nhưng quả thật em chưa gặp cách viết code dạng như thế nên em tìm hiểu mãi cũng không hiểu hết! Nên em mong anh @HieuCD chú giải giúp em!

Mã:
Private Sub CommandButton1_Click()
  Dim dArr As Variant, tArr As Variant
  Dim Rng As Range
  Dim i As Long, j As Integer, Col As Integer, Test As Boolean
 
  Range("A10:A200").EntireRow.Hidden = False 'Chinh lai so 200
  dArr = Range("H10:AD" & Range("F" & Rows.Count).End(xlUp).Row).Value
  ReDim tArr(1 To UBound(dArr))

  For j = 0 To 11
    If UserForm1.Controls(j).Value Then
      Test = True
      Col = j * 2 + 1
      For i = 1 To UBound(dArr)
        If UCase(dArr(i, Col)) = "X" Then tArr(i) = True
      Next i
    End If
  Next j
 
 
  If Test = True Then
    For i = 1 To UBound(dArr)
      If tArr(i) = False Then
        If Rng Is Nothing Then
          Set Rng = Cells(i + 9, 1)
        Else
          Set Rng = Union(Rng, Cells(i + 9, 1))
        End If
      End If
    Next i
    Rng.EntireRow.Hidden = True
  End If
End Sub
1. Test = true: mình có thể hiểu câu lệnh này là để gọi hàm true/false không ạ? Em có thể đọc tài liệu phần nào trong VBA nói về hàm này ạ? Em cố kiếm nhưng không thấy!
2. tArr(i): Mảng này để xác định vùng cần tìm tương ứng với (i)
3.Rng: Với mỗi giá trị (i) mà tArr(i) = False ( Nghĩa là cells khác "X") ta gán Rng cho vùng đó rồi ẩn nó đi.

Em trình bày theo cách hiểu của mình, do kiến thức VBA còn kém mong anh giúp đỡ!
 

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
4,552
Thích
6,583
Điểm
560
#7
Code của anh chạy đúng theo ý em muốn! Nhưng quả thật em chưa gặp cách viết code dạng như thế nên em tìm hiểu mãi cũng không hiểu hết! Nên em mong anh @HieuCD chú giải giúp em!

Mã:
Private Sub CommandButton1_Click()
  Dim dArr As Variant, tArr As Variant
  Dim Rng As Range
  Dim i As Long, j As Integer, Col As Integer, Test As Boolean
 
  Range("A10:A200").EntireRow.Hidden = False 'Chinh lai so 200
  dArr = Range("H10:AD" & Range("F" & Rows.Count).End(xlUp).Row).Value
  ReDim tArr(1 To UBound(dArr))

  For j = 0 To 11
    If UserForm1.Controls(j).Value Then
      Test = True
      Col = j * 2 + 1
      For i = 1 To UBound(dArr)
        If UCase(dArr(i, Col)) = "X" Then tArr(i) = True
      Next i
    End If
  Next j
 
 
  If Test = True Then
    For i = 1 To UBound(dArr)
      If tArr(i) = False Then
        If Rng Is Nothing Then
          Set Rng = Cells(i + 9, 1)
        Else
          Set Rng = Union(Rng, Cells(i + 9, 1))
        End If
      End If
    Next i
    Rng.EntireRow.Hidden = True
  End If
End Sub
1. Test = true: mình có thể hiểu câu lệnh này là để gọi hàm true/false không ạ? Em có thể đọc tài liệu phần nào trong VBA nói về hàm này ạ? Em cố kiếm nhưng không thấy!
2. tArr(i): Mảng này để xác định vùng cần tìm tương ứng với (i)
3.Rng: Với mỗi giá trị (i) mà tArr(i) = False ( Nghĩa là cells khác "X") ta gán Rng cho vùng đó rồi ẩn nó đi.

Em trình bày theo cách hiểu của mình, do kiến thức VBA còn kém mong anh giúp đỡ!
Mã:
Private Sub CommandButton1_Click()
  Dim dArr As Variant, tArr As Variant
  Dim Rng As Range 'là những ô cột A, dòng sẽ ẩn
  Dim i As Long, j As Integer, Col As Integer, Test As Boolean'Biến Test là giá trị luận lý, giá trị ban đầu = False

  Range("A10:A200").EntireRow.Hidden = False 'Chinh lai so 200, Bỏ ẩn tất cả các dòng
  dArr = Range("H10:AD" & Range("F" & Rows.Count).End(xlUp).Row).Value
  ReDim tArr(1 To UBound(dArr))'Mảng ghi nhận điều kiện lọc, thỏa điều kiện sẽ gán giá trị true, không thỏa có giá trị ban đầu là Empty (coi như False)

  For j = 0 To 11
   If UserForm1.Controls(j).Value Then
     Test = True' Khi có điều kiện lọc thì gán Test=true
     Col = j * 2 + 1
     For i = 1 To UBound(dArr)
       If UCase(dArr(i, Col)) = "X" Then tArr(i) = True'Dòng thứ i có tArr(i)=true sẽ hiện ra
     Next i
   End If
  Next j


  If Test = True Then 'Khi có điều kiện lọc mới chạy code, không có thì không lọc
   For i = 1 To UBound(dArr)
     If tArr(i) = False Then 'Dòng i của mảng sẽ ẩn
       If Rng Is Nothing Then
         Set Rng = Cells(i + 9, 1)'i+9 là dòng ẩn của sheet
       Else
         Set Rng = Union(Rng, Cells(i + 9, 1))
       End If
     End If
   Next i
   Rng.EntireRow.Hidden = True
  End If
End Sub
 
Top