Nhờ các bác giúp lọc tạo một danh sách mà dữ liệu trong đó không trùng nhau.

Liên hệ QC

anhnk441

Thành viên mới
Tham gia
24/4/10
Bài viết
18
Được thích
0
E có một danh sách khách hàng cột B, trong đó có nhiều khách hàng lập đi lập lại từ 2 đến nhiều hơn trong cột B.
Các bác giúp E tạo cách tạo một danh sách trong đó cột B một khách hàng chỉ xuất hiện một lần duy nhất. Ko xuất hiện hơn một lần.
Các bác xem giúp e file.
Bác nào có đoạn code giải quyết vấn đề
 

File đính kèm

E có một danh sách khách hàng cột B, trong đó có nhiều khách hàng lập đi lập lại từ 2 đến nhiều hơn trong cột B.
Các bác giúp E tạo cách tạo một danh sách trong đó cột B một khách hàng chỉ xuất hiện một lần duy nhất. Ko xuất hiện hơn một lần.
Các bác xem giúp e file.
Bác nào có đoạn code giải quyết vấn đề

Bạn gõ vào ô tìm kiếm từ khóa "LỌC DUY NHẤT" thử xem.
http://www.google.com.vn/search?dom...0&submit.y=0&sitesearch=www.giaiphapexcel.com
 
E có một danh sách khách hàng cột B, trong đó có nhiều khách hàng lập đi lập lại từ 2 đến nhiều hơn trong cột B.
Các bác giúp E tạo cách tạo một danh sách trong đó cột B một khách hàng chỉ xuất hiện một lần duy nhất. Ko xuất hiện hơn một lần.
Các bác xem giúp e file.
Bác nào có đoạn code giải quyết vấn đề

bạn gõ vào từ khóa "lọc giá trị duy nhất" bạn sẽ có rất nhiều kết qua.
các cthức sau dây thường thấy
E3=INDEX($B$3:$B$19,MATCH(0,COUNTIF($E$2:E2,$B$3:$B$19),0))---->kết thúc Ctrl shft enter (cthức mảng)
hoắc
Ẻ3=INDEX($B$3:$B$19,MATCH(0,INDEX(COUNTIF($E$2:E2,$B$3:$B$19),),0))---> enter bình thường

hoặc advance filter
 
Cảm ơn các bác E làm theo công thức, nhưng file nhỏ thì OK. file của E định làm có đến hơn 50 nghìn đòng. Và chậm quá ko thể xử lý được.
Mong các bác chỉ giáo.
 
Quan trọng là mục đích dữ liệu của bạn để làm gì. Bạn giả lập một dữ liệu với mục đích rõ ràng, còn chỉ để lọc duy nhất mỗi phần mã KH thì có rất nhiều cách, quan trọng là sau khi lọc xong bạn dùng nó vào mục đích gì, như vậy việc người giúp không mất công hỏi đi hỏi lại, làm lại nhiều lần mà chưa chắc đã đáp ứng nhu cầu của bạn.
 
Phải có mục đích thì với cần nhờ các bác chứ. Không mất thời gian của A, E. Có thể nói với một bản ds khá dài và bị trùng rất nhiều. E muốn tạo một DS chuẩn khi nào PS thêm KH mới chỉ cần pase thêm là có thể theo dõi và tính toán số lương hàng hoá tiêu thụ của KH đó.
 
Cảm ơn các bác E làm theo công thức, nhưng file nhỏ thì OK. file của E định làm có đến hơn 50 nghìn đòng. Và chậm quá ko thể xử lý được.
Mong các bác chỉ giáo.
Thử Sub này với khoảng 100.000 dòng với khoảng 50.000 khách hàng xem sao.
Dữ liệu sheet1, lọc DS duy nhất sang sheet2
PHP:
Sub GPE()
    Sheets("Sheet2").Select
    Sheets("Sheet1").Range("B2:B" & Sheets("Sheet1").[B1000000].End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, _
        CopyToRange:=Range("B3"), Unique:=True
End Sub
 
Lần chỉnh sửa cuối:
Hầu hết các vấn đề của các bạn nêu ra rất đơn giản. Nhưng vì các bạn luôn đòi hỏi "tự động", "bấm nút" cho nên chúng trờ nên phức tạp. Và cách giải quyết lại không uyển chuyển.

Đã thử qua Pivot Table chưa? nếu thử rồi mà không đạt yêu cầu thì tại sao?

Đừng nói là bạn có hơn chục ngàn khách hàng nhé. Nếu Công ty bạn thực sự giao dịch hàng chục ngàn khách hàng thì nên mướn ngay một quản lý có trình độ Excel cao cấp.
 
E có một danh sách khách hàng cột B, trong đó có nhiều khách hàng lập đi lập lại từ 2 đến nhiều hơn trong cột B.
Các bác giúp E tạo cách tạo một danh sách trong đó cột B một khách hàng chỉ xuất hiện một lần duy nhất. Ko xuất hiện hơn một lần.
Các bác xem giúp e file.
Bác nào có đoạn code giải quyết vấn đề

Chép đoạn mã sau vào 1 module . Chọn vùng cần lọc (có thể một hoặc nhiều hàng nhiều cột) rồi nín thở mà...RUN nhé
Mã:
Sub Filter1()
Set ar = Selection
    For i = 1 To ar.Rows.Count
        For j = 1 To ar.Columns.Count
            ar(i, j) = IIf(WorksheetFunction.CountIf(Range(ar(1, j), ar(i, j)), ar(i, j)) = 1, ar(i, j), "")
        Next
    Next
                            ar.Sort key1:=ar.Columns(1)
End Sub
 
Lần chỉnh sửa cuối:
Thử Sub này với khoảng 900.000 dòng xem sao.
Dữ liệu sheet1, lọc DS duy nhất sang sheet2
PHP:
Sub GPE()
    Sheets("Sheet2").Select
    Sheets("Sheet1").Range("B2:B" & Sheets("Sheet1").[B1000000].End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, _
        CopyToRange:=Range("B3"), Unique:=True
End Sub

hix Cái vụ 900.000 dòng em sợ Advanced filter không kham nổi : :-=
--> phải chuyến sang phương án khác như:
* Remove duplicate
* ADO : SELECT DISTINCT
* Scripting.Dictionary
 
Bác nghiên cứu
2 giải phap
1. Bác lọc sang 1 list mới luôn
2. Bác lọc trên list sẵn có
 

File đính kèm

hix Cái vụ 900.000 dòng em sợ Advanced filter không kham nổi : :-=
--> phải chuyến sang phương án khác như:
* Remove duplicate
* ADO : SELECT DISTINCT
* Scripting.Dictionary

Đúng là anh Bill cũng "Ba Xạo", nâng cấp EX2010 lên cả triệu dòng mà chẳng làm nên tích sự gì.
Khoảng 100.000 dòng dữ liệu không trùng là đã "chạy tét gồi"
 
Lần chỉnh sửa cuối:
Đúng là anh Bill cũng "Ba Xạo", nâng cấp EX2010 lên cả triệu dòng mà chẳng làm nên tích sự gì.
Khoảng 100.000 dòng dữ liệu không trùng là đã "chạy tét gồi"

Công cụ nào công việc ấy bạn 3T ơi.
Phải nhìn lại từ căn bản của vấn đề: hàng triệu dòng dữ liệu, hàng chục ngàn khoá (khách hàng); cỡ chuyên môn như SQL Server 2005 trở lên mới chịu nổi. Dẫu có dùng Access 2003 là hơi mệt rồi, nói chi Excel.

Vả lại nếu lâu lâu mới phải chạy một lần thì chạy 1 tiếng đồng hồ cũng chả chết ai.

Nhưng nếu phải chạy mỗi ngày thì lỗi tại thiết kế dữ liệu. Dân chuyên nghiệp gặp trường hợp này người ta thiết kế kiểu phân tán dữ liệu (partitioned). Trong phạm vi một máy tính, không ai làm việc với hàng triệu dữ liệu mỗi ngày! (Và tôi nhấn mạnh từ "không" ở trên.)

Làm việc với dữ liệu lớn bắt buộc phải dùng các hệ thống phần mềm và CSDL cao cấp.
 
Đúng là anh Bill cũng "Ba Xạo", nâng cấp EX2010 lên cả triệu dòng mà chẳng làm nên tích sự gì.
Khoảng 100.000 dòng dữ liệu không trùng là đã "chạy tét gồi"

Thì bác Bill cũng đã nâng cấp "đồ chơi" rồi còn gì hả anh!
Thay vì dùng Advanced Filter (đồ cũ), anh xài RemoveDuplicates (đồ mới) xem
Em thử nghiệm dữ liệu 1,000,000 dòng với 100,000 phần từ duy nhất, dùng RemoveDuplicates cho kết quả trong vòng 7s
Mã:
Sub GPE()
  Dim t As Double, wks1 As Worksheet, wks2 As Worksheet
  t = Timer
  Set wks1 = Worksheets("Sheet1")
  Set wks2 = Worksheets("Sheet2")
  wks2.Range("B2:B1000000").Value = wks1.Range("B2:B1000000").Value
  wks2.Range("B2:B1000000").RemoveDuplicates 1, xlYes
  MsgBox Format(Timer - t, "0.000")
End Sub
 
Cảm ơn Bạn nhiều, làm như đoạn code của Bạn là Ok. Bạn giúp Mình mở rộng vùng dữ liệu lên khoảng 100.000 dòng được ko.Mình sửa vào code đó của bạn ko chạy được, đoạn đó chỉ lọc khoảng 50 dòng thôi.
 
ADO chỉ được đến 65.536 dòng thôi bạn à.
Cái này cũng tùy trường hợp , em ví dụ như sau :

[GPECODE=vb]
Sub ADOTEST()
Dim cnn As Object, rst As Object
Set cnn = CreateObject("ADODB.connection")
Set rst = CreateObject("ADODB.recordset")
With cnn
.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data source=" & ThisWorkbook.FullName & _
";Extended properties=""Excel 12.0;HDR=no;IMEX=1;"";"
.Open
End With
rst.Open "SELECT DISTINCT TOP 1000000 * FROM [A1:A1048576]", cnn
[B1].CopyFromRecordset rst
rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
file test xlsm của em nặng quá ( gần 2,5M không gửi được ) --> em miêu tả qua như sau :
* tạo cột A có số từ 1 đến 1048576 , rồi chạy code --> em thấy nó vẫn lấy hết và lọc duy nhất đuợc từ 1 đến hết !
 
Cái này cũng tùy trường hợp , em ví dụ như sau :

[GPECODE=vb]
Sub ADOTEST()
Dim cnn As Object, rst As Object
Set cnn = CreateObject("ADODB.connection")
Set rst = CreateObject("ADODB.recordset")
With cnn
.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data source=" & ThisWorkbook.FullName & _
";Extended properties=""Excel 12.0;HDR=no;IMEX=1;"";"
.Open
End With
rst.Open "SELECT DISTINCT TOP 1000000 * FROM [A1:A1048576]", cnn
[B1].CopyFromRecordset rst
rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
file test xlsm của em nặng quá ( gần 2,5M không gửi được ) --> em miêu tả qua như sau :
* tạo cột A có số từ 1 đến 1048576 , rồi chạy code --> em thấy nó vẫn lấy hết và lọc duy nhất đuợc từ 1 đến hết !
Mình muốn thêm điều kiện loại bỏ dòng trống thì thêm điều kiện như thế nào vậy anh
 
Web KT

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

Back
Top Bottom