Xin trợ giúp lọc dữ liệu nhiều điều kiện. (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

phananhvusv

Thành viên chính thức
Tham gia
28/3/17
Bài viết
72
Được thích
13
Hiện tại em có 1 file dữ liệu trùng thẻ BHYT của toàn tỉnh.
Yêu cầu đặt ra là phải lọc dữ liệu thành 3 sheet với điều kiện như sau:
1/ chỉ lấy những trường hợp thẻ của "VP Bảo hiểm xã hội tỉnh Kiên Giang" trùng nhau và không trùng với các huyện khác. Điều kiện là "nơi cấp" (cột I) là "VP Bảo hiểm xã hội tỉnh Kiên Giang", mã số BHXH (cột D) trùng nhau, và không có trùng với "nơi cấp" khác.
VD: trong file excel là số thứ tự 1 và 2 (Nguyễn Minh Kha) đạt yêu cầu chỉ có ở "VP BHXH tỉnh" chứ ko có thẻ ở huyện khác.
2/ Chỉ lấy những trường hợp thẻ của các huyện khác trùng nhau, không có thẻ ở "VP BHXH tỉnh"
3/ Trường hợp còn lại sau khi trừ 2 trường hợp trên: chỉ những trường hợp thẻ trùng nhau giữa "VP BHXH tỉnh" với các huyện khác.

Mong các bác giúp đỡ, em nghĩ mãi ko ra hàm nào làm được cái này hết. Em cám ơn.
 

File đính kèm

Hiện tại em có 1 file dữ liệu trùng thẻ BHYT của toàn tỉnh.
Yêu cầu đặt ra là phải lọc dữ liệu thành 3 sheet với điều kiện như sau:
1/ chỉ lấy những trường hợp thẻ của "VP Bảo hiểm xã hội tỉnh Kiên Giang" trùng nhau và không trùng với các huyện khác. Điều kiện là "nơi cấp" (cột I) là "VP Bảo hiểm xã hội tỉnh Kiên Giang", mã số BHXH (cột D) trùng nhau, và không có trùng với "nơi cấp" khác.
VD: trong file excel là số thứ tự 1 và 2 (Nguyễn Minh Kha) đạt yêu cầu chỉ có ở "VP BHXH tỉnh" chứ ko có thẻ ở huyện khác.
2/ Chỉ lấy những trường hợp thẻ của các huyện khác trùng nhau, không có thẻ ở "VP BHXH tỉnh"
3/ Trường hợp còn lại sau khi trừ 2 trường hợp trên: chỉ những trường hợp thẻ trùng nhau giữa "VP BHXH tỉnh" với các huyện khác.

Mong các bác giúp đỡ, em nghĩ mãi ko ra hàm nào làm được cái này hết. Em cám ơn.
Bạn nêu ví dụ cả 3 trường hợp ra nhé.Không thì không hiểu bạn nói gì luôn.:D
 
Upvote 0
Bạn nêu ví dụ cả 3 trường hợp ra nhé.Không thì không hiểu bạn nói gì luôn.:D

Thật ra lúc viết mình khá bối rối, không biết phải giải thích thế nào. :D
Trong file excel đó là liệt kê tất cả các thẻ BHYT bị trùng nhau về mã số BHXH ( mỗi người 1 mã số khác nhau) và thời hạn thẻ BHYT. 1 người có thể được cấp thẻ ở 1 nơi hoặc nhiều nơi. mấu chốt là mình muốn lọc ra 1 người nào đó có nơi nào cấp thẻ BHYT.

VD nhé:
1/ Trường hợp đầu tiên: 1 người chỉ có dữ liệu cấp thẻ (nơi cấp) ở VP bhxh tỉnh Kiên Giang. VD: trong file excel 2 dòng đầu tiên của Nguyễn Minh Kha là phù hợp với 2 điều kiện: "cùng 1 người" và "chỉ có nơi cấp ở VP bhxh tỉnh KG".
2/ Trường hợp 2: Những người có nơi cấp thẻ khác "VP BHXH tỉnh Kiên Giang". VD: 1 người có 3 dữ liệu cấp thẻ (3 dòng dữ liệu), trong đó 2 thẻ cấp ở huyện Châu Thành, 1 thẻ cấp ở huyện Hòn Đất, và không có thẻ nào cấp ở "VP BHXH tỉnh KG" => phù hợp với yêu cầu, xuất cả 3 dòng dữ liệu đó ra kết quả.
3/ Trường hợp 3: Những trường hợp còn lại (trừ 2 trường hợp trên ra). Là những người có thẻ được cấp ở "VP BHXH tỉnh KG" đồng thời cũng có thẻ cấp ở những huyện khác. VD: 1 người có 3 thẻ, trong đó 1 thẻ cấp ở "VP BHXH tỉnh KG", 2 thẻ được cấp ở huyện Phú Quốc => phù hợp với yêu cầu, xuất cả 3 dòng dữ liệu ra kết quả.

Văn phong của em hơi bị cùi bắp, mấy bác thông cảm. À quên nữa, tiêu chí "cùng 1 người" phải lấy cột "Mã số BHXH" (cột D) nhe bác. vì 1 người 1 mã số bhxh. Lấy theo họ tên sẽ có nhiều người trùng tên nhau lắm.
 
Upvote 0
Thật ra lúc viết mình khá bối rối, không biết phải giải thích thế nào. :D
Trong file excel đó là liệt kê tất cả các thẻ BHYT bị trùng nhau về mã số BHXH ( mỗi người 1 mã số khác nhau) và thời hạn thẻ BHYT. 1 người có thể được cấp thẻ ở 1 nơi hoặc nhiều nơi. mấu chốt là mình muốn lọc ra 1 người nào đó có nơi nào cấp thẻ BHYT.

VD nhé:
1/ Trường hợp đầu tiên: 1 người chỉ có dữ liệu cấp thẻ (nơi cấp) ở VP bhxh tỉnh Kiên Giang. VD: trong file excel 2 dòng đầu tiên của Nguyễn Minh Kha là phù hợp với 2 điều kiện: "cùng 1 người" và "chỉ có nơi cấp ở VP bhxh tỉnh KG".
2/ Trường hợp 2: Những người có nơi cấp thẻ khác "VP BHXH tỉnh Kiên Giang". VD: 1 người có 3 dữ liệu cấp thẻ (3 dòng dữ liệu), trong đó 2 thẻ cấp ở huyện Châu Thành, 1 thẻ cấp ở huyện Hòn Đất, và không có thẻ nào cấp ở "VP BHXH tỉnh KG" => phù hợp với yêu cầu, xuất cả 3 dòng dữ liệu đó ra kết quả.
3/ Trường hợp 3: Những trường hợp còn lại (trừ 2 trường hợp trên ra). Là những người có thẻ được cấp ở "VP BHXH tỉnh KG" đồng thời cũng có thẻ cấp ở những huyện khác. VD: 1 người có 3 thẻ, trong đó 1 thẻ cấp ở "VP BHXH tỉnh KG", 2 thẻ được cấp ở huyện Phú Quốc => phù hợp với yêu cầu, xuất cả 3 dòng dữ liệu ra kết quả.

Văn phong của em hơi bị cùi bắp, mấy bác thông cảm. À quên nữa, tiêu chí "cùng 1 người" phải lấy cột "Mã số BHXH" (cột D) nhe bác. vì 1 người 1 mã số bhxh. Lấy theo họ tên sẽ có nhiều người trùng tên nhau lắm.
Bạn cho ví dụ kết quả theo từng trường hợp vào trong file excel để mình code xong còn xem có đúng không chứ.
 
Upvote 0
Bạn cho ví dụ kết quả theo từng trường hợp vào trong file excel để mình code xong còn xem có đúng không chứ.

Bác chỉ cần xem file em gởi lên, 2 dòng của Nguyễn Minh Kha là phù hợp với trường hợp 1 (chỉ có 1 nơi cấp là VP tỉnh)
2 dòng của Phùng Thị Cam là phù hợp với trường hợp 3 (có nơi cấp cả vp tỉnh và huyện khác)
3 dòng của Trần Thị Tươi là phù hợp với trường hợp 2 (không có nơi cấp ở VP tỉnh)

Đưa lên file excel sợ không giải thích đủ.
Bài đã được tự động gộp:

Cái này mình làm thủ công, không có macro bạn ơi! lười viết tại làm thủ công cũng nhanh mà

hả? làm thủ công bằng cách nào vậy bác? nãy em cũng lọc thử, nhưng dò lại thấy sai. Bác có thể nói cách làm để em biết là có chính xác không ạ? Tại dữ liệu nhiều quá, em không dò tất cả trường hợp được.
Bài đã được tự động gộp:

Cái này mình làm thủ công, không có macro bạn ơi! lười viết tại làm thủ công cũng nhanh mà

À, sai rồi bác ơi. ở TH1, Danh Huyền Trang có tới 4 dòng, trong đó có 1 dòng stt 153 ở sheet 1 là được cấp thẻ ở Huyện Giồng Riềng, người này phải thuộc trường hợp 2, có nơi cấp ở cả VP tỉnh và ở Huyện.
Bài đã được tự động gộp:

Bạn cho ví dụ kết quả theo từng trường hợp vào trong file excel để mình code xong còn xem có đúng không chứ.

Em gởi VD cho bác cả 3 trường hợp.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bác chỉ cần xem file em gởi lên, 2 dòng của Nguyễn Minh Kha là phù hợp với trường hợp 1 (chỉ có 1 nơi cấp là VP tỉnh)
2 dòng của Phùng Thị Cam là phù hợp với trường hợp 3 (có nơi cấp cả vp tỉnh và huyện khác)
3 dòng của Trần Thị Tươi là phù hợp với trường hợp 2 (không có nơi cấp ở VP tỉnh)

Đưa lên file excel sợ không giải thích đủ.
Bài đã được tự động gộp:



hả? làm thủ công bằng cách nào vậy bác? nãy em cũng lọc thử, nhưng dò lại thấy sai. Bác có thể nói cách làm để em biết là có chính xác không ạ? Tại dữ liệu nhiều quá, em không dò tất cả trường hợp được.
Bài đã được tự động gộp:



À, sai rồi bác ơi. ở TH1, Danh Huyền Trang có tới 4 dòng, trong đó có 1 dòng stt 153 ở sheet 1 là được cấp thẻ ở Huyện Giồng Riềng, người này phải thuộc trường hợp 2, có nơi cấp ở cả VP tỉnh và ở Huyện.
Bài đã được tự động gộp:



Em gởi VD cho bác cả 3 trường hợp.
Bạn xem có đúng trường hợp 1 không nhé.Tối mình viết tiếp.Đã code đủ 3 TH bạn xem đúng không nhé.
Mã:
Sub tachtheokiengiang()
Dim arr, arr1, lr As Long, i As Long, a1 As Long, dic As Object, dk As String, dks As String, b As Integer, j As Integer, arr2, arr3, a2 As Long, a3 As Long
dk = "VP B" & ChrW(7843) & "o hi" & ChrW(7875) & "m Xã h" & ChrW(7897) & "i t" & ChrW(7881) & "nh Kiên Giang"

Set dic = CreateObject("scripting.dictionary")
With Sheets("3")
     lr = .Range("I" & Rows.Count).End(xlUp).Row
     If lr < 2 Then Exit Sub
     arr = .Range("B2:I" & lr).Value
     ReDim arr1(1 To UBound(arr, 1), 1 To 9)
     ReDim arr2(1 To UBound(arr, 1), 1 To 9)
     ReDim arr3(1 To UBound(arr, 1), 1 To 9)
     For i = 1 To UBound(arr, 1)
         If Not dic.exists(arr(i, 3)) Then
            If arr(i, 8) = dk Then b = 1 Else b = 2
            dic.Add arr(i, 3), Array(arr(i, 8), b)
         Else
            dks = dic.Item(arr(i, 3))(0)
            b = dic.Item(arr(i, 3))(1)
            If b = 2 Or dk <> arr(i, 8) Then
               dks = dks & "-" & arr(i, 8)
               b = 2
            End If
            dic.Item(arr(i, 3)) = Array(dks, b)
         End If
    Next i
    For i = 1 To UBound(arr, 1)
          b = dic.Item(arr(i, 3))(1)
          dks = dic.Item(arr(i, 3))(0)
          If b = 1 Then
             a1 = a1 + 1
             arr1(a1, 1) = a1
             For j = 2 To 9
                 arr1(a1, j) = arr(i, j - 1)
             Next j
          ElseIf InStr(1, dks, dk) Then
             a2 = a2 + 1
             arr2(a2, 1) = a2
             For j = 2 To 9
                 arr2(a2, j) = arr(i, j - 1)
             Next j
          Else
             a3 = a3 + 1
             arr3(a3, 1) = a3
             For j = 2 To 9
                 arr3(a3, j) = arr(i, j - 1)
             Next j
          End If
   Next i
End With
With Sheets("TH1")
       lr = .Range("A" & Rows.Count).End(xlUp).Row
       If lr > 1 Then .Range("A2:I" & lr).ClearContents
     If a1 Then .Range("A2").Resize(a1, 9).Value = arr1
End With
With Sheets("TH2")
       lr = .Range("A" & Rows.Count).End(xlUp).Row
       If lr > 1 Then .Range("A2:I" & lr).ClearContents
    If a2 Then .Range("A2").Resize(a2, 9).Value = arr2
End With
With Sheets("TH3")
       lr = .Range("A" & Rows.Count).End(xlUp).Row
       If lr > 1 Then .Range("A2:I" & lr).ClearContents
    If a3 Then .Range("A2").Resize(a3, 9).Value = arr3
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn cho ví dụ kết quả theo từng trường hợp vào trong file excel để mình code xong còn xem có đúng không chứ.

Bác Snow ơi. Em lại nhận đc yêu cầu khác là lọc ra dữ liệu cho từng huyện. Bây giờ phải làm thêm 1 huyện 1 sheet. Chỉ lấy ra những trường hợp có liên quan đến Huyện đó thôi.
Em thấy nó giống với VP tỉnh. Mình phải sửa code thế nào ạ?
 
Upvote 0
Bác Snow ơi. Em lại nhận đc yêu cầu khác là lọc ra dữ liệu cho từng huyện. Bây giờ phải làm thêm 1 huyện 1 sheet. Chỉ lấy ra những trường hợp có liên quan đến Huyện đó thôi.
Em thấy nó giống với VP tỉnh. Mình phải sửa code thế nào ạ?
Bạn gửi ví dụ lên nhé.Ví dụ có kết quả mẫu ấy.
 
Upvote 0
Em gởi bác file Vd vài trường hợp của Rạch Giá.
Bạn xem đúng không nhé.Nhập điều kiện vào Ô M2 là được.
Mã:
Sub tachtheoten()
Dim arr, arr1, lr As Long, i As Long, a1 As Long, dic As Object, dk As String, dks As String, b As Integer, j As Integer, arr2, arr3, a2 As Long, a3 As Long
Set dic = CreateObject("scripting.dictionary")
With Sheets("3")
     dk = .Range("M2").Value
     lr = .Range("I" & Rows.Count).End(xlUp).Row
     If lr < 2 Then Exit Sub
     arr = .Range("B2:I" & lr).Value
     ReDim arr1(1 To UBound(arr, 1), 1 To 9)
     For i = 1 To UBound(arr, 1)
         If Not dic.exists(arr(i, 3)) Then
              If UCase(dk) = UCase(arr(i, 8)) Then b = 1 Else b = 0
               dic.Add arr(i, 3), b
         Else
         b=dic.item(arr(i,3))
          If b = 0 Then
            If UCase(dk) = UCase(arr(i, 8)) Then b = 1
               dic.Item(arr(i, 3)) = b
          End If
         End If
    Next i
    For i = 1 To UBound(arr, 1)
            b = dic.Item(arr(i, 3))
          If b = 1 Then
             a1 = a1 + 1
             arr1(a1, 1) = a1
             For j = 2 To 9
                 arr1(a1, j) = arr(i, j - 1)
             Next j
          End If
   Next i
End With
With Sheets("TH1")
       lr = .Range("A" & Rows.Count).End(xlUp).Row
       If lr > 1 Then .Range("A2:I" & lr).ClearContents
     If a1 Then .Range("A2").Resize(a1, 9).Value = arr1
End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn xem đúng không nhé.Nhập điều kiện vào Ô M2 là được.

Em làm phiền bác thêm 1 lần nữa được không ạ?
Cái code này của bác là quá ok với em rồi. Nhưng giờ em phải làm thêm 1 điều kiện nữa. Em muốn loại bỏ những người có mã thẻ "GD" (2 ký tự đầu của cột E "SO_THE_KCB") mà hạn thẻ của nó (cột F "từ ngày" - G "đến ngày" của thẻ GD đó) bị trùng với các thẻ còn lại.
VD: Bà Phùng Thị Cam có thẻ "GD4919121692979 hạn thẻ từ 22/11/2017 - 21/05/2018" và thẻ "DN4919121692979 hạn thẻ từ 01/01/2018 - 31/12/2018" tức là đã bị trùng thời hạn của thẻ GD với các thẻ còn lại (kể cả GD trùng GD) thì phải loại bỏ.
Em gởi VD trong file bác gởi em. Những dòng em tô vàng là phải loại bỏ (em chỉ tô vàng vài trường hợp đầu thôi ạ). Em cám ơn bác ạ.
 

File đính kèm

Upvote 0
Em làm phiền bác thêm 1 lần nữa được không ạ?
Cái code này của bác là quá ok với em rồi. Nhưng giờ em phải làm thêm 1 điều kiện nữa. Em muốn loại bỏ những người có mã thẻ "GD" (2 ký tự đầu của cột E "SO_THE_KCB") mà hạn thẻ của nó (cột F "từ ngày" - G "đến ngày" của thẻ GD đó) bị trùng với các thẻ còn lại.
VD: Bà Phùng Thị Cam có thẻ "GD4919121692979 hạn thẻ từ 22/11/2017 - 21/05/2018" và thẻ "DN4919121692979 hạn thẻ từ 01/01/2018 - 31/12/2018" tức là đã bị trùng thời hạn của thẻ GD với các thẻ còn lại (kể cả GD trùng GD) thì phải loại bỏ.
Em gởi VD trong file bác gởi em. Những dòng em tô vàng là phải loại bỏ (em chỉ tô vàng vài trường hợp đầu thôi ạ). Em cám ơn bác ạ.
Bạn xem nhé.
 

File đính kèm

Upvote 0
Cám ơn bạn nhiều lắm. Mình có thể xin nick Facebook hay Zalo của bạn được ko? Mình muốn học VBA như bạn, nhưng chỗ mình ko có người dạy. Muốn tự học như bạn thì không biết bắt đầu từ đâu. Mình chỉ xin nick để khi học ko hiểu gì thì học hỏi bạn thêm chứ không làm phiền bạn nhiều đâu.
 
Upvote 0

Bạn snow ơi, cái code của bạn sau khi lọc ra kết quả thì mình thấy bị sai ngày tháng năm sinh, mình nghĩ là do sai định dạng.
Mình đã thử dùng hàm dò Index match để lấy lại ngày tháng năm sinh cho đúng nhưng báo lỗi N/A do sai kiểu text và kiểu số.
Mình dùng cách nào để giải quyết được vấn đề này hả bạn?
Vấn đề nữa đó là cột Mã số BHXH, có những mã số có số 0 đứng trước VD: '0112147375, sau khi ra kết quả do chuyển về dạng số nên mất đi số 0 ở đầu.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom