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

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

Vậy thử code này xem sao, hơi tà đạo tí
PHP:
Sub copy_khongtrung()
Dim Dulieu(), i, j
Sheet2.Range(Sheet2.[A4], Sheet2.[A65536].End(3)).Resize(, 8).Copy
With Sheet1
   .[A65536].End(3).Offset(1).PasteSpecial 1
   Dulieu = .Range(.[A4], .[A65536].End(3)).Resize(, 9).Value
   For i = 1 To UBound(Dulieu)
      For j = 2 To 8
         Dulieu(i, 9) = Dulieu(i, 9) & Dulieu(i, j)
      Next
   Next
   .[A4].Resize(i - 1, 9) = Dulieu
   .[A4].Resize(i - 1, 9).RemoveDuplicates 9
   .[I4].Resize(i - 1).Clear
End With
End Sub
 
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
----------------

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)

Cảm ơn Ndu!
.AdvancedFilter xlFilterCopy, , ShTemp.[B3], True - mình không nghĩ ra. Còn vụ ".a3" màu xanh chắc chắn chứ không phải "hình như" không đúng và cách khắc phục là xoá STT trước khi lọc.

Vậy xin sửa lại như sau:
Mã:
Sub LocLS()
    Application.ScreenUpdating = False
    On Error Resume Next
    [a4:a65000].ClearContents
    ShTemp.Cells.Clear
    With Range("a3:h" & [b65536].End(3).Row)
        .AdvancedFilter xlFilterCopy, , ShTemp.[a3], True
        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 Kh biet Code này lọc tất cả các cột mà bác. Bác thử copy dữ liệu paste tiếp vào Sheet1 rồi chạy code thử xem.
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn Ndu!
.AdvancedFilter xlFilterCopy, , ShTemp.[B3], True - mình không nghĩ ra. Còn vụ ".a3" màu xanh chắc chắn chứ không phải "hình như" không đúng và cách khắc phục là xoá STT trước khi lọc.

Vậy xin sửa lại như sau:
Mã:
Sub LocLS()
    Application.ScreenUpdating = False
    On Error Resume Next
    [a4:a65000].ClearContents
    ShTemp.Cells.Clear
    With Range("a3:h" & [b65536].End(3).Row)
        .AdvancedFilter xlFilterCopy, , ShTemp.[a3], True
        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 Kh biet Code này lọc tất cả các cột mà bác. Bác thử copy dữ liệu paste tiếp vào Sheet1 rồi chạy code thử xem.
Cám ơn các thày và các bạn đã quan tâm . Chiều mình đi vắng chút nên phúc đáp chậm, mình sẽ text thử với dữ liệu thực ( do nhiều quá mình cắt bớt ) . Nếu vướng mình xin hỏi lại sau . Mình muốn text thử theo gợi ý của thày NDU và hướng dẫn của thày Hai Lúa Remove Duplicate mà cái office 2010 của mình nó lỗi , chán quá,
 
Lần chỉnh sửa cuối:
Cám ơn các thày và các bạn đã quan tâm . Chiều mình đi vắng chút nên phúc đáp chậm, mình sẽ text thử với dữ liệu thực ( do nhiều quá mình cắt bớt ) . Nếu vướng mình xin hỏi lại sau . Mình muốn text thử theo gợi ý của thày NDU và hướng dẫn của thày Hai Lúa Remove Duplicate mà cái office 2010 của mình nó lỗi , chán quá,

Lỗi như thế nào vậy bạn? Lưu ý là trong vùng dữ liệu của bạn không được trộn ô nhé.
 
Vậy xin sửa lại như sau:
Mã:
Sub LocLS()
    Application.ScreenUpdating = False
    On Error Resume Next
    [a4:a65000].ClearContents
    ShTemp.Cells.Clear
    With Range("[COLOR=#ff0000]a3[/COLOR]:h" & [b65536].End(3).Row)
        .AdvancedFilter xlFilterCopy, , ShTemp.[a3], True
        [COLOR=#ff0000]ActiveSheet.ShowAllData[/COLOR]
        .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
Hình như cũng còn vài chỗ chưa ổn anh à!
 
Hình như cũng còn vài chỗ chưa ổn anh à!
Đúng là không lọc thẳng thì sao phải ActiveSheet.ShowAllData (câu này thừa quên chưa xóa)
Còn vụ a3 trong
With Range("a3:h" & [b65536].End(3).Row) là để Copy tên cột vì bên trên mình dùng câu lệnh ShTemp.Cells.Clear

Không biết đã hết lỗi chưa ?
 
Đúng là không lọc thẳng thì sao phải ActiveSheet.ShowAllData (câu này thừa quên chưa xóa)
Còn vụ a3 trong
With Range("a3:h" & [b65536].End(3).Row) là để Copy tên cột vì bên trên mình dùng câu lệnh ShTemp.Cells.Clear

Không biết đã hết lỗi chưa ?
Tôi có chút việc chưa text với dữ liệu thực anh à . Mới text code của Bác Lê duy Thương và Quang Hải giảm đi được 71 tên trùng . Xin cám ơn tất cả các thày và các bạn .
 
Lần chỉnh sửa cuối:
Vậy bài 11 đã đáp ứng yêu cầu của bạn chưa?
Bây giờ nhà em mới sử lý xong office và làm theo hướng dẫn của thầy và nhận ra rằng có những điều thật đơn giản, nhưng không có thày chỉ thì vẫn không làm được . Xin cám ơn thày và tất cả các bạn .
 

Còn vụ a3 trong
With Range("a3:h" & [b65536].End(3).Row) là để Copy tên cột vì bên trên mình dùng câu lệnh ShTemp.Cells.Clear

Không biết đã hết lỗi chưa ?

Ah! Ý em là nên lấy từ cột B mới đúng chứ. Anh lấy cột A hóa ra lấy luôn STT?
 
Ah! Ý em là nên lấy từ cột B mới đúng chứ. Anh lấy cột A hóa ra lấy luôn STT?

Đúng là mình định lấy STT nhưng chỉ lấy tên cột thôi còn STT mình đã xóa trước rồi. Nhưng nghĩ lại thì chỉ cần lọc từ cột B rồi paste vào cột B của ShTemp là được.

... Bã xã "lão"Thay bị xuất huyết não anh à ! anh gọi động viên "lão"tý ĐT:0912087679...

Tôi vừa gọi điện cho Bác Thay, tình hình là Bác gái đã đỡ, đang tập đi lại, cầu chúc cho bác gái sớm bình phục.
 
Lần chỉnh sửa cuối:
Đúng là không lọc thẳng thì sao phải ActiveSheet.ShowAllData (câu này thừa quên chưa xóa)
Còn vụ a3 trong
With Range("a3:h" & [b65536].End(3).Row) là để Copy tên cột vì bên trên mình dùng câu lệnh ShTemp.Cells.Clear

Không biết đã hết lỗi chưa ?
Dữ liệu giả định thì code chạy tốt anh Chính à ! Nhưng tôi chép vào dữ liệu chính thì lỗi tôi không sửa code của anh được vì sheet 2 của tôi còn lọc tên hoặc địa danh nữa , mà code của anh tôi tôi không thấy có tên sheet nên không biết cách sửa . Để làm đến cùng thì anh chọn "Danh sách 30000 liệt sĩ tại các Nghĩa trang từ Quảng trị trở vào " và giúp tôi để tôi học các anh về kiến thức VBA luôn .
 
Dữ liệu giả định thì code chạy tốt anh Chính à ! Nhưng tôi chép vào dữ liệu chính thì lỗi tôi không sửa code của anh được vì sheet 2 của tôi còn lọc tên hoặc địa danh nữa , mà code của anh tôi tôi không thấy có tên sheet nên không biết cách sửa . Để làm đến cùng thì anh chọn "Danh sách 30000 liệt sĩ tại các Nghĩa trang từ Quảng trị trở vào " và giúp tôi để tôi học các anh về kiến thức VBA luôn .

Trong code trên thừa 1 dòng lệnh như Ndu đã nói nhưng không ảnh hưởng gì đến kết quả và tốc độ.

Tôi đã dowload danh sách 30.000 liệt sỹ chạy thử không thấy có lỗi gì. Kết quả trùng chưa kiểm tra kỹ nhưng về số lượng danh sách gốc là 30.337 sau khi lọc là 30.270 (giảm 67 người) không hiểu vì sao không up file lên được.

Code tôi viết theo yêu cầu của Bác là chép dữ liệu vào Sheet1 và lọc không trùng tại 7 cột không liên quan gì đến sheet khác.

Do đề phòng người dùng đổi tên sheet nên tôi đã đổi code name Sheet1 là ShDaTa và code name Sheet3 là ShTemp (sheet này là sheet trung gian nên ẩn đi) để viết code theo code name Sheet.

Lưu ý không được xóa Sheet1 Sheet3 còn việc đổi tên sheet1, sheet3 hoặc thêm bớt các sheet khác tùy ý.

Với Sheet2 hiện nay tôi chưa động tới, nếu bác có yêu cầu gì thêm thì cứ đưa lên, khả năng đến đâu tôi sẽ giúp đến đó.
 
Lần chỉnh sửa cuối:
Trong code trên thừa 1 dòng lệnh như Ndu đã nói nhưng không ảnh hưởng gì đến kết quả và tốc độ.

Tôi đã dowload danh sách 30.000 liệt sỹ chạy thử không thấy có lỗi gì. Kết quả trùng chưa kiểm tra kỹ nhưng về số lượng danh sách gốc là 30.337 sau khi lọc là 30.270 (giảm 67 người) không hiểu vì sao không up file lên được.

Code tôi viết theo yêu cầu của Bác là chép dữ liệu vào Sheet1 và lọc không trùng tại 7 cột không liên quan gì đến sheet khác.

Do đề phòng người dùng đổi tên sheet nên tôi đã đổi code name Sheet1 là ShDaTa và code name Sheet3 là ShTemp (sheet này là sheet trung gian nên ẩn đi) để viết code theo code name Sheet.

Lưu ý không được xóa Sheet1 Sheet3 còn việc đổi tên sheet1, sheet3 hoặc thêm bớt các sheet khác tùy ý.

Với Sheet2 hiện nay tôi chưa động tới, nếu bác có yêu cầu gì thêm thì cứ đưa lên, khả năng đến đâu tôi sẽ giúp đến đó.
Thế tôt rồi anh Chính ! Cám ơn anh . Vậy anh thức suốt đêm để làm à ? Anh làm tôi ngại quá . Vì vừa rồi có bạn Phuc_USC ở Gia lai thấy chủ đề có up lên danh sách liệt sĩ ở Nghĩa trang liệt sí Gia lai, nên nếu bạn ở nơi khác up lên nữa mình sợ trùng nên mới tính đến kiểm tra trùng . Thôi thì mình có tâm, còn tác dụng đến đâu, có ai tìm được người thân không ? còn nhờ may rủi nữa . Lần trước tôi vào các trang liệt sĩ trên Google tìm mờ cả mắt hàng tháng trời mới nghĩ giúp bạn đọc tiết kiệm thời gian bằng cách này . Họ chỉ cần nhập tên , hoặc xã Enter một cái, người thân có trong số 30000 này sẽ hiện ra . Không thì đi làm việc khác . Chứ ngồi dò hết danh sách , biết đến bao giờ . Thôi thì tôi nhờ các anh giúp vì bạn bè, vì đồng đội và vì một thời không thể quên : "Những con người mãi mãi tuổi hai mươi " ấy còn đang tha hương sứ người, nếu họ nhờ chúng ta mà về được quê hương, về được với gia đình thì mình bỏ chút sưc cũng đáng lắm anh ạ ! tôi đã từng gặp những người mẹ cả đời chờ con trong vô vọng, cứ nghĩ đến đã thấy mủi lòng ! Cám ơn anh .
 
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
Từ hôm trước, biết rằng không phải tự dưng Thày nói vậy, nhưng do nhận thức về công dụng của chức năng Advanced Filter chưa hết nên nhà em cứ phân vân mãi . Lâu rồi "ngộ" ra vấn đề và cố gắng thực hiện nó trong "2 nháy mắt" . Cám ơn thày ! lần này học thêm được mấy "chiêu" be bé của các thày và các bạn, cũng thấy hay lắm !
 
... Họ chỉ cần nhập tên , hoặc xã Enter một cái, người thân có trong số 30000 này sẽ hiện ra . Không thì đi làm việc khác . Chứ ngồi dò hết danh sách , biết đến bao giờ...

Tâm nguyện của Bác thật đáng trân trọng nhưng tôi thấy còn khá nhiều việc phải làm.

Trước hết là dữ liệu nguồn còn rất luộm thuộm nên phải làm trước một số việc để thống nhất dữ liệu trước khi lọc như:
- Font;
- Chữ hoa, chữ thường;
- Xóa ký tự trắng thừa;
- Xóa ký tự Chr(10) do xuống dòng bằng Alt + Enter (cái này phải dùng VBA);
- Thống nhất ký tự phân cách ("," ; "-" ; "/"...) trong quê quán; tỉnh, thành phố...
....vv...vv...
 
Lần chỉnh sửa cuối:
Tâm nguyện của Bác thật đáng trân trọng nhưng tôi thấy còn khá nhiều việc phải làm.

Trước hết là dữ liệu nguồn còn rất luộm thuộm nên phải làm trước một số việc để thống nhất dữ liệu trước khi lọc như:
- Font;
- Chữ hoa, chữ thường;
- Xóa ký tự trắng thừa;
- Xóa ký tự Chr(10) do xuống dòng bằng Alt + Enter (cái này phải dùng VBA);
- Thống nhất ký tự phân cách ("," ; "-" ; "/"...) trong quê quán; tỉnh, thành phố...
....vv...vv...
Đúng thế anh Chính ! Tôi lang thang trên mạng, cái cần tìm không thấy . Lũ bạn học ngày xưa, Anh em trong họ, ngoài làng chẳng thấy ai, nhưng nếu nghi vấn là dữ liệu mới thì tải về, so sánh xem có đúng là mình chưa có không ? nếu đúng thì bắt đầu xem xét để cắt, xén đưa chúng về theo khuôn mẫu của mình rồi up thêm lên thay tệp cũ . Vì dữ liệu hổ lốn của tất cả các trang khác nhau khi tải về nên việc tách chúng rồi dồn theo ý mình cũng mất khối thời gian . Trước riêng việc so sánh dữ liệu đã quá ngán rồi ( giờ nhờ các anh nên chắc đỡ cực hơn ) . các ký tự kèm theo thông tin thì mỗi chỗ dùng mỗi khác ( Dạo này tôi cũng cố vận dụng kiến thức của diễn đàn để cắt các ký tự thừa, như hàm tự tạo tách tên, trim, clean ... Nhưng cái cần là nội dung thông tin anh ạ : Nếu đúng họ tên , ngày sinh, quê quán, nơi hy sinh... thì bản thân người tìm thông tin phải xác minh lại chứ . Nhiều lúc nghĩ mình không biết mình làm cái việc "vô bổ" mà mệt người này có nên không nhỉ ?! Nhưng sau nghĩ có thể có người cần thì lại thôi , cố một tý vậy ! Mình nhớ có lần có bạn trên diễn đàn mở topic khai báo thông tin, tuổi tác để dễ xưng hô trên diễn đàn, mình khai :"Cái này hay, mình mới ...ngoài sáu mươi ." thế là người ta tá hỏa chạy chí chết ! Không biết tay này học VBA để sang "bên kia" sao ? Có thể "bên ấy " chắc gì đã có VBA nên trước mắt cứ cố học cái đã ! Nói chung tôi sẽ cố gắng cho dữ liệu chỉnh chu hơn . Kể hơi lan man, thôi chào anh nhé!
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom