Đăng ký học Excel, VBA và phân tích số liệu cùng GPE tháng 1/2018 - TPHCM

Mua sách "VBA trong Excel - Cải thiện và tăng tốc" tái bản

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

Thảo luận trong 'Lập Trình với Excel' bắt đầu bởi alias1313, 10 Tháng một 2018.

  1. alias1313

    alias1313 Thành viên hoạt động

    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).
     

    Các file đính kèm:

  2. HieuCD

    HieuCD Thành viên gạo cội

    Bạn trang trí lại Form
     

    Các file đính kèm:

    befaint, alias1313huonglien1901 thích bài viết này.
  3. alias1313

    alias1313 Thành viên hoạt động

    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!
     

    Các file đính kèm:

  4. HieuCD

    HieuCD Thành viên gạo cội

    Mình xóa mất module1
     

    Các file đính kèm:

    alias1313 thích bài này.
  5. alias1313

    alias1313 Thành viên hoạt động

    Hihi...em chạy được rồi! Em cảm ơn anh @HieuCD rất nhiều!
     
  6. alias1313

    alias1313 Thành viên hoạt động


    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 đỡ!
     
  7. HieuCD

    HieuCD Thành viên gạo cội

    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
     
    alias1313 thích bài này.

Chia sẻ trang này