Phương pháp lọc duy nhất từ danh sách

Liên hệ QC

dangcobau99

Thành viên mới
Tham gia
6/1/11
Bài viết
4
Được thích
0
Em gõ nhầmChào các Anh/Chị trong diễn đàn
Để lọc ra tên duy nhất có trong một danh sách dài, Em sử dụng hàm mảng này nhưng dẫn đến thời gian tính toán của bảng tính rất lâu:

{=IF(ISNA(INDEX(TenR;MATCH(0;COUNTIF($C$9:C9;TenR);0))=TRUE);"";(INDEX(TenR;MATCH(0;COUNTIF($C$9:C9;TenR);0))))}

Các Anh/Chị nào có giải pháp nào hay giảm được thời gian tính toán làm ơn giúp E với
Khi lọc ra tên duy nhất từ danh sách này bảng sẽ kết hợp tự động với công thức khác để thực hiện các công việc khác nên Công thức phải ban hành sẵn cho khoảng 1000 dòng.
TenR là tên danh sách ban đầu cần lọc tên ra duy nhất. Ví dụ trong kho có rất nhiều bút toán liên quan đến Bulong M12x45 thì nó sẽ lọc ra duy nhất là bulong M12x45

Em xin trân trọng cảm ơn
 
Lần chỉnh sửa cuối:
Trong công thức, nếu biết vận dụng hàm IF hợp lý sẽ làm cho tốc độ tính toán nhanh. Bạn chỉ cần đặt thêm 1 cột phụ, rút giá trị duy nhất ra rồi dùng VLOOKUP hoặc INDEX để lấy danh sách.
Bạn nên đưa file lên sẽ có kết quả nhanh hơn.
 
Muốn tiết kiệm thời gian tính toán của file với dữ liệu lớn trong bài toàn lọc duy nhất thì phải dùng code VBA thôi bạn ạ, dạng sub hoặc viết hàm tự tạo lọc duy nhất, bạn tìm trên diễn đàn nhé, chủ đề này có rất nhiều!
 
Em gõ nhầmChào các Anh/Chị trong diễn đàn
Để lọc ra tên duy nhất có trong một danh sách dài, Em sử dụng hàm mảng này nhưng dẫn đến thời gian tính toán của bảng tính rất lâu:

{=IF(ISNA(INDEX(TenR;MATCH(0;COUNTIF($C$9:C9;TenR);0))=TRUE);"";(INDEX(TenR;MATCH(0;COUNTIF($C$9:C9;TenR);0))))}

Các Anh/Chị nào có giải pháp nào hay giảm được thời gian tính toán làm ơn giúp E với
Khi lọc ra tên duy nhất từ danh sách này bảng sẽ kết hợp tự động với công thức khác để thực hiện các công việc khác nên Công thức phải ban hành sẵn cho khoảng 1000 dòng.
TenR là tên danh sách ban đầu cần lọc tên ra duy nhất. Ví dụ trong kho có rất nhiều bút toán liên quan đến Bulong M12x45 thì nó sẽ lọc ra duy nhất là bulong M12x45

Em xin trân trọng cảm ơn

Bạn chép đoạn code sau vào 1 module rồi chọn vùng cần lọc và RUN

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:
Mình thấy có cái hàm này cũng hay, bạn ứng dụng xem được không nhé. Và còn rất nhiều cách viết khác nữa, bạn tự tìm hiểu để ứng dụng vào công việc nhé!
PHP:
Function Unique(rng As Range)

Dim ucoll As New Collection, Value As Variant, temp() As Variant
Dim iRows As Single, i As Single
ReDim temp(0)

On Error Resume Next
For Each Value In rng
    If Len(Value) > 0 Then ucoll.Add Value, CStr(Value)
Next Value
On Error GoTo 0

For Each Value In ucoll
    temp(UBound(temp)) = Value
    ReDim Preserve temp(UBound(temp) + 1)
Next Value

ReDim Preserve temp(UBound(temp) - 1)

iRows = Range(Application.Caller.Address).Rows.Count

For i = UBound(temp) To iRows
  ReDim Preserve temp(UBound(temp) + 1)
  temp(UBound(temp)) = ""
Next i

Unique = Application.Transpose(temp)

End Function
 

File đính kèm

Mình thấy có cái hàm này cũng hay, bạn ứng dụng xem được không nhé. Và còn rất nhiều cách viết khác nữa, bạn tự tìm hiểu để ứng dụng vào công việc nhé!
PHP:
Function Unique(rng As Range)

Dim ucoll As New Collection, Value As Variant, temp() As Variant
Dim iRows As Single, i As Single
ReDim temp(0)

On Error Resume Next
For Each Value In rng
    If Len(Value) > 0 Then ucoll.Add Value, CStr(Value)
Next Value
On Error GoTo 0

For Each Value In ucoll
    temp(UBound(temp)) = Value
    ReDim Preserve temp(UBound(temp) + 1)
Next Value

ReDim Preserve temp(UBound(temp) - 1)

iRows = Range(Application.Caller.Address).Rows.Count

For i = UBound(temp) To iRows
  ReDim Preserve temp(UBound(temp) + 1)
  temp(UBound(temp)) = ""
Next i

Unique = Application.Transpose(temp)

End Function
Cái gì mà dài dòng quá trời vậy đồng chí?
 
Cái gì mà dài dòng quá trời vậy đồng chí?
Cũng chỉ là 1 cách để tham khảo thôi mà sư phụ, tác giả có thể thích hoặc không? Đôi khi làm 1 cái gì dài dòng để nhớ lại 1 cái gì khác chẳng hạn. Code lọc duy nhất trên GPE này đâu có thiếu gì đâu ạ, em biết nếu sư phụ viết sẽ dùng công cụ khác ngắn và đẹp hơn nhiều.
 
Cũng chỉ là 1 cách để tham khảo thôi mà sư phụ, tác giả có thể thích hoặc không? Đôi khi làm 1 cái gì dài dòng để nhớ lại 1 cái gì khác chẳng hạn. Code lọc duy nhất trên GPE này đâu có thiếu gì đâu ạ, em biết nếu sư phụ viết sẽ dùng công cụ khác ngắn và đẹp hơn nhiều.

Đương nhiên là tôi sẽ dùng Dictionary rồi (vì nó ngon hơn Collection)
Nhưng nếu Bé Còi thích thằng Collection này thì... chơi luôn! Tôi sẽ viết như sau:
Mã:
Function UniqueList(ByVal SourceArray)
  Dim Item, aTmp, arr()
  Dim lCount As Long, n As Long, tmp As String
  On Error Resume Next
  aTmp = SourceArray
  With New Collection
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      lCount = .Count: tmp = CStr(Item)
      If Len(tmp) Then .Add tmp, tmp
      If lCount <> .Count Then
        n = n + 1
        ReDim Preserve arr(1 To n)
        arr(n) = Item
      End If
    Next
    If .Count Then UniqueList = arr
  End With
End Function
Hoặc chiêu ParamArray như sau:
Mã:
Function UniqueList(ParamArray Arrays())
  Dim Item, aTmp, aSub, arr()
  Dim lCount As Long, n As Long, tmp As String
  On Error Resume Next
  With New Collection
    For Each aSub In Arrays
      aTmp = aSub
      If Not IsArray(aTmp) Then aTmp = Array(aTmp)
      For Each Item In aTmp
        lCount = .Count: tmp = CStr(Item)
        If Len(tmp) Then .Add tmp, tmp
        If lCount <> .Count Then
          n = n + 1
          ReDim Preserve arr(1 To n)
          arr(n) = Item
        End If
      Next
    Next
    If .Count Then UniqueList = arr
  End With
End Function
Dùng ParamArray hay hơn 1 chút vì nó có khả năng lấy list duy nhất trên nhiều vùng không liên tục (ví dụ =TRANSPOSE(UniqueList(A2:A20, C2:D20, H2:H20)) chẳng hạn)
Thêm nữa: Hàm nên viết trên array để tăng tốc Còi à!
 
Lần chỉnh sửa cuối:
Em gõ nhầmChào các Anh/Chị trong diễn đàn
Để lọc ra tên duy nhất có trong một danh sách dài, Em sử dụng hàm mảng này nhưng dẫn đến thời gian tính toán của bảng tính rất lâu:

{=IF(ISNA(INDEX(TenR;MATCH(0;COUNTIF($C$9:C9;TenR);0))=TRUE);"";(INDEX(TenR;MATCH(0;COUNTIF($C$9:C9;TenR);0))))}

Các Anh/Chị nào có giải pháp nào hay giảm được thời gian tính toán làm ơn giúp E với
Khi lọc ra tên duy nhất từ danh sách này bảng sẽ kết hợp tự động với công thức khác để thực hiện các công việc khác nên Công thức phải ban hành sẵn cho khoảng 1000 dòng.
TenR là tên danh sách ban đầu cần lọc tên ra duy nhất. Ví dụ trong kho có rất nhiều bút toán liên quan đến Bulong M12x45 thì nó sẽ lọc ra duy nhất là bulong M12x45

Em xin trân trọng cảm ơn
ĐANG VỌC CODE
THỬ CÁI NÀY XEM
PHP:
Sub UNIQ()
    Dim I As Long, Col As COLLECTION, Arr As Variant
     Application.Calculation = False
    With ThisWorkbook.Worksheets("Sheet1")
        .Range("C:W").Delete
         Arr = .Range("A2", .Cells(.Rows.Count, "A")).Value
        Set Col = New COLLECTION
        On Error Resume Next
        For I = 1 To UBound(Arr, 1)
            Col.Add Arr(I, 1), Arr(I, 1)
        Next
        .[C1] = "LOC DUY NHAT"
        For I = 1 To Col.Count
            .Cells(I + 1, "C") = Col(I)
        Next
        Set Col = Nothing
        .Range("C1").Sort Key1:=.Range("C1"), Order1:=1, Header:=1
      End With
   Application.Calculation = True
 End Sub
 
Nếu dùng hàm thì chỉ cần COUNTIF là đủ "nhai" rồi
Giả sử C3 là ô đầu tiên của cột dữ liệu cần lọc, gõ công thức tại D3 :
=IF(COUNTIF($C$3:C3,C3)=1,C3,"")
Kéo tới đâu "nhai" tới đó luôn, không cần biết vùng dữ liệu kết thúc ở đâu
Nếu dữ liệu nằm theo hàng bắt đầu từ C3 thì gõ công thức trên tại ô C4
 
Lần chỉnh sửa cuối:
Nếu dùng hàm thì chỉ cần COUNTIF là đủ "nhai" rồi
Giả sử C3 là ô đầu tiên của cột dữ liệu cần lọc, gõ công thức tại D3 :
=IF(COUNTIF($C$3:C3,C3)=1,C3,"")
Kéo tới đâu "nhai" tới đó luôn, không cần biết vùng dữ liệu kết thúc ở đâu
Nếu dữ liệu nằm theo hàng bắt đầu từ C3 thì gõ công thức trên tại ô C4
Cái này thì ra kết quả mà không liên tục, có thêm blank phải xử lý thêm 1 bước nữa cũng mất công à.
 
Cái này thì ra kết quả mà không liên tục, có thêm blank phải xử lý thêm 1 bước nữa cũng mất công à.
Tôi làm thấy tốt. Xem file đính kèm.

Riêng thanhtrg: Câu
Nếu dữ liệu nằm theo hàng bắt đầu từ C3 thì gõ công thức trên tại ô C4nên thay làNếu dữ liệu nằm theo hàng bắt đầu từ C3 thì gõ công thức trên tại ô D3
Tôi dùng
=IF(COUNTIF($C$3:C3,C3)=1,C3,0)
để tiện chọn đặc biệt vùng có số 0 và xoá đi
 

File đính kèm

Nếu dùng hàm thì chỉ cần COUNTIF là đủ "nhai" rồi
Giả sử C3 là ô đầu tiên của cột dữ liệu cần lọc, gõ công thức tại D3 :
=IF(COUNTIF($C$3:C3,C3)=1,C3,"")
Kéo tới đâu "nhai" tới đó luôn, không cần biết vùng dữ liệu kết thúc ở đâu
Nếu dữ liệu nằm theo hàng bắt đầu từ C3 thì gõ công thức trên tại ô C4
Nếu làm theo cách của bạn thì mình thích thao tác bằng Advanced Filter có khi nhanh hơn bạn à!
 
Cảm ơn các Anh các chị đã đóng góp ý kiến.
Vấn đề là Em thực sự chưa viết tí gì về VBA. Mục đích lọc duy nhất của Em là tự động đưa kết quả duy nhất đã chọn được từ bảng đầu vào để đưa vào 1 bảng sau đó số liệu tính toán theo danh sách duy nhất kia tiếp tục tự động thực hiện nên lọc ra một bảng duy nhất bằng Advanced Filter hoặc bằng hàm if, countif.. thì phải thực hiện soft, copy, dán..vv nên lâu hơn. Dữ liệu bảng đầu vào được cập nhật hàng ngày.
Nếu người làm công tác quản lý kho của E đã biết làm Excell nhiều như thế thì em không phải lọ mọ thế này. Em sẽ cố gắng nghiên cứu VBA xem sao.
Cảm ơn các Anh các chị.
 
Lọc và dồn dữ liệu bằng hàm EXCEL

Cảm ơn các Anh các chị đã đóng góp ý kiến.
Vấn đề là Em thực sự chưa viết tí gì về VBA. Mục đích lọc duy nhất của Em là tự động đưa kết quả duy nhất đã chọn được từ bảng đầu vào để đưa vào 1 bảng sau đó số liệu tính toán theo danh sách duy nhất kia tiếp tục tự động thực hiện nên lọc ra một bảng duy nhất bằng Advanced Filter hoặc bằng hàm if, countif.. thì phải thực hiện soft, copy, dán..vv nên lâu hơn. Dữ liệu bảng đầu vào được cập nhật hàng ngày.
Nếu người làm công tác quản lý kho của E đã biết làm Excell nhiều như thế thì em không phải lọ mọ thế này. Em sẽ cố gắng nghiên cứu VBA xem sao.
Cảm ơn các Anh các chị.

Với phương pháp lọc như trong file đính kèm thì danh sách lọc sẽ tự động dồn hàng và cập nhật liên tục .
 

File đính kèm

Lần chỉnh sửa cuối:
Dùng advanced filter vừa nhanh lại vừa gọn, muốn cập nhật thì dùng pivot, excel 2007 trở lên có chức năng loại bỏ dòng trùng...
 
Cũng chỉ là 1 cách để tham khảo thôi mà sư phụ, tác giả có thể thích hoặc không? Đôi khi làm 1 cái gì dài dòng để nhớ lại 1 cái gì khác chẳng hạn. Code lọc duy nhất trên GPE này đâu có thiếu gì đâu ạ, em biết nếu sư phụ viết sẽ dùng công cụ khác ngắn và đẹp hơn nhiều.

Anh ơi, làm cái này mà anh nhớ cái gì. Em làm theo anh nó chỉ nhận mỗi dòng đầu tiên. Anh lãng mạn quá. Anh có biết chỉ đường lạc lối khi chết xuống âm phủ sẽ bị tội gì ko?
 
Đương nhiên là tôi sẽ dùng Dictionary rồi (vì nó ngon hơn Collection)
Nhưng nếu Bé Còi thích thằng Collection này thì... chơi luôn! Tôi sẽ viết như sau:
Mã:
Function UniqueList(ByVal SourceArray)
  Dim Item, aTmp, arr()
  Dim lCount As Long, n As Long, tmp As String
  On Error Resume Next
  aTmp = SourceArray
  With New Collection
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      lCount = .Count: tmp = CStr(Item)
      If Len(tmp) Then .Add tmp, tmp
      If lCount <> .Count Then
        n = n + 1
        ReDim Preserve arr(1 To n)
        arr(n) = Item
      End If
    Next
    If .Count Then UniqueList = arr
  End With
End Function
Hoặc chiêu ParamArray như sau:
Mã:
Function UniqueList(ParamArray Arrays())
  Dim Item, aTmp, aSub, arr()
  Dim lCount As Long, n As Long, tmp As String
  On Error Resume Next
  With New Collection
    For Each aSub In Arrays
      aTmp = aSub
      If Not IsArray(aTmp) Then aTmp = Array(aTmp)
      For Each Item In aTmp
        lCount = .Count: tmp = CStr(Item)
        If Len(tmp) Then .Add tmp, tmp
        If lCount <> .Count Then
          n = n + 1
          ReDim Preserve arr(1 To n)
          arr(n) = Item
        End If
      Next
    Next
    If .Count Then UniqueList = arr
  End With
End Function
Dùng ParamArray hay hơn 1 chút vì nó có khả năng lấy list duy nhất trên nhiều vùng không liên tục (ví dụ =TRANSPOSE(UniqueList(A2:A20, C2:D20, H2:H20)) chẳng hạn)
Thêm nữa: Hàm nên viết trên array để tăng tốc Còi à!
cho em hỏi cái này dùng làm sao vậy,
 
cấc AC chỉ cho em cho sai chổ nào ở cột F mà sao em làm hoài không được. trong khi cột B và cột I lại lọc duy nhất được. Em nghĩ chắc do em làm công thức mảng bị sai chổ nào đó.(vì cộ B và I thì giá trị A4:A400 là không thay đổi còn cột F thì A400 thay đổi tăng dần.(401,402,403,,,,) Mong các AC giúp đỡ!!!!
 
Web KT

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

Back
Top Bottom