Hàm tìm giá trị trong mảng

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
4,461
Thích
6,249
#2
Nhờ các anh chị và các bạn viết giúp hàm bằng VBA như trong file đính kèm
Mã:
Function ViTriTrung(ByVal Rng As Range, ByVal Rng1 As Range, ByVal dk1, ByVal Rng2 As Range, ByVal dk2, ByVal Rng3 As Range, ByVal dk3)
  Dim i As Byte, j As Byte
  For i = 1 To Rng.Rows.Count
    For j = 1 To Rng.Columns.Count
      If Rng1(i, j) = dk1 And Rng2(i, j) = dk2 And Rng3(i, j) = dk3 Then
        ViTriTrung = Rng(i, j): Exit Function
      End If
    Next j
  Next i
  ViTriTrung = "Not Found"
End Function
 
Lần chỉnh sửa cuối:

hongphuong1997

Thành viên chính thức
Tham gia ngày
12 Tháng mười một 2017
Bài viết
53
Thích
17
Tuổi
21
#3
Mã:
Function ViTriTrung(ByVal Rng As Range, ByVal Rng1 As Range, ByVal dk1, ByVal Rng2 As Range, ByVal dk2, ByVal Rng3 As Range, ByVal dk3)
  Dim i As Byte, j As Byte
  For i = 1 To Rng.Rows.Count
    For j = i To Rng.Columns.Count
      If Rng1(i, j) = dk1 And Rng2(i, j) = dk2 And Rng3(i, j) = dk3 Then
        ViTriTrung = Rng(i, j): Exit Function
      End If
    Next j
  Next i
  ViTriTrung = "Not Found"
End Function
Dạ cháu cảm ơn bác @HieuCD bác ơi cho cháu hỏi là nếu như cháu có nhiều mảng thì phải làm như nào ạ?
 

Ba Tê

Cạo Luôn Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
9,858
Thích
13,765
Tuổi
59
#4

File đính kèm

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
4,461
Thích
6,249
#8
Dạ cháu cảm ơn bác @HieuCD bác ơi cho cháu hỏi là nếu như cháu có nhiều mảng thì phải làm như nào ạ?
Dùng đúng cấu trúc hàm theo hướng dẫn
Mã:
Function ViTriTrung(ByVal Rng As Range, ParamArray sArr())
  'ViTriTrung(Vùng lay ket qua, Vùng dieu kien 1, Dieu kien 1, Vùng dieu kien 2, Dieu kien 2, Vùng dieu kien 3, Dieu kien 3 .... )
  'Vùng lay ket qua và các Vùng dieu kien là Range
  Dim i As Byte, j As Byte, n As Byte
  For i = 1 To Rng.Rows.Count
    For j = 1 To Rng.Columns.Count
      dkBln = True
      For n = LBound(sArr) To UBound(sArr) Step 2
        If sArr(n)(i, j) <> sArr(n + 1) Then dkBln = False: Exit For
      Next n
      If dkBln = True Then ViTriTrung = Rng(i, j): Exit Function
    Next j
  Next i
  ViTriTrung = "Not Found"
End Function
 
Lần chỉnh sửa cuối:

hongphuong1997

Thành viên chính thức
Tham gia ngày
12 Tháng mười một 2017
Bài viết
53
Thích
17
Tuổi
21
#9
Dùng đúng cấu trúc hàm theo hướng dẫn
Mã:
Function ViTriTrung(ByVal Rng As Range, ParamArray sArr())
  'ViTriTrung(Vùng lay ket qua, Vùng dieu kien 1, Dieu kien 1, Vùng dieu kien 2, Dieu kien 2, Vùng dieu kien 3, Dieu kien 3 .... )
  'Vùng lay ket qua và các Vùng dieu kien là Range
  Dim i As Byte, j As Byte, n As Byte
  For i = 1 To Rng.Rows.Count
    For j = i To Rng.Columns.Count
      dkBln = True
      For n = LBound(sArr) To UBound(sArr) Step 2
        If sArr(n)(i, j) <> sArr(n + 1) Then dkBln = False: Exit For
      Next n
      If dkBln = True Then ViTriTrung = Rng(i, j): Exit Function
    Next j
  Next i
  ViTriTrung = "Not Found"
End Function
Bác @HieuCD ơi, bác giỏi thế như là công thức của Microsoff ấy, cháu cảm ơn bác!
 

hongphuong1997

Thành viên chính thức
Tham gia ngày
12 Tháng mười một 2017
Bài viết
53
Thích
17
Tuổi
21
#10
Dùng đúng cấu trúc hàm theo hướng dẫn
Mã:
Function ViTriTrung(ByVal Rng As Range, ParamArray sArr())
  'ViTriTrung(Vùng lay ket qua, Vùng dieu kien 1, Dieu kien 1, Vùng dieu kien 2, Dieu kien 2, Vùng dieu kien 3, Dieu kien 3 .... )
  'Vùng lay ket qua và các Vùng dieu kien là Range
  Dim i As Byte, j As Byte, n As Byte
  For i = 1 To Rng.Rows.Count
    For j = i To Rng.Columns.Count
      dkBln = True
      For n = LBound(sArr) To UBound(sArr) Step 2
        If sArr(n)(i, j) <> sArr(n + 1) Then dkBln = False: Exit For
      Next n
      If dkBln = True Then ViTriTrung = Rng(i, j): Exit Function
    Next j
  Next i
  ViTriTrung = "Not Found"
End Function
Bác ơi, công thức của bác quá chuẩn rồi, nhưng cháu gặp trường hợp như sau:Nếu có từ 2 số liệu thỏa mãn điều kiện trở lênThì nối các số liệu đó với nhau như ở ô "C31" Liệu vấn đề này có làm được không bác? Cháu cảm ơn bác!
 

File đính kèm

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
4,461
Thích
6,249
#11
Bác ơi, công thức của bác quá chuẩn rồi, nhưng cháu gặp trường hợp như sau:Nếu có từ 2 số liệu thỏa mãn điều kiện trở lênThì nối các số liệu đó với nhau như ở ô "C31" Liệu vấn đề này có làm được không bác? Cháu cảm ơn bác!
Không xếp thứ tự
Mã:
Function ViTriTrung(ByVal Rng As Range, ParamArray sArr())
  'ViTriTrung(Vùng lay ket qua, Vùng dieu kien 1, Dieu kien 1, Vùng dieu kien 2, Dieu kien 2, Vùng dieu kien 3, Dieu kien 3 .... )
  'Vùng lay ket qua và các Vùng dieu kien là Range
  Dim i As Byte, j As Byte, n As Byte, dkBln As Boolean
  For i = 1 To Rng.Rows.Count
    For j = 1 To Rng.Columns.Count
      dkBln = True
      For n = LBound(sArr) To UBound(sArr) Step 2
        If sArr(n)(i, j) <> sArr(n + 1) Then dkBln = False: Exit For
      Next n
      If dkBln = True Then ViTriTrung = ViTriTrung & Rng(i, j)
    Next j
  Next i
  If Len(ViTriTrung) = 0 Then ViTriTrung = "Not Found"
End Function
 

hongphuong1997

Thành viên chính thức
Tham gia ngày
12 Tháng mười một 2017
Bài viết
53
Thích
17
Tuổi
21
#12
Không xếp thứ tự
Mã:
Function ViTriTrung(ByVal Rng As Range, ParamArray sArr())
  'ViTriTrung(Vùng lay ket qua, Vùng dieu kien 1, Dieu kien 1, Vùng dieu kien 2, Dieu kien 2, Vùng dieu kien 3, Dieu kien 3 .... )
  'Vùng lay ket qua và các Vùng dieu kien là Range
  Dim i As Byte, j As Byte, n As Byte, dkBln As Boolean
  For i = 1 To Rng.Rows.Count
    For j = 1 To Rng.Columns.Count
      dkBln = True
      For n = LBound(sArr) To UBound(sArr) Step 2
        If sArr(n)(i, j) <> sArr(n + 1) Then dkBln = False: Exit For
      Next n
      If dkBln = True Then ViTriTrung = ViTriTrung & Rng(i, j)
    Next j
  Next i
  If Len(ViTriTrung) = 0 Then ViTriTrung = "Not Found"
End Function
Quá hoàn hảo rùi bác ơi, tìm được rất nhiều giá trị. Cháu cảm ơn bác @HieuCD rất nhiều (bác ơi còn hay hơn những hàm "Sumifs" bác nhỉ).
 

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
4,461
Thích
6,249
#13
Quá hoàn hảo rùi bác ơi, tìm được rất nhiều giá trị. Cháu cảm ơn bác @HieuCD rất nhiều (bác ơi còn hay hơn những hàm "Sumifs" bác nhỉ).
Muốn viết được như hàm SumifS không dể đâu
Hàm tự tạo của mình không có bẩy lổi, bạn nhập công thức thật chuẩn nếu không kết quả có thể không đúng
 

Ba Tê

Cạo Luôn Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
9,858
Thích
13,765
Tuổi
59
#14
Dạ tức là các mảng lúc thì nhiều, lúc thì ít đó anh Ba Tê (Tức là cấu trúc của các mảng vẫn như nhau)
Cấu trúc của các mảng như nhau thì cho nó nằm theo hàng dọc, mảng kết quả nằm đâu cũng được.
Nếu có từ 2 số liệu thỏa mãn điều kiện trở lênThì nối các số liệu đó với nhau
Nối luôn.
 

File đính kèm

hongphuong1997

Thành viên chính thức
Tham gia ngày
12 Tháng mười một 2017
Bài viết
53
Thích
17
Tuổi
21
#15
Cấu trúc của các mảng như nhau thì cho nó nằm theo hàng dọc, mảng kết quả nằm đâu cũng được.

Nối luôn.
Cảm ơn anh @Ba Tê đã giúp đỡ em, 2 phương pháp viết rất khác nhau, nhưng kết quả đều giống nhau.Công thức của anh thao tác ngắn gọn hơn. Cảm ơn anh rất nhiều,
 

hongphuong1997

Thành viên chính thức
Tham gia ngày
12 Tháng mười một 2017
Bài viết
53
Thích
17
Tuổi
21
#16
Cấu trúc của các mảng như nhau thì cho nó nằm theo hàng dọc, mảng kết quả nằm đâu cũng được.

Nối luôn.
Anh @Ba Tê ơi, em tìm được nhược điểm công thức của anh roài.
Nếu có giá trị là số "0" thì công thức sẽ bị sai anh àh.
 

Ba Tê

Cạo Luôn Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
9,858
Thích
13,765
Tuổi
59
#17

File đính kèm

hongphuong1997

Thành viên chính thức
Tham gia ngày
12 Tháng mười một 2017
Bài viết
53
Thích
17
Tuổi
21
#18
Cảm ơn anh @Ba Tê đã nghiên cứu giúp đỡ, hàm đã chạy rất tốt. Ưu điểm là thao tác dễ cho nên không bị nhầm lẫn. Nhưng nhược điểm là không linh động khi dữ liệu điều kiện nằm ở vị trí khác nhau. (Nhưng để áp dụng cho trường hợp cụ thể như ví dụ của em thì quá tuyệt. Một lần nữa cảm ơn anh @Ba Tê
 
Top