Giúp em hàm concatenate and remove duplicates excel2007

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Em có một dãy giá trị ở cột A và nhiều giá trị trùng lặp, em muốn ghép các giá trị thành 1 chuỗi cách nhau bằng dấu ";" em sử dụng CONCATENATE thì phải chọn từng ô và không auto được cho các trường hơp sau, em muốn kết hợp Remove Duplicates khi gặp nhưng giá trị trùng lặp nó tự loại bỏ không nhập vào chuỗi
Moi ngưởi giúp em vấn để này nhé. Thanks!

Có hàng đống cách để làm bài này bằng VBA. Xin gửi lên toàn bộ các code có khả năng ứng dụng:
1> Hàm 1

Function UniqueList(ParamArray sArray())
  Dim Item, tmpArr, SubArr, tmp
  'On Error Resume Next
  With CreateObject("Scripting.Dictionary")
    For Each SubArr In sArray
      tmpArr = SubArr
      If Not IsArray(tmpArr) Then tmpArr = Array(tmpArr)
      For Each Item In tmpArr
        tmp = CStr(Item)
        If Len(tmp) Then
          If Not .Exists(tmp) Then .Add tmp, ""
        End If
      Next
    Next
    If .Count Then UniqueList = .Keys
  End With
End Function

2> Hàm 2

Function JoinText(ByVal Delimiter As String, ParamArray Arrays()) As String
  Dim aTmp, Arr(), Item, tmp As String
  Dim i As Long, n As Long
  'On Error Resume Next
  For i = LBound(Arrays) To UBound(Arrays)
    aTmp = Arrays(i)
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      If TypeName(Item) <> "Error" Then
        tmp = Trim(CStr(Item))
        If Len(tmp) Then
          n = n + 1
          ReDim Preserve Arr(1 To n)
          Arr(n) = tmp
        End If
      End If
    Next
  Next
  If n Then JoinText = Join(Arr, Delimiter)
End Function

3> Hàm 3:

Function JoinIf(ByVal Delimiter As String, ByVal CriteriaArray, ByVal Criteria, Optional ByVal TargetArray) As String
  Dim aTmpCrit, aTmpDes, tmp1, tmp2, Arr(), dic As Object
  Dim bComp As Boolean, Chk As Boolean
  Dim i As Long, j As Long, k As Long, dTmpVal As Double
  Set dic = CreateObject("Scripting.Dictionary")
  If IsMissing(TargetArray) Then TargetArray = CriteriaArray
  aTmpCrit = ConvertTo1DArray(CriteriaArray)
  aTmpDes = ConvertTo1DArray(TargetArray)
  If (Not IsArray(aTmpCrit)) Or (Not IsArray(aTmpDes)) Then Exit Function
  On Error Resume Next
  bComp = (InStr("<>=", Left(Criteria, 1)) > 0)
  For i = LBound(aTmpDes) To UBound(aTmpDes)
    tmp1 = aTmpCrit(i): tmp2 = aTmpDes(i)
    If bComp And Len(Criteria) Then
      dTmpVal = CDbl(aTmpCrit(i))
      If Evaluate(dTmpVal & Criteria) Then dic.Add tmp2, ""
    Else
      If (Left(Criteria, 1) = "!") Then
        If Not (UCase(tmp1) Like UCase(Mid(Criteria, 2, Len(Criteria)))) Then dic.Add tmp2, ""
      Else
        If (UCase(tmp1) Like UCase(Criteria)) Then dic.Add tmp2, ""
      End If
    End If
  Next
  If dic.Count Then
    Arr = dic.Keys
    JoinIf = Join(Arr, Delimiter)
  End If
End Function

4> Hàm 4:

Private Function ConvertTo1DArray(ByVal SourceArray)
  Dim aTmp, Item, Arr()
  Dim n As Long
  On Error Resume Next
  aTmp = SourceArray
  If Not IsArray(aTmp) Then aTmp = Array(aTmp)
  For Each Item In aTmp
    n = n + 1
    ReDim Preserve Arr(1 To n)
    Arr(n) = Item
  Next
  ConvertTo1DArray = Arr
End Function

————————–
Áp dụng:
1> Giả sử bạn muốn dùng hàm 2 (JoinText) để giải quyết, bạn gõ nó lên bảng tính như sau:

=JoinText("; ",IF(MATCH(A3:A20,A3:A20,0)=ROW(INDIRECT("1:"&ROWS(A3:A20))),A3:A20,""))

Yêu cầu: Gõ xong công thức trên phải kết thúc bằng tổ hợp phím Ctrl + Shift + Enter (vì đó là công thức mảng)
2> Giả sử bạn muốn dùng hàm 3 (JoinIf)để giải quyết, bạn gõ nó lên bảng tính như sau:

=JoinIf("; ", A3:A20,"!")

Yêu cầu: Muốn dùng JoinIf thì bạn phải copy thêm hàm 4 (ConvertTo1DArray) vào chung Module
2> Giả sử bạn muốn dùng hàm 1 (UniqueList) và hàm 2 (JoinText) để giải quyết, bạn gõ nó lên bảng tính như sau:

=JoinText("; ",UniqueList(A3:A20))

Yêu cầu: Vì kết hợp 2 hàm nên điều đương nhiên phải copy cả 2 hàm cho vào 1 Module
vân vân…
Nói chung: Muốn công thức trên bảng tính ngắn gọn thì bạn phải tốn nhiều code và ngược lại
Đưa lên 1 vài cách, tùy ý bạn lựa chọn

www.giaiphapexcel.com/diendan/threads/gi%C3%BAp-em-h%C3%A0m-concatenate-and-remove-duplicates-excel2007.88062/

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 0 ▥ 0
Quảng cáo

Bạn nên đọc

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm