Lọc dữ liệu không trùng

  • Thread starter Thread starter LikeIt
  • Ngày gửi Ngày gửi
Liên hệ QC

LikeIt

Thành viên tiêu biểu
Tham gia
16/6/06
Bài viết
415
Được thích
254
Nghề nghiệp
Others
Kính gửi các Anh Chị,

Các bác cho em hỏi, em có VD là hai cột có số liệu trùng nhau, hiện em đã làm được, nhưng em muốn số liệu ko trùng nhau nhảy ra một cột khác, có cách nào dùng công thức hoặc VBA để nhặt ra đc ko? vì hàng ngày em phải ktra các mã hàng khác nhau trong các mã hàng đã và đang sx.

Xin cảm ơn

NHT
 

File đính kèm

Kính gửi các Anh Chị,

Các bác cho em hỏi, em có VD là hai cột có số liệu trùng nhau, hiện em đã làm được, nhưng em muốn số liệu ko trùng nhau nhảy ra một cột khác, có cách nào dùng công thức hoặc VBA để nhặt ra đc ko? vì hàng ngày em phải ktra các mã hàng khác nhau trong các mã hàng đã và đang sx.

Xin cảm ơn

NHT


kiểm tra lại xem đúng không nha
 

File đính kèm

lọc theo hai điều kiện

Gửi anh chị trên diễn đàn giải pháp excel.
Nhờ hướng dẫn cách lọc dữ liệu theo hai điều kiện(viết code) đính kèm dữ liệu có 2 sheet : data,loc
điều kiện lọc là ở hai cột d và e
Cám ơn GPEX
 
Lần chỉnh sửa cuối:
Tham khảo thêm macro sau, nếu bạn có rất nhiều record cần xử lí

Kính gửi các Anh Chị, Em có VD là hai cột có số liệu trùng nhau, nhưng em muốn số liệu ko trùng nhau nhảy ra một cột khác, có cách nào dùng công thức hoặc VBA để nhặt ra đc ko? vì hàng ngày em phải ktra các mã hàng khác nhau trong các mã hàng đã và đang sx.

Xin cảm ơn

NHT
PHP:
Option Explicit
Sub FindAll()
 Dim lRs As Long, Ww As Long
 Dim sRng As Range, Rng As Range
 
 lRs = [a65500].End(xlUp).Row:          Application.ScreenUpdating = False
 Range([C2], Cells(lRs, 3)).Clear
 Set Rng = Range([B2], [b65500].End(xlUp))
 For Ww = 2 To lRs
    With Cells(Ww, 1)
        Set sRng = Union(Rng, Range(.Offset(1), Cells(lRs, 1)))
        If sRng.Find(what:=.Offset(), LookIn:=xlValues, lookat:=xlWhole) _
            Is Nothing Then
            [c65000].End(xlUp).Offset(1) = .Offset(, 1)
        End If
    End With
 Next Ww
End Sub
 
Macro:
PHP:
Sub aFilter()
Dim sh As Worksheet
Dim r1 As Range, r2 As Range, r3 As Range
Dim ar(), a3()
    On Error GoTo 1
    Set r1 = Application.InputBox(Prompt:="Chon o dau tien chua cot du lieu 1: ", Type:=8)
    Set r1 = Range(r1.Cells(1, 1), r1.Cells(1, 1).End(xlDown))
    
    Set r2 = Application.InputBox(Prompt:="Chon o dau tien chua cot du lieu 2: ", Type:=8)
    Set r2 = Range(r2.Cells(1, 1), r2.Cells(1, 1).End(xlDown))
    
    Set r3 = Application.InputBox(Prompt:="Chon o dau tien chua du lieu loc: ", Type:=8)
    ro1 = r1.Rows.Count
    ro2 = r2.Rows.Count
    
    Set r3 = r3.Resize(ro2, 1)
    
    '''r3.ClearContents
    
    ReDim a3(ro2)
    a3 = r3
    MsgBox r3.Rows.Count
    k = 0
    For i = 1 To ro2
        If r1.Find(What:=r2(i, 1), LookIn:=xlValues, Lookat:=xlWhole) Is Nothing Then
            k = k + 1
            a3(k, 1) = r2(i, 1)
        End If
    Next
    r3 = a3
1:
    Set r1 = Nothing
    Set r2 = Nothing
    Set r3 = Nothing
End Sub

-hvl-
 
Anh có thể làm cho em một cái macro về cái lọc đó ko? em cần để lọc vì hàng ngày phát sinh nhiều mã mới, em cần biết một cách nhanh nhất.

Cảm ơn Anh

Gửi bạn một cách dùng Hàm tự tạo Tuy chậm hơn so với Sub nhưng linh động hơn :

1/ Trích lọc không trùng trong cả 2 cột :
Function LocKhongTrung(Vung1 As Range, Vung2 As Range, ThuTu As Long) As Variant
Dim Rng As Range, Cell As Range, Dem As Long
Application.Calculation = xlCalculationManual
Set Rng = Union(Vung1, Vung2)
Dem = 1
LocKhongTrung = ""
For Each Cell In Rng
If WorksheetFunction.CountIf(Rng, Cell) = 1 Then
If Dem = ThuTu Then
LocKhongTrung = Cell
Exit Function
End If
Dem = Dem + 1
End If
Next
Set Rng = Nothing
Application.Calculation = xlCalculationAutomatic
End Function

2/ Trích lọc những giá trị không trung trong vùng2 so với vùng1. Hàm nay nhanh hơn hàm thứ nhất.

Function LocKhongTrung2(Vung1 As Range, Vung2 As Range, ThuTu As Long) As Variant
Dim Cell As Range, Dem As Long
Application.Calculation = xlCalculationManual
Dem = 1
LocKhongTrung2 = ""
For Each Cell In Vung2
If WorksheetFunction.CountIf(Vung1, Cell) = 0 Then
If Dem = ThuTu Then
LocKhongTrung2 = Cell
Exit Function
End If
Dem = Dem + 1
End If
Next
Application.Calculation = xlCalculationAutomatic
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
To HoangDanh :
  1. Trong Function không nên sử dụng Application.Calculation vì nếu có hàng trăm Cell có chứa hàm này thì việc set như vậy lại trở thành chậm
  2. Giải thuật rất hay, tuy nhiên dùng MATCH sẽ nhanh hơn COUNTIF rất nhiều.
Chúc vui.
 
Gửi anh chị trên diễn đàn giải pháp excel.
Nhờ hướng dẫn cách lọc dữ liệu theo hai điều kiện(viết code) đính kèm dữ liệu có 2 sheet : data,loc
điều kiện lọc là ở hai cột d và e
Cám ơn GPEX
tongquangtuyen có thể dùng macro ghi lại thao tác sủ dụng Advance Filter, sau đó chỉnh sửa chút xíu là xong ngay. Cái này đâu cần code gì phức tạp đâu?!
 
To HoangDanh :
  1. Trong Function không nên sử dụng Application.Calculation vì nếu có hàng trăm Cell có chứa hàm này thì việc set như vậy lại trở thành chậm
  2. Giải thuật rất hay, tuy nhiên dùng MATCH sẽ nhanh hơn COUNTIF rất nhiều.
Chúc vui.

Cái vụ Calculation thì do dữ liệu ít nên em chưa test nên chưa biết thế nào.

Còn dùng match thì em đã nghĩ đến, nhưng nó có hạn chế là phải thêm vào bẫy lỗi, làm cho code thêm rắc rối.

Với dữ liệu ít thì code trên là ok. Nếu dữ liệu nhiều thì em sẽ dùng thằng Find thay cho Match hay Countif.

Cảm ơn anh đã góp ý.
 
Cái vụ Calculation thì do dữ liệu ít nên em chưa test nên chưa biết thế nào.

Còn dùng match thì em đã nghĩ đến, nhưng nó có hạn chế là phải thêm vào bẫy lỗi, làm cho code thêm rắc rối.

Với dữ liệu ít thì code trên là ok. Nếu dữ liệu nhiều thì em sẽ dùng thằng Find thay cho Match hay Countif.

Cảm ơn anh đã góp ý.


Find chỉ tốt hơn trong trường hợp dữ liệu cần tìm không liên tục.
Còn ở đây ta phải phải quét tất cả các dòng dữ liệu, vì vậy mình nghĩ dùng Find không thích hợp.
Ở đây cho ta chọn lựa giữa Match và Countif để xét xem nó có tồn tại hay không?? Vì vậy dùng Match sẽ nhanh hơn (do không phải quét cả khối)
Còn việc bẫy lỗi thì đơn giản, VD như thếm hàm ISERROR nữa là tốt thôi mà. (Còn dễ hơn FIND chán:-=)

Chúc vui
 
Anh có thể làm cho em một cái macro về cái lọc đó ko? em cần để lọc vì hàng ngày phát sinh nhiều mã mới, em cần biết một cách nhanh nhất.

Cảm ơn Anh
Dùng đoạn code này xem thế nào (test thử thấy tốc độ chấp nhận được)
PHP:
Option Explicit
Dim Rng As Range, sRng As Range, aRng As Range, Clls As Range, Time_ As Double
Sub FindAll()
Range([c1], [c65535].End(xlUp)).Offset(1).ClearContents
Time_ = Timer: Application.ScreenUpdating = False
Set Rng = Range([a2], [a65535].End(xlUp)): Set aRng = Rng(1)
For Each Clls In Range([b2], [b65535].End(xlUp))
    With Clls
        Set sRng = Rng.Find(what:=.Value, After:=aRng, LookIn:=xlFormulas, lookAt:=1)
        If Not sRng Is Nothing Then
            Set aRng = sRng
        Else
            If [c65535].End(xlUp) <> .Value Then
                [c65535].End(xlUp).Offset(1) = .Value
            End If
        End If
    End With
Next
[d1] = "Total: = " & Timer - Time_
End Sub
 
kiểm tra lại xem đúng không nha

Anh boyxin có chút vấn đề đó ,khi em xoá một ô dử liệu nào bất kỳ ,thì kết quả nó ko dồn lên mà nó chỉ là số 0.
nếu em xoá dử liệu trong File anh thay thế bằng dử liệu khác thì nó ko cho ra kết quả
 

File đính kèm

Anh boyxin có chút vấn đề đó
  1. khi em xoá một ô dử liệu nào bất kỳ ,thì kết quả nó ko dồn lên mà nó chỉ là số 0.
  2. nếu em xoá dử liệu trong File anh thay thế bằng dử liệu khác thì nó ko cho ra kết quả
Về cả 2 vấn đề trên: Do để Calculation = Manual nên công thức không tự cập nhật
Điều chỉnh lại Calculation = Automatic (xem hình) thì hết bệnh ngay

attachment.php

(Nếu xóa dữ liệu thì chỉ có 1 số 0 xuất hiện thôi)​
----------------
Nếu không thích hiện lên số 0 trong kết quả:
Sửa công thức trong Name Loc trong Insert \ Name \ Define như sau​
PHP:
Loc =IF(COUNTIF(Data1,Data2)=0,IF(Data2=0,"",ROW(Data2)),"")
 

File đính kèm

  • Calculation.JPG
    Calculation.JPG
    34.8 KB · Đọc: 56
Web KT

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

Back
Top Bottom