hungdiep85
Thành viên thường trực




- Tham gia
- 1/6/09
- Bài viết
- 218
- Được thích
- 23
- Giới tính
- Nam




Chào các Thầy
Cột A2:A10 là tên nhân viên,
Cột B2:B10 là thời gian làm việc
Cột E2;Nếu B2:B10 có thời gian bằng với D2 thì sẽ hiển thị tất cả tên nhân viên có cùng thời gian làm việc trong E2.
Em không biết phải dùng hàm sao nữa,
Em cảm ơn các Thầy nhiều ah.




Cái này dùng UDF của sư phụ NDU là chuẩn nhất. Bạn thử xem sao.
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
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
Function JoinText(ByVal Delimiter As String, ByVal IgnoreBlanks As Boolean, 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
tmp = IIf(TypeName(Item) = "Error", "", Trim(CStr(Item)))
If IgnoreBlanks = False Or Len(tmp) Then
n = n + 1
ReDim Preserve Arr(1 To n)
Arr(n) = tmp
End If
Next
Next
If n Then JoinText = Join(Arr, Delimiter)
End Function
Hàm JoinIf phiên bản mới nhất đã được sửa thành vầy:
Cho phép so sánh >, < , <> hoặc = hoặc so sánh theo kiểu ký tự đại diện (giống cách hoạt động của SUMIF)Mã: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 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
---------------------------------------
Bài này cũng có thể dùng JoinText
Với cú pháp gõ trên sheet là: =JoinText(", ",TRUE,IF($B$2:$B$10=D2,$A$2:$A$10,"")) --> Ctrl + Shift + EnterMã:Function JoinText(ByVal Delimiter As String, ByVal IgnoreBlanks As Boolean, 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 tmp = IIf(TypeName(Item) = "Error", "", Trim(CStr(Item))) If IgnoreBlanks = False Or Len(tmp) Then n = n + 1 ReDim Preserve Arr(1 To n) Arr(n) = tmp End If Next Next If n Then JoinText = Join(Arr, Delimiter) End Function
Giống cách hoạt động của SUMPRODUCT
-------------------------------
Nói chung sẽ tùy chuyện mà xài 2 hàm này cho hợp lý (giống như tùy chuyện mà xài SUMIF hay SUMPRODUCT vậy)