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

nvh611

Thành viên thường trực
Tham gia ngày
20 Tháng năm 2017
Bài viết
203
Được thích
38
Điểm
185
Tuổi
50
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

nvh611

Thành viên thường trực
Tham gia ngày
20 Tháng năm 2017
Bài viết
203
Được thích
38
Điểm
185
Tuổi
50
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 đỡ
 

dazkangel

<New Horizons>
Tham gia ngày
28 Tháng hai 2017
Bài viết
2,677
Được thích
3,295
Điểm
360
Nơi ở
Đồng Nai

File đính kèm

nvh611

Thành viên thường trực
Tham gia ngày
20 Tháng năm 2017
Bài viết
203
Được thích
38
Điểm
185
Tuổi
50
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.
 

dazkangel

<New Horizons>
Tham gia ngày
28 Tháng hai 2017
Bài viết
2,677
Được thích
3,295
Điểm
360
Nơi ở
Đồng Nai
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.
 

nvh611

Thành viên thường trực
Tham gia ngày
20 Tháng năm 2017
Bài viết
203
Được thích
38
Điểm
185
Tuổi
50
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!
 

hongphuong1997

Thành viên tiêu biểu
Tham gia ngày
12 Tháng mười một 2017
Bài viết
446
Được thích
123
Điểm
195
Tuổi
23
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

vanaccex

Thành viên thường trực
Tham gia ngày
8 Tháng bảy 2018
Bài viết
341
Được thích
191
Điểm
195
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:

vanaccex

Thành viên thường trực
Tham gia ngày
8 Tháng bảy 2018
Bài viết
341
Được thích
191
Điểm
195
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
 

hongphuong1997

Thành viên tiêu biểu
Tham gia ngày
12 Tháng mười một 2017
Bài viết
446
Được thích
123
Điểm
195
Tuổi
23
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ị.
 
Top Bottom