Trích lọc những phần tử trùng theo nhiều cột (1 người xem)

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

hokranhyeuemst

Thành viên mới
Tham gia
25/9/13
Bài viết
12
Được thích
0
mình cần trích lọc 1 danh sách có 1 số hoten và namsinh trùng nhau và copy cả 2 hoặc 3 người trùng đó qua Sheet mới, hôm trước được bạn hoangminhtien trợ giúp nhưng còn thiếu 1 chút!
Lọc theo 2 tiêu chí "hoten" và 'namsinh"; nếu cả 2 giống nhau thì copy cả 2 qua Sheet mới
Mình gửi file đính kèm để anh chị hiểu rõ ý mình nói!

 

File đính kèm

Lần chỉnh sửa cuối:
mình cần trích lọc 1 danh sách có 1 số hoten và namsinh trùng nhau và copy cả 2 hoặc 3 người trùng đó qua Sheet mới, hôm trước được bạn hoangminhtien trợ giúp nhưng còn thiếu 1 chút!
Lọc theo 2 tiêu chí "hoten" và 'namsinh"; nếu cả 2 giống nhau thì copy cả 2 qua Sheet mới
Mình gửi file đính kèm để anh chị hiểu rõ ý mình nói!

Đã có người làm rồi sao không hỏi tiếp ở topic kia mà mở topic mới?
Tặng bạn code này chạy thử xem sao:
PHP:
Public Sub GPE()
Dim Dic As Object, I As Long, Tem As String, K As Long, J As Long, sArr(), dArr()
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("DS Goc")
    sArr = .Range(.[A2], .[A65000].End(xlUp)).Resize(, 8).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 8)
For I = 1 To UBound(sArr, 1)
    Tem = UCase(sArr(I, 2)) & "#" & sArr(I, 3)
    If Not Dic.Exists(Tem) Then
        Dic.Add Tem, 1
    Else
        Dic.Item(Tem) = 2
    End If
Next I
For I = 1 To UBound(sArr, 1)
    Tem = UCase(sArr(I, 2)) & "#" & sArr(I, 3)
    If Dic.Item(Tem) = 2 Then
        K = K + 1
        For J = 1 To 8
            dArr(K, J) = sArr(I, J)
        Next J
    End If
Next I
With Sheets("DS LOC")
    .[A2:H65000].ClearContents
    .[A2].Resize(K, 8).Value = dArr
    .[A2].Resize(K, 8).Borders.LineStyle = xlContinuous
End With
Set Dic = Nothing
End Sub
 

File đính kèm

Rất cảm ơn bạn Beta giải đáp, rất pro nhưng mình thì chẳng hiểu tí tẹo nào hết.hix
Nếu mình nhập thêm người vào Ds Goc thì nó có tự động trích lọc thêm những người trùng đưa qua sheet trích lọc nữa không?
Có dùng trích lọc mà ko cần Code Macro được không, nếu không được thì hướng dẫn mình chạy code mỗi khi cập nhật danh sách góc! thêm cái nữa là thêm điều kiện là trùng luôn "diachi" tức lọc trùng 3 tiêu chí thì mới lấy. mong bạn thông cảm, thật sự mình cần lắm những yêu cầu như thế!
 

File đính kèm

Rất cảm ơn bạn Beta giải đáp, rất pro nhưng mình thì chẳng hiểu tí tẹo nào hết.hix
Nếu mình nhập thêm người vào Ds Goc thì nó có tự động trích lọc thêm những người trùng đưa qua sheet trích lọc nữa không?
Có dùng trích lọc mà ko cần Code Macro được không, nếu không được thì hướng dẫn mình chạy code mỗi khi cập nhật danh sách góc! thêm cái nữa là thêm điều kiện là trùng luôn "diachi" tức lọc trùng 3 tiêu chí thì mới lấy. mong bạn thông cảm, thật sự mình cần lắm những yêu cầu như thế!
Trong tay bạn đã có Code của Batê, bạn chỉ cần nhập dữ liệu vào Sheet DS Goc thỏa mãn tiêu chí cùng hotennamsinh thì sẽ có kết quả mong muốn ở DS Loc. Vậy thôi.
 
Rất cảm ơn bạn Beta giải đáp, rất pro nhưng mình thì chẳng hiểu tí tẹo nào hết.hix
Nếu mình nhập thêm người vào Ds Goc thì nó có tự động trích lọc thêm những người trùng đưa qua sheet trích lọc nữa không?
Có dùng trích lọc mà ko cần Code Macro được không, nếu không được thì hướng dẫn mình chạy code mỗi khi cập nhật danh sách góc! thêm cái nữa là thêm điều kiện là trùng luôn "diachi" tức lọc trùng 3 tiêu chí thì mới lấy. mong bạn thông cảm, thật sự mình cần lắm những yêu cầu như thế!

Dùng Advanced Filter cho nó khỏe! Làm bằng tay cũng được, mà viết thành code cũng ngắn gọn vầy thôi:
Mã:
Private Sub Worksheet_Activate()
  Dim wks As Worksheet
  Set wks = Worksheets("DS Goc")
  Range("A1:H1000").Clear
  wks.Range("IV2").Value = "=SUMPRODUCT(($B$2:$B$1000=$B2)*($C$2:$C$1000=$C2)*($E$2:$E$1000=$E2))>1"
  wks.Range("A1:H1000").AdvancedFilter 2, wks.Range("IV1:IV2"), Range("A1")
  wks.Range("IV1:IV2").Clear
End Sub
Xong!
Bạn làm gì bên sheet DS Goc cứ thây kệ, hể sang bên sheet LOC là dữ liệu sẽ tự cập nhất
(Bấm Alt + F11 để xem code)
 

File đính kèm

Rất cảm ơn bạn ndu96081631

, và những bạn đã giúp đỡ mình! và cho mình hỏi danh sách góc của mình chỉ là mẫu thôi, mai mốt mình đưa thêm vào danh sách góc 1 số lượng rất lớn lên tới "vài chục ngìn người", việc trích lọc vẫn không ảnh hường gì chứ?
 
Rất cảm ơn bạn ndu96081631

, và những bạn đã giúp đỡ mình! và cho mình hỏi danh sách góc của mình chỉ là mẫu thôi, mai mốt mình đưa thêm vào danh sách góc 1 số lượng rất lớn lên tới "vài chục ngìn người", việc trích lọc vẫn không ảnh hường gì chứ?

Cái đó phải thử mới biết bạn à!
 
Vâng để mình thử thay 1000 = 100000 coi nó có chạy tốt với danh sách vài chục ngàn người không, cảm ơn bạn nhiều lắm nhé!!!
 
File này mình từ topic về chủ đề là tách tỉnh, mình sửa lại 1 chút,nhưng có chỗ mình không bít sửa sao.
Bạn làm ơn giúp mình thêm chút nhé, cảm ơn bạn nhiều lắm!
Cái công thức LOOKUP(2,1/COUNTIF($A2,"*"&DMT&"*"),DMT)

Chỗ "*"&DMT&"*" DMT làm sao sửa được, lúc trước nó là danh mục tỉnh, bạn làm ơn chỉ mình cách sửa phù hợp với tên file giúp mình!
Chẳng hạn: LOOKUP(2,1/COUNTIF($A2,"*"&tenxa&"*"),tenxa) có được ko?
 

File đính kèm

File này mình từ topic về chủ đề là tách tỉnh, mình sửa lại 1 chút,nhưng có chỗ mình không bít sửa sao.
Bạn làm ơn giúp mình thêm chút nhé, cảm ơn bạn nhiều lắm!
Cái công thức LOOKUP(2,1/COUNTIF($A2,"*"&DMT&"*"),DMT)

Chỗ "*"&DMT&"*" DMT làm sao sửa được, lúc trước nó là danh mục tỉnh, bạn làm ơn chỉ mình cách sửa phù hợp với tên file giúp mình!
Chẳng hạn: LOOKUP(2,1/COUNTIF($A2,"*"&tenxa&"*"),tenxa) có được ko?

Thì bạn bấm Ctrl + F3, sửa DMT thành tenxa là xong chứ gì (công thức tự nó sẽ đổi theo)
 
Sao khó khăn nào bạn cũng làm được hết vậy, làm mình ngưỡng mộ bạn quá đi!
1 lần nữa cảm ơn bạn nhiều lắm!
 
Trích lọc rất tốt tới dòng 65.535 hihi, nếu số liệu nhiều hơn thì mình chuyển quá excel 2007, 2010 có được không bạn!
 

File đính kèm

Lần chỉnh sửa cuối:
Trích lọc rất tốt tới dòng 65.535 hihi, nếu số liệu nhiều hơn thì mình chuyển quá excel 2007, 2010 có được không bạn!

Với dữ liệu vài chục ngàn dòng thì không nên dùng Advanced Filter (tôi test tốc độ rất chậm)
Vậy bạn có 2 lựa chọn:
- Sửa lại code của anh Ba Tê (thêm 1 điều kiện nữa)
- Dùng code của tôi:
Mã:
Sub Main()
  Dim wksSrc As Worksheet, wksDes As Worksheet, Dic As Object
  Dim aSrc, arr, aPos()
  Dim aTmp(1 To 3) As String, tmp As String
  Dim lR As Long, lC As Long, n As Long, lEndCol As Long, lEndRow As Long
  On Error Resume Next
  Set wksSrc = Worksheets("DS Goc")
  Set wksDes = Worksheets("DS LOC")
  wksDes.Range("[COLOR=#006400]A2:H60000[/COLOR]").Clear
  Set Dic = CreateObject("Scripting.Dictionary")
  [COLOR=#ff0000]Dic.CompareMode = vbTextCompare[/COLOR]
  aSrc = wksSrc.Range("[COLOR=#006400]A2:H60000[/COLOR]")
  lEndRow = UBound(aSrc, 1): lEndCol = UBound(aSrc, 2)
  ReDim Preserve aSrc(1 To lEndRow, 1 To lEndCol + 1)
  For lR = 1 To lEndRow
    aTmp(1) = aSrc(lR, 2): aTmp(2) = aSrc(lR, 3): aTmp(3) = aSrc(lR, 5)
    tmp = Join(aTmp, "")
    If Len(tmp) Then
      tmp = Join(aTmp, vbBack)
      If Not Dic.Exists(tmp) Then
        Dic.Add tmp, lR
      Else
        n = n + 1
        aSrc(lR, lEndCol + 1) = 1
        If Dic.Item(tmp) > 0 Then
          aSrc(Dic.Item(tmp), lEndCol + 1) = 1
          Dic.Item(tmp) = 0
          n = n + 1
        End If
      End If
    End If
  Next
  If n Then
    ReDim arr(1 To n, 1 To lEndCol)
    n = 0
    For lR = 1 To lEndRow
      If aSrc(lR, lEndCol + 1) = 1 Then
        n = n + 1
        For lC = 1 To lEndCol
          arr(n, lC) = aSrc(lR, lC)
        Next
      End If
    Next
    With wksDes.Range("A2").Resize(n, lEndCol)
      .Value = arr
      .Borders.LineStyle = 1
    End With
  End If
End Sub
và code sửa kiện:
Mã:
[COLOR=#0000cd]Private Sub Worksheet_Activate()
  Main
End Sub[/COLOR]
Lưu ý:
- Chổ màu xanh lá là giới hạn dữ liệu. Hiện tôi đang thiết kế đến 60000 dòng, nếu nhiều hơn, bạn sửa lại chổ này nhé
- Code màu xanh là code sự kiện tại sheet DS LOC, nó sẽ tự động lọc khi bạn chuyển vào sheet DS LOC
- Nếu không thích tự động, có thể tạo 1 nút bấm, khi bấm vào thì code sẽ chạy (khi ấy ta xóa code màu xanh đi)
- Dòng màu đỏ phía trên vô cùng quan trọng: Có nó thì code sẽ không phân biệt HOA thường trong dữ liệu nhập và ngược lại
- Tôi chuyển luôn định dạng file thành xlsm luôn (dùng trên Excel 2007 hoặc 2010)
 

File đính kèm

Với dữ liệu vài chục ngàn dòng thì không nên dùng Advanced Filter (tôi test tốc độ rất chậm)
Vậy bạn có 2 lựa chọn:
- Sửa lại code của anh Ba Tê (thêm 1 điều kiện nữa)
- Dùng code của tôi:
Mã:
Sub Main()
  Dim wksSrc As Worksheet, wksDes As Worksheet, Dic As Object
  Dim aSrc, arr, aPos()
  Dim aTmp(1 To 3) As String, tmp As String
  Dim lR As Long, lC As Long, n As Long, lEndCol As Long, lEndRow As Long
  On Error Resume Next
  Set wksSrc = Worksheets("DS Goc")
  Set wksDes = Worksheets("DS LOC")
  wksDes.Range("[COLOR=#006400]A2:H60000[/COLOR]").Clear
  Set Dic = CreateObject("Scripting.Dictionary")
  [COLOR=#ff0000]Dic.CompareMode = vbTextCompare[/COLOR]
  aSrc = wksSrc.Range("[COLOR=#006400]A2:H60000[/COLOR]")
  lEndRow = UBound(aSrc, 1): lEndCol = UBound(aSrc, 2)
  ReDim Preserve aSrc(1 To lEndRow, 1 To lEndCol + 1)
  For lR = 1 To lEndRow
    aTmp(1) = aSrc(lR, 2): aTmp(2) = aSrc(lR, 3): aTmp(3) = aSrc(lR, 5)
    tmp = Join(aTmp, "")
    If Len(tmp) Then
      tmp = Join(aTmp, vbBack)
      If Not Dic.Exists(tmp) Then
        Dic.Add tmp, lR
      Else
        n = n + 1
        aSrc(lR, lEndCol + 1) = 1
        If Dic.Item(tmp) > 0 Then
          aSrc(Dic.Item(tmp), lEndCol + 1) = 1
          Dic.Item(tmp) = 0
          n = n + 1
        End If
      End If
    End If
  Next
  If n Then
    ReDim arr(1 To n, 1 To lEndCol)
    n = 0
    For lR = 1 To lEndRow
      If aSrc(lR, lEndCol + 1) = 1 Then
        n = n + 1
        For lC = 1 To lEndCol
          arr(n, lC) = aSrc(lR, lC)
        Next
      End If
    Next
    With wksDes.Range("A2").Resize(n, lEndCol)
      .Value = arr
      .Borders.LineStyle = 1
    End With
  End If
End Sub
và code sửa kiện:
Mã:
[COLOR=#0000cd]Private Sub Worksheet_Activate()
  Main
End Sub[/COLOR]
Lưu ý:
- Chổ màu xanh lá là giới hạn dữ liệu. Hiện tôi đang thiết kế đến 60000 dòng, nếu nhiều hơn, bạn sửa lại chổ này nhé
- Code màu xanh là code sự kiện tại sheet DS LOC, nó sẽ tự động lọc khi bạn chuyển vào sheet DS LOC
- Nếu không thích tự động, có thể tạo 1 nút bấm, khi bấm vào thì code sẽ chạy (khi ấy ta xóa code màu xanh đi)
- Dòng màu đỏ phía trên vô cùng quan trọng: Có nó thì code sẽ không phân biệt HOA thường trong dữ liệu nhập và ngược lại
- Tôi chuyển luôn định dạng file thành xlsm luôn (dùng trên Excel 2007 hoặc 2010)
"Rất hoàn hảo". Rất cảm ơn bạn đã tận tình giúp đỡ, chân thành cảm ơn!
 

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

Back
Top Bottom