Hàm Lookup cho mảng với nhiều điều kiện

Liên hệ QC

nvh611

Thành viên thường trực
Tham gia
20/5/17
Bài viết
228
Được thích
42
Chào các bạn GPE

Tôi muốn dùng hàm Lookup() cho trường hợp này, nhưng không được
Vậy kính mong anh em trên GPE tìm phương pháp giúp đỡ.
Xin trân thành cảm ơn các bạn!
 

File đính kèm

  • Lookup cho mảng nhiều điều kiện.xlsb
    9.3 KB · Đọc: 15
Có ai hiểu bạn này muốn cái gì không vậy, các bạn?
 
Upvote 0
Có ai hiểu bạn này muốn cái gì không vậy, các bạn?
Chào bạn SA_DQ
Thường thì hàm Loolup() chỉ tìm được các điều kiện đơn và chỉ tìm trên các vùng dữ liệu là 1 hàng hay nhiều hàng như công thức này:

=LOOKUP(2;1/($E$5:$E$8=B4)/($E$10:$E$13=$B$9)/($E$15:$E$18=B14);$E$20:$E$23)
Nhưng bây giờ mình muốn tìm kết quả theo điều kiện là từ 2 điều kiện trở lên và vùng tìm kiểm là các mảng như công thức này và nối kết quả lại với nhau:

=LOOKUP(2;1/($E$5:$H$8=$B$4:$C$4)/($E$10:$H$13=$B$9:$C$9)/($E$15:$H$18=$B$14:$C$14);$E$20:$H$23)
Vậy mong bạn và các bạn trên GPE tìm phương pháp giúp đỡ
 
Upvote 0
Xin giải thích bài trên như sau: Kính mong các bạn nghiên cứu giúp:
 

File đính kèm

  • Lookup cho mảng nhiều điều kiện.xlsb
    14.3 KB · Đọc: 8
Upvote 0
Làm chơi ra kết quả đơn thôi không biết ghép thế nào.
Cảm ơn bạn
dazkangel
Mình thấy công thức
=SUBSTITUTE(IF($A$1=1;" ";OFFSET($A$1;ROW()-1;COLUMN()-1)&IFERROR(";"&INDIRECT(TEXT(AGGREGATE(15;6;(ROW(E20:E23)*1000+COLUMN(E20:H20))/COUNTIFS(B4:C4;E5:H8;B9:C9;E10:H13;B14:C14;E15:H18);A1-1);"R0C000");0);""));" ;";"")
không chọn hết mảng (E20:H23)
Mà vẫn có 1 phần kết quả đúng
Mong bạn tìm xem phương án xử lý được bằng hàm sẵn có thì càng tốt.
Chúc bạn vui.
 
Upvote 0
Cảm ơn bạn
dazkangel
Mình thấy công thức
=SUBSTITUTE(IF($A$1=1;" ";OFFSET($A$1;ROW()-1;COLUMN()-1)&IFERROR(";"&INDIRECT(TEXT(AGGREGATE(15;6;(ROW(E20:E23)*1000+COLUMN(E20:H20))/COUNTIFS(B4:C4;E5:H8;B9:C9;E10:H13;B14:C14;E15:H18);A1-1);"R0C000");0);""));" ;";"")
không chọn hết mảng (E20:H23)
Mà vẫn có 1 phần kết quả đúng
Mong bạn tìm xem phương án xử lý được bằng hàm sẵn có thì càng tốt.
Chúc bạn vui.
Nó ra 4 kết quả đúng rồi mà, công thức này lấy kết quả bằng hàm indirect thì đâu cần chọn hết vùng tính có lẽ bạn nhầm hàm column. Với tất cả đều là hàm sẵn có từ excel 2007 trở lên.
 
Upvote 0
Một phần của bạn là phần nào, bạn phải chỉ ra cho rõ để mọi người hiểu?
Thật sự khi nhìn vào hàm đồ sộ và dài, tôi thấy ngại ngại. (Thực ra thì cũng không biết nó hoạt động như nào). Nhưng qua khảo sát thì thấy kết quả rất đúng, tuy nhiên nó không ghép được các dữ liệu với nhau.
Nhìn công thức dài nhưng cũng rất dễ nhớ (Dù không hiểu).
Lần nữa cảm ơn bạn @dazkangel

dazkangel đã nhiệt tình nghiên cứu giúp đỡ.
Tuy vậy tôi vẫn mong các bạn viết giúp hàm VBA
Vậy mong được sự hồi đáp của các bạn.
Xin trân thành cảm ơn các bạn!
 
Upvote 0
Anh chị và các bác oi, cháu viết hàm cho bài trên, sao nó không ra kết quả, anh chị và các bác sửa giúp cháu với ạ.
Mã:
Function Lookup_VD(Mang_KQ, Mang1_, Dk1 As String, Mang2_, Dk2 As String, Mang3_, Dk3 As String) As String
Dim Mang1, Mang2, Mang3
Dim i, j
Mang1 = Mang1_
Mang2 = Mang2_
Mang3 = Mang3_
Mang_KQ = Mang_KQ
For i = 1 To UBound(Mang1)
For j = 1 To UBound(Mang1, 2)

If Mang1(i, j) = Dk1 And Mang2(i, j) = Dk2 And Mang3(i, j) = Dk3 Then Mang_KQ = Join(i, j)
Next j
Next i

Lookup_VD = Mang_KQ
End Function
 

File đính kèm

  • Lookup cho mảng nhiều điều kiện_(Thử viết bài bài đầu tiên).xlsb
    23.6 KB · Đọc: 11
Upvote 0
Anh chị và các bác oi, cháu viết hàm cho bài trên, sao nó không ra kết quả, anh chị và các bác sửa giúp cháu với ạ.
Mã:
Function Lookup_VD(Mang_KQ, Mang1_, Dk1 As String, Mang2_, Dk2 As String, Mang3_, Dk3 As String) As String
Dim Mang1, Mang2, Mang3
Dim i, j
Mang1 = Mang1_
Mang2 = Mang2_
Mang3 = Mang3_
Mang_KQ = Mang_KQ
For i = 1 To UBound(Mang1)
For j = 1 To UBound(Mang1, 2)

If Mang1(i, j) = Dk1 And Mang2(i, j) = Dk2 And Mang3(i, j) = Dk3 Then Mang_KQ = Join(i, j)
Next j
Next i

Lookup_VD = Mang_KQ
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
em muốn viết hàm như công thức em làm đó chị oi
Chị viết đơn giản thui đấy nhé
Để em còn hiểu được chị nhé
Em cảm ơn chị
Bạn thử dùng hàm của anh @ndu96081631 xem
Mã:
Function LookUpArray(ByVal CriteriaArray, ByVal ReturnArray, ByVal ReturnType As Boolean)
  'ReturnType = FALSE ---> Lay ket qua dau tien thoa d/k
  'ReturnType = TRUE ---> Lay ket qua cuoi cùng thoa d/k
  Dim aCrit, aRet, tmp, bChk As Boolean
  Dim i As Long
  On Error Resume Next
  LookUpArray = vbNullString
  aCrit = ArrayTo1DArray(CriteriaArray)
  aRet = ArrayTo1DArray(ReturnArray)
  For i = LBound(aCrit) To UBound(aCrit)
    bChk = CBool(aCrit(i))
    If bChk Then
      tmp = aRet(i)
      If ReturnType = False Then Exit For
    End If
  Next
  If TypeName(tmp) <> "Error" Then LookUpArray = tmp
End Function
Function ArrayTo1DArray(ByVal SourceArray)
  Dim aTmp, Item, arr()
  Dim n As Long
  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
  ArrayTo1DArray = arr
End Function
 
Upvote 0
Bạn thử dùng hàm của anh @ndu96081631 xem
Mã:
Function LookUpArray(ByVal CriteriaArray, ByVal ReturnArray, ByVal ReturnType As Boolean)
  'ReturnType = FALSE ---> Lay ket qua dau tien thoa d/k
  'ReturnType = TRUE ---> Lay ket qua cuoi cùng thoa d/k
  Dim aCrit, aRet, tmp, bChk As Boolean
  Dim i As Long
  On Error Resume Next
  LookUpArray = vbNullString
  aCrit = ArrayTo1DArray(CriteriaArray)
  aRet = ArrayTo1DArray(ReturnArray)
  For i = LBound(aCrit) To UBound(aCrit)
    bChk = CBool(aCrit(i))
    If bChk Then
      tmp = aRet(i)
      If ReturnType = False Then Exit For
    End If
  Next
  If TypeName(tmp) <> "Error" Then LookUpArray = tmp
End Function
Function ArrayTo1DArray(ByVal SourceArray)
  Dim aTmp, Item, arr()
  Dim n As Long
  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
  ArrayTo1DArray = arr
End Function
Chị oi, em muốn viết đơn giản thui, viết như kiểu công thức em làm đó chị,
Chị nghiên cứu viết đơn giản cho em với nhé
Em cảm ơn chị.
 
Upvote 0
Web KT
Back
Top Bottom