Lọc danh sách duy nhất trong 1 bảng (1 người xem)

Liên hệ QC

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

hoangminhtien

Thành viên gắn bó
Tham gia
29/2/08
Bài viết
1,685
Được thích
2,227
Nghề nghiệp
Mechanical Engineering
Em có danh sách trong 1 bảng, em muốn lọc lấy dữ liệu duy nhất trong bảng này vào 1 cột. ví dụ cụ thể em đã đề cập trong file, nhờ các anh chị em giúp.
Chân thành cảm ơn
 

File đính kèm

đây là 1 bài của anh NDU na ná giống cái mà bạn cần
 

File đính kèm

File đính kèm

Em có danh sách trong 1 bảng, em muốn lọc lấy dữ liệu duy nhất trong bảng này vào 1 cột. ví dụ cụ thể em đã đề cập trong file, nhờ các anh chị em giúp.
Chân thành cảm ơn

File của bạn đây
Mã:
Sub LocDuyNhat_Bang()
    On Error Resume Next
    Range([l9], [l65000]).ClearContents
    Set Dic = CreateObject("Scripting.Dictionary")
    For Each cls In Range([d5], [i50]).SpecialCells(2)
        If Not IsEmpty(cls) Then
            Dic.Add cls.Value, ""
        End If
    Next
    [l9].Resize(Dic.Count) = Application.Transpose(Dic.keys)
    [l9].Resize(Dic.Count).Sort [l9], 1
End Sub
 

File đính kèm

File của bạn đây
Mã:
Sub LocDuyNhat_Bang()
    On Error Resume Next
    Range([l9], [l65000]).ClearContents
    Set Dic = CreateObject("Scripting.Dictionary")
    For Each cls In Range([d5], [i50]).SpecialCells(2)
        If Not IsEmpty(cls) Then
            Dic.Add cls.Value, ""
        End If
    Next
    [l9].Resize(Dic.Count) = Application.Transpose(Dic.keys)
    [l9].Resize(Dic.Count).Sort [l9], 1
End Sub
Chào anh!
Em nghĩ anh nên dùng phương pháp xử lý mảng như nmhung49 đã làm mới là phương pháp tối ưu về mặt tốc độ
Tuy nhiên, cả anh và nmhung49 đều dùng TRANSPOSE... Cũng tốt vì code gọn, nhưng em không nghĩ đây là cách hay ---> Ở 1 mức giới hạn nào đó (về độ lớn của dữ liệu), giải thuật dùng TRANSPOSE sẽ bị "phá sản" toàn bộ
 
Mình thấy Hàm UDF của nmHung49 cũng có thể viết thành:

Mã:
Public Function UniqueList(ByVal rng As Range, Id As Long)
 Dim sArr, Arr(), item, dic, i
  If rng.Count = 1 Then UniqueList = rng.Value: Exit Function
   Set dic = CreateObject("Scripting.Dictionary")
    sArr = rng.Value
    For Each item In sArr
      If Not IsEmpty(item) And Not dic.exists(item) Then
      i = i + 1
        If i = Id Then
       UniqueList = item
      Exit Function
     Else
    dic.Add item, ""
  End If: End If
   Next item
 UniqueList = ""
End Function

Khi lấy DS ta nhập công thức rồi chép xuống thoải mái:

=uniquelist($D$5:$I$17,ROW(1:1))

Như vậy, đỡ phải xác định độ dài mảng tránh lỗi trong DS. Mình chỉ mượn dic tìm đến Item mình cần là "biến".
 
Cám ơn tất cả các bác. Tuy nhiên có thể dùng công thức cho trường hợp này được không? nhờ các bác giúp đỡ.
 
Ko tạo hàm dc

chào bạn, mình thấy code tạo cột từ bảng của bạn hay quá nhưng ko sao tạo dc hàm. Bạn vui lòng xem giúp mình sai chỗ nào trong file đính kèm nhé. Cảm ơn bạn.
Thân ái,
 

File đính kèm

Cám ơn tất cả các bác. Tuy nhiên có thể dùng công thức cho trường hợp này được không? nhờ các bác giúp đỡ.
Nếu dùng cột phụ song song với cột kết quả có được không? (Tức là cột phụ có số ròng tương đương cột chính)
 
Bạn xem thử file này.
giả thiết là mảng có số ròng và cột là 2 chữ số nhé
Mình mở file lên thấy chỉ có chữ "A" không mà bạn. Mình theo yêu cầu của bạn Hoangminhtien thì bài 2 đã có đáp áp rồi thì phải dùng cột phụ sao đó dùng công thứ lộc duy nhất ra là được. Nếu không dùng cột phụ thì làm sao để được kết quả theo yêu cầu của bạn Tiến??? Cái đó mới rắc rối
 
Mình mở file lên thấy chỉ có chữ "A" không mà bạn. Mình theo yêu cầu của bạn Hoangminhtien thì bài 2 đã có đáp áp rồi thì phải dùng cột phụ sao đó dùng công thứ lộc duy nhất ra là được. Nếu không dùng cột phụ thì làm sao để được kết quả theo yêu cầu của bạn Tiến??? Cái đó mới rắc rối
không hiểu !!!!
Mình đưa ảnh lên cho bạn coi
loc.JPG
 
Mình mở file lên thấy chỉ có chữ "A" không mà bạn. Mình theo yêu cầu của bạn Hoangminhtien thì bài 2 đã có đáp áp rồi thì phải dùng cột phụ sao đó dùng công thứ lộc duy nhất ra là được. Nếu không dùng cột phụ thì làm sao để được kết quả theo yêu cầu của bạn Tiến??? Cái đó mới rắc rối
Đây là cách sắp xếp duy nhất từ bảng không dùng cột phụ.
Excel 2007 trở lên mới coi được thui.
 

File đính kèm

Mình không biết máy mình có bị gì không nhưng mở lên vẫn vậy toàn chữ "A" không hà lạ thiệt đó
Win XP và Office 2007 của mình đều là công ty mua bản quyền và update thường xuyên, chắc không có gì đặc biệt.
 
Mình không biết máy mình có bị gì không nhưng mở lên vẫn vậy toàn chữ "A" không hà lạ thiệt đó
Vụ này gặp hoài, cũng chẳng biết tại sao nhưng chắc chắn rằng trường hợp này thường xãy ra đối với những công thức quá phức tạp
 
Vụ này gặp hoài, cũng chẳng biết tại sao nhưng chắc chắn rằng trường hợp này thường xãy ra đối với những công thức quá phức tạp
Anh xem lại file này, Công thức đâu có quá phức tạp đâu.
(đã rút gọn hết khả năng)
 

File đính kèm

Lần chỉnh sửa cuối:
Anh xem lại file này, Công thức đâu có quá phức tạp đâu.
(đã rút gọn hết khả năng)
Cái đó không đoán trước được! Nói chung là những công thức mảng như bạn vừa làm luôn có những lỗi kỳ lạ (người xem được còn người ta thì lại không)
Tôi dùng Office 2010, đương nhiên xem được kết quả bình thường rồi
------------------
Ẹc... Ẹc... Bài này mà làm cho dữ liệu 1000 dòng chắc phải đi tò le quá
 
Cái đó không đoán trước được! Nói chung là những công thức mảng như bạn vừa làm luôn có những lỗi kỳ lạ (người xem được còn người ta thì lại không)
Tôi dùng Office 2010, đương nhiên xem được kết quả bình thường rồi
------------------
Ẹc... Ẹc... Bài này mà làm cho dữ liệu 1000 dòng chắc phải đi tò le quá
Anh ơi!
Em làm để biết khả năng của EX đến đâu thôi, và em nghĩ Minh Tiến cũng có ý như vậy.
Mấy cái hàm tự tạo bên trên đã ok rồi còn gì.
 
Anh xem lại file này, Công thức đâu có quá phức tạp đâu.
(đã rút gọn hết khả năng)
Mới mở file ra thì thấy kết quả ok, nhưng lật đi lật lại qua màn hình khác qoay lại trở về thì ra kết quả toàn chử "A" không à công thức thì vẩn thế này
Mã:
=IF(OR(H2="";ISERROR(INDEX(DS;--LEFT(RIGHT(rg;4);2);--RIGHT(rg;2))));"";INDEX(DS;--LEFT(RIGHT(rg;4);2);--RIGHT(rg;2)))
bấm phỉm tổ hợp ctrl + shift+enter thì ra công thức này
Mã:
=INDEX(DS;--LEFT(RIGHT(rg;4);2);--RIGHT(rg;2))
hihihi không hiểu vì sao?. mình dùng win7 office 2007
 
File của bạn đây
Mã:
Sub LocDuyNhat_Bang()
    On Error Resume Next
    Range([l9], [l65000]).ClearContents
    Set Dic = CreateObject("Scripting.Dictionary")
    For Each cls In Range([d5], [i50]).SpecialCells(2)
        If Not IsEmpty(cls) Then
            Dic.Add cls.Value, ""
        End If
    Next
    [l9].Resize(Dic.Count) = Application.Transpose(Dic.keys)
    [l9].Resize(Dic.Count).Sort [l9], 1
End Sub

Để tránh bị hiện tượng do thừa khoảng trắng nên nó hiểu là có 2 chữ b thì ta phải sửa thêm (tựa như cho thêm hàm Trim vào ấy, tôi đoán vậy thôi chứ tôi chưa thạo cái này lắm) thì viết thế nào hả các pác?

Cái nữa là tôi xóa bớt thành phần .SpecialCells(2) đi thì thấy nó vẫn chạy được bình thường mà, vậy tại sao lại phải cần thiết cho nó vào để làm gì?

Cái thành phần Application.Transpose(Dic.keys) là gì, quả thực trình độ của tôi hơi khó hình dung cái này.

Xin được nhờ trợ giúp cho.
 
Lần chỉnh sửa cuối:
Tôi thắc mắc là khi bỏ .Transpose thì kết quả của nó là a, a, a, a nhỉ? Rất mong bác nào biết về hàm Transpose này trong VBA xin chỉ bảo giúp tôi với.
 
Tôi thắc mắc là khi bỏ .Transpose thì kết quả của nó là a, a, a, a nhỉ? Rất mong bác nào biết về hàm Transpose này trong VBA xin chỉ bảo giúp tôi với.

Một cách dễ hiểu là khi xài Transpose, nó sẽ xoay mảng của bạn 90 độ, tức là hàng thành cột và cột thành hàng nên bạn mới gặp hiện tượng như vậy đấy.
 
thank you nhiu nhiu dúng là cái mình đang cần đây
 
Mình thấy Hàm UDF của nmHung49 cũng có thể viết thành:

Mã:
Public Function UniqueList(ByVal rng As Range, Id As Long)
 Dim sArr, Arr(), item, dic, i
  If rng.Count = 1 Then UniqueList = rng.Value: Exit Function
   Set dic = CreateObject("Scripting.Dictionary")
    sArr = rng.Value
    For Each item In sArr
      If Not IsEmpty(item) And Not dic.exists(item) Then
      i = i + 1
        If i = Id Then
       UniqueList = item
      Exit Function
     Else
    dic.Add item, ""
  End If: End If
   Next item
 UniqueList = ""
End Function

Khi lấy DS ta nhập công thức rồi chép xuống thoải mái:

=uniquelist($D$5:$I$17,ROW(1:1))

Như vậy, đỡ phải xác định độ dài mảng tránh lỗi trong DS. Mình chỉ mượn dic tìm đến Item mình cần là "biến".
Chào các bạn!
Cảm ơn bạn Sealand đã viết code này, tôi thấy Code này có một điểm như sau:

Giả sử trong vùng chọn mà có các Cell chứa công thức và công thức này trả về rỗng (hay trống) thì code này vẫn tính và xếp vào dãy không trùng.

Các bạn có thể sửa đọan code để nó không đếm & tính các cell có công thức trả về rỗng không?
Cảm ơn các bạn.
 

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

Back
Top Bottom