Hàm tìm giá trị bằng nhau hiển thị trong 1 ô (1 người xem)

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

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.
 

File đính kèm

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.
 

File đính kèm

Em cảm ơn Thầy nhiều àh
 
Cái này dùng UDF của sư phụ NDU là chuẩn nhất. Bạn thử xem sao.

Hàm JoinIf phiên bản mới nhất đã được sửa thành vầy:
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
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)
---------------------------------------
Bài này cũng có thể dùng JoinText
Mã:
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
Với cú pháp gõ trên sheet là: =JoinText(", ",TRUE,IF($B$2:$B$10=D2,$A$2:$A$10,"")) --> Ctrl + Shift + Enter
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)
 
Lần chỉnh sửa cuối:
Hàm JoinIf phiên bản mới nhất đã được sửa thành vầy:
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
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)
---------------------------------------
Bài này cũng có thể dùng JoinText
Mã:
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
Với cú pháp gõ trên sheet là: =JoinText(", ",TRUE,IF($B$2:$B$10=D2,$A$2:$A$10,"")) --> Ctrl + Shift + Enter
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)

Cảm ơn sư phụ.
Em đang dùng rất nhiều Sub và UDF của sư phụ viết (cũng có đôi chút tuỳ biến).
Quả thật những UDF và Sub sư phụ viết rất tổng quát và thuật toán rất ngắn gọn, độc đáo.
Em rất ngưỡng mộ và bái phục.
 
thử dùng cái này có đúng không ? tại ô E2
=IF($B2=$D2;A2;"")
 

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

Back
Top Bottom