Loại bỏ dữ kiệu trùng (1 người xem)

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

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

Kh Biet

Cánh hạc đầu đông
Tham gia
24/8/12
Bài viết
203
Được thích
429
Do dữ liệu lớn nên tìm để loại bỏ thông tin trùng là khó và gần như không thực hiện được băng thủ công . Mình nhờ các bạn giúp cho code để lọc duy nhất với điều kiện trùng cả 7 cột thì mới loại bỏ . Yêu cầu mình ghi trong file dính kèm . Xin cám ơn !
 

File đính kèm

Do dữ liệu lớn nên tìm để loại bỏ thông tin trùng là khó và gần như không thực hiện được băng thủ công . Mình nhờ các bạn giúp cho code để lọc duy nhất với điều kiện trùng cả 7 cột thì mới loại bỏ . Yêu cầu mình ghi trong file dính kèm . Xin cám ơn !

Dù là thủ công thì với công cụ Advanced Filter hoặc Remove Duplicate cũng có thể ra kết quả trong nháy mắt thôi
 
Do dữ liệu lớn nên tìm để loại bỏ thông tin trùng là khó và gần như không thực hiện được băng thủ công . Mình nhờ các bạn giúp cho code để lọc duy nhất với điều kiện trùng cả 7 cột thì mới loại bỏ . Yêu cầu mình ghi trong file dính kèm . Xin cám ơn !

Bạn làm thử cách thủ công này xem:
Tiêu đề cột có thay đổi, tôi hoán vị cột D và E.

- Chọn vùng C4:G39, sử dụng Conditional Formartting với Conditional1 chọn Formula Is, khung bên phải sử dụng hàm sau:

=COUNTIF($C$4:$G$39,C4)>1

Tiếp theo nhấn nút Format rồi chọn màu tùy ý.
- Cột K tôi dùng hàm để loại trừ, nhìn cột K Cell nào bằng không (0) thì xét tiếp (lưu ý: Tôi Sort theo trình tự cột C,D, E rồi mới dùng hàm ở cột K)..
- Đối với trường hợp không có năm sinh thì xem màu ở vị trí nào bị trùng lặp của cột C (Tên Liệt sĩ) rồi xét tiếp sang phải.
 

File đính kèm

Lần chỉnh sửa cuối:
Dù là thủ công thì với công cụ Advanced Filter hoặc Remove Duplicate cũng có thể ra kết quả trong nháy mắt thôi
Cám ơn thày ! do yêu cầu có thể trùng 6 cột dữ liệu vẫn được chấp nhận chỉ trừ khi cả 7 cột trùng dữ liệu mới loại nên nhà em thua, thày có thể chỉ cách làm cho nhà em được không ạ ? Điều thứ 2 là khi copy dữ liệu từ nơi khác đến dữ liệu trùng tự động bị loại và được sắp xếp theo số tt mới .
 
Bạn làm thử cách thủ công này xem:
Tiêu đề cột có thay đổi, tôi hoán vị cột D và E.

- Chọn vùng C4:G39, sử dụng Conditional Formartting với Conditional1 chọn Formula I, khung bên phải sử dụng hàm sau:

=COUNTIF($C$4:$G$39,C4)>1

Tiếp theo nhấn nút Format rồi chọn màu tùy ý.
- Cột K tôi dùng hàm để loại trừ, nhìn cột K Cell nào bằng không (0) thì xét tiếp (lưu ý: Tôi Sort theo trình tự cột C,D, E rồi mới dùng hàm ở cột K)..
- Đối với trường hợp không có năm sinh thì xem màu ở vị trí nào bị trùng lặp của cột C (Tên Liệt sĩ) rồi xét tiếp sang phải.
Thực ra ý mình là nếu chính thông tin của người đó bị nhập quá 1 lần thì tự động loại khỏi danh sách , bởi thông tin được sưu tầm từ nhiều nguồn và dữ liệu lớn nên cần loại trùng lặp . dữ liệu có thể trùng trên 6 cột vẫn được chấp nhận .
ví dụ : đầu tiên là cột tên, nếu lọc không thấy trùng thì chấp nhận ngay không cần xét đến các cột sau . Nếu thấy trùng thì lọc tiếp cột quê quán, nếu không thấy trùng thì chấp nhận ngay, nếu trùng thì lọc tiếp cột tiếp theo ...cho đến hết 7 cột . Nếu trùng cả 7 cột thì loại .
 
Lần chỉnh sửa cuối:
Mục đích tôi đưa thêm cột K là để kiểm tra, kiểm tra xong dùng Auto Filter chon 0 để xóa trùng lặp (vậy mới gọi là thủ công).
 
Tạo thêm 1 sheet mới là sheet ketqua. Chạy thử code sau:

[GPECODE=sql]Sub LayDL()
Dim cn As Object, rst As Object
Dim mySQL As String
Set cn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
.Open
End With
mySQL = ""
mySQL = "SELECT DISTINCT F2,"
mySQL = mySQL & " F3,"
mySQL = mySQL & " F4,"
mySQL = mySQL & " FORMAT(F5,'dd-MM-yyyy'),"
mySQL = mySQL & " F6,"
mySQL = mySQL & " F7,"
mySQL = mySQL & " F8"
mySQL = mySQL & " FROM ( "
mySQL = mySQL & " SELECT * "
mySQL = mySQL & " FROM [Sheet1$A4:H20]"
mySQL = mySQL & " Union ALL "
mySQL = mySQL & " SELECT * "
mySQL = mySQL & " FROM [Sheet2$A4:H22])"
Set rst = cn.Execute(mySQL)
With Sheets("ketqua")
.[A2:H1000].ClearContents
.[A2].CopyFromRecordset rst
End With
rst.Close: cn.Close
Set rst = Nothing: Set cn = Nothing
End Sub

[/GPECODE]
 

File đính kèm

Tạo thêm 1 sheet mới là sheet ketqua. Chạy thử code sau:

[GPECODE=sql]Sub LayDL()
Dim cn As Object, rst As Object
Dim mySQL As String
Set cn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
.Open
End With
mySQL = ""
mySQL = "SELECT DISTINCT F2,"
mySQL = mySQL & " F3,"
mySQL = mySQL & " F4,"
mySQL = mySQL & " FORMAT(F5,'dd-MM-yyyy'),"
mySQL = mySQL & " F6,"
mySQL = mySQL & " F7,"
mySQL = mySQL & " F8"
mySQL = mySQL & " FROM ( "
mySQL = mySQL & " SELECT * "
mySQL = mySQL & " FROM [Sheet1$A4:H20]"
mySQL = mySQL & " Union ALL "
mySQL = mySQL & " SELECT * "
mySQL = mySQL & " FROM [Sheet2$A4:H22])"
Set rst = cn.Execute(mySQL)
With Sheets("ketqua")
.[A2:H1000].ClearContents
.[A2].CopyFromRecordset rst
End With
rst.Close: cn.Close
Set rst = Nothing: Set cn = Nothing
End Sub

[/GPECODE]
Cám ơn thày! nếu lọc sang sheet mới thì dữ liệu ít thì không sao, dữ liệu lên hàng trăm nghìn dòng thì nhà em sợ file nặng, vả lại đây là phần dữ liệu nguồn để lọc theo tên hoặc theo địa phương xã, huyện, để tìm người thân còn thất lạc . Do vậy nhà em muốn chép dữ liệu mới vào sheet dũ liệu cũ thì loại dữ liệu trùng và lọc sang sheet khác theo tên hoặc theo xã theo yêu cầu của người tìm .
 
Lần chỉnh sửa cuối:
Cám ơn thày! nếu lọc sang sheet mới thì dữ liệu ít thì không sao, dữ liệu lên hàng trăm nghìn dòng thì nhà em sợ file nặng, vả lại đây là phần dữ liệu nguồn để lọc theo tên hoặc theo địa phương xã, huyện, để tìm người thân còn thất lạc . Do vậy nhà em muốn chép dữ liệu mới vào sheet dũ liệu cũ thì loại dữ liệu trùng và lọc sang sheet khác theo tên hoặc theo xã theo yêu cầu của người tìm .
Dùng Excel 2007 trở lên có chức năng loại bỏ dòng trùng, sẽ áp dụng được cho yêu cầu của bạn. Bạn thử nhé.
 
Thầy có thể hướng dẫn cụ thể không ạ ? Nhà em dùng // cả office 2010 mà không biết chức năng đó nằm ở đâu, cách sử dụng ?

Bạn xem clip sau nhé:

[video=youtube;5UL2cvVgmbA]https://www.youtube.com/watch?v=5UL2cvVgmbA&feature=youtu.be[/video]
 
Do dữ liệu lớn nên tìm để loại bỏ thông tin trùng là khó và gần như không thực hiện được băng thủ công . Mình nhờ các bạn giúp cho code để lọc duy nhất với điều kiện trùng cả 7 cột thì mới loại bỏ . Yêu cầu mình ghi trong file dính kèm . Xin cám ơn !
Mọi thứ có thể trùng nhưng vị trí mộ chỉ có 1, chỉ cần kiểm tra cột này là đủ. Nếu trùng thì xử dòng này, cần gì trùng tới 7 cột.
 
Lần chỉnh sửa cuối:
Mọi thứ có thể trùng nhưng vị trí mộ chỉ có 1, chỉ cần kiểm tra cột này là đủ. Nếu trùng thì xử dòng này, cần gì trùng tới 7 cột.

Tôi nhất trí phương án này, nên đề xuất tạo cột phụ và đặt cho nó 1 cái mã số cho mỗi vị trí mộ như sau:
- Bảng chữ cái là A, B, C thì ta có thể cho mã trình tự là 01, 02, 03 ...v...v...
Giả sử ở sheet 1, ta có TT số 13 là Bùi Văn Nhung, vị trí mộ là 3,A,29, nếu ta cho nó 1 mã số sẽ là 30129, giống như phương pháp tôi làm thủ công ở cột K, chỉ Sort và dùng hàm sau đó chọn 0 và Delete.

Hay là Kh Biet muốn khảo thêm về Code của một số thành viên khác thì tôi cũng hoan ngênh.
 
Dù là thủ công thì với công cụ Advanced Filter hoặc Remove Duplicate cũng có thể ra kết quả trong nháy mắt thôi

Viết hộ Bác code lọc bằng Advanced Filter bác thử xem (chạy code bằng cách nhấn vào "Cập nhật danh sách liệt sỹ")
Mã:
Sub LocLS()
    Application.ScreenUpdating = False
    On Error Resume Next
    ShTemp.Cells.Clear
    With Range("a3:h" & [b65536].End(3).Row)
        .AdvancedFilter Action:=xlFilterInPlace, Unique:=True
        .Copy ShTemp.[a3]
        ActiveSheet.ShowAllData
        .ClearContents
    End With
    With ShTemp
        .Range("b4:b" & .[b65536].End(3).Row).Offset(, -1) = Evaluate("=Row(R:R)")
        .[a3:h65000].Copy [a3]
    End With
End Sub
 

File đính kèm

Mọi thứ có thể trùng nhưng vị trí mộ chỉ có 1, chỉ cần kiểm tra cột này là đủ. Nếu trùng thì xử dòng này, cần gì trùng tới 7 cột.
Có nhiều người không có mộ bạn à ? Chẳng hạn người ta chỉ có dữ liệu" chết tại bệnh xá Trung đoàn ..." và có thể trùng số mộ vì như thày 2 lúa nói : tức là từ nhiều nghĩa trang .
 
do dữ liệu lớn nên tìm để loại bỏ thông tin trùng là khó và gần như không thực hiện được băng thủ công . Mình nhờ các bạn giúp cho code để lọc duy nhất với điều kiện trùng cả 7 cột thì mới loại bỏ . Yêu cầu mình ghi trong file dính kèm . Xin cám ơn !
dùng code này nếu bạn sử dụng excel2007 trở lên
PHP:
sub loc_dsls()
with sheet1
.range("a3:h65536").value = sheet2.range("a3:h65536").value
.range("a3:h65536").removeduplicates array(2, 3, 4, 5, 6, 7, 8), header:=xlyes
.range("a4:a" & .[a65536].end(3).row) = evaluate("=row(r:r)")
end with
end sub
 

File đính kèm

Lần chỉnh sửa cuối:
Viết hộ Bác code lọc bằng Advanced Filter bác thử xem (chạy code bằng cách nhấn vào "Cập nhật danh sách liệt sỹ")
Mã:
Sub LocLS()
    Application.ScreenUpdating = False
    On Error Resume Next
    ShTemp.Cells.Clear
    With Range("a3:h" & [b65536].End(3).Row)
        .AdvancedFilter Action:=xlFilterInPlace, Unique:=True
        .Copy ShTemp.[a3]
        ActiveSheet.ShowAllData
        .ClearContents
    End With
    With ShTemp
        .Range("b4:b" & .[b65536].End(3).Row).Offset(, -1) = Evaluate("=Row(R:R)")
        .[a3:h65000].Copy [a3]
    End With
End Sub
Bác Chính à ! nếu lọc duy nhất căn cứ vào một vài cột sẽ dẫn đến xóa cả dữ liệu cần : Ví dụ : một xã có thể rất nhiều người trùng họ, tên đi bộ đội cùng một ngày, cùng năm sinh sau đó về cùng đơn vị, cùng đánh một trận tại cùng một địa danh, cùng bị thương , nhưng một người hy sinh, một người còn sống nên dữ liệu trùng đến 5, 6 cột vẫn phải để . Chỉ loại trường hợp do dữ liệu sưu tập nhiều lần, nhiều nơi và do nhiều người tập hợp dẫn đến chính người đó được tập hợp nhiều lần thì loại bác ạ !
 
Bác Chính à ! nếu lọc duy nhất căn cứ vào một vài cột sẽ dẫn đến xóa cả dữ liệu cần : Ví dụ : một xã có thể rất nhiều người trùng họ, tên đi bộ đội cùng một ngày, cùng năm sinh sau đó về cùng đơn vị, cùng đánh một trận tại cùng một địa danh, cùng bị thương , nhưng một người hy sinh, một người còn sống nên dữ liệu trùng đến 5, 6 cột vẫn phải để . Chỉ loại trường hợp do dữ liệu sưu tập nhiều lần, nhiều nơi và do nhiều người tập hợp dẫn đến chính người đó được tập hợp nhiều lần thì loại bác ạ !
Vậy bài 11 đã đáp ứng yêu cầu của bạn chưa?
 
Cám ơn thày ! do yêu cầu có thể trùng 6 cột dữ liệu vẫn được chấp nhận chỉ trừ khi cả 7 cột trùng dữ liệu mới loại nên nhà em thua, thày có thể chỉ cách làm cho nhà em được không ạ ? Điều thứ 2 là khi copy dữ liệu từ nơi khác đến dữ liệu trùng tự động bị loại và được sắp xếp theo số tt mới .

Cái vụ Advanced Filter hoặc Remove Duplicate muốn áp dụng cho mấy cột mà chẳng được, tùy theo anh quét chọn dữ liệu nguồn thôi
----------------
Viết hộ Bác code lọc bằng Advanced Filter bác thử xem (chạy code bằng cách nhấn vào "Cập nhật danh sách liệt sỹ")
Mã:
Sub LocLS()
    Application.ScreenUpdating = False
    On Error Resume Next
    ShTemp.Cells.Clear
    With Range("[B][COLOR=#0000cd]a3[/COLOR][/B]:h" & [b65536].End(3).Row)[COLOR=#ff0000]
        .AdvancedFilter Action:=xlFilterInPlace, Unique:=True
     [/COLOR]   .Copy ShTemp.[a3]
        ActiveSheet.ShowAllData
        .ClearContents
    End With
    With ShTemp
        .Range("b4:b" & .[b65536].End(3).Row).Offset(, -1) = Evaluate("=Row(R:R)")
        .[a3:h65000].Copy [a3]
    End With
End Sub
Chỗ màu đỏ sao không là .AdvancedFilter xlFilterCopy, , ShTemp.[B3], True vậy anh? Tức lọc thẳng sang sheet mới luôn chứ đâu cần lọc tại chỗ rồi lại mất công copy
Thêm nữa: Chỗ màu xanh hình như không đúng??? Người ta chỉ lọc 7 cột thôi (cột STT không tính)
 
Web KT

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

Back
Top Bottom