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
6,079
Được thích
11,183
Điểm
1,560
Cháu cảm ơn bác! Bác ơi từ công thức chuyển thành sub() thì các vòng lặp của nó vẫn như vậy hả bác? Chỉ thay "Fn"= "Sub" hả bác?
Các tham số trong Function trở thành biến, và phải gán kết quả vào sheet
Do có tham số "ParamArray sArr()" nên Function rất linh hoạt, chuyển thành Sub rất khó, các vòng For phải thay đổi cấu trúc lệnh
Phải viết lại tùy theo dữ liệu đầu vào
 

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
430
Được thích
115
Điểm
195
Tuổi
22
Các tham số trong Function trở thành biến, và phải gán kết quả vào sheet
Do có tham số "ParamArray sArr()" nên Function rất linh hoạt, chuyển thành Sub rất khó, các vòng For phải thay đổi cấu trúc lệnh
Phải viết lại tùy theo dữ liệu đầu vào
Cháu cảm ơn bác! Thế thì "Fn" viết dễ hơn "Sub" 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
6,079
Được thích
11,183
Điểm
1,560

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,255
Được thích
1,090
Điểm
560
Function không cho thay đổi nội dung của sheet trừ các ô đang gọi hàm. Sub có thể thay đổi mọi ô nhưng phải chỉ rõ vị trí lưu kết quả. Vì vậy em nghĩ function viết khó hơn sub.
 
Lần chỉnh sửa cuối:

♫ђöล♥ßล†♥†µ♫

Thành viên tiêu biểu
Tham gia ngày
10 Tháng ba 2018
Bài viết
675
Được thích
1,424
Điểm
360
Nơi ở
Cái Bang

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
430
Được thích
115
Điểm
195
Tuổi
22
.
Bác xem file và viết giúp cháu với bác nhé,
Cháu cảm ơn bác!
 
Lần chỉnh sửa cuối:

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
6,079
Được thích
11,183
Điểm
1,560
Bác ơi, cháu vận dụng công thức của bác để viết cho trường hợp 3 điều kiện như trong file cháu đính kèm mà không sao làm được.
Bác xem file và viết giúp cháu với bác nhé,
Cháu cảm ơn bác!
Mã:
Function ViTriTrung(ByVal Rng As Range, ParamArray sArr()) As String
  '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
  Dim dkTrue As Boolean, Arr()
  ReDim Arr(1 To UBound(sArr))
  For n = 1 To UBound(sArr) Step 2
    Arr(n) = "|"
    For i = 1 To sArr(n).Rows.Count
      For j = 1 To sArr(n).Columns.Count
        Arr(n) = Arr(n) & sArr(n)(i, j) & "|"
      Next j
    Next i
  Next n
  For i = 1 To Rng.Rows.Count
    For j = 1 To Rng.Columns.Count
      dkTrue = True
      For n = LBound(sArr) To UBound(sArr) Step 2
        If InStr(Arr(n + 1), "|" & sArr(n)(i, j) & "|") = 0 Then dkTrue = False: Exit For
      Next n
      If dkTrue = 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 tiêu biểu
Tham gia ngày
12 Tháng mười một 2017
Bài viết
430
Được thích
115
Điểm
195
Tuổi
22
Vẫn chưa đúng
 
Lần chỉnh sửa cuối:

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
6,079
Được thích
11,183
Điểm
1,560
Cháu vô cùng cảm ơn bác! Bác ơi cháu tưởng bài này khó vô cùng khó thế mà bác giải quyết dễ dàng quá. Cháu phải nghiên cứu cả ngày đêm công thức này của bác.
Cháu chúc bác luôn luôn mạnh khỏe và nhiều may mắn để dạy dỗ chúng cháu ạ!
Bài đã được tự động gộp:


Bác ơi cho cháu hỏi như này, "Nhưng cháu sợ bác mệt và vất vả quá". Bác có thể cho thêm là đã chọn được mảng 1;2;3...n được không ạ?
Thêm vào chổ nào? kết quả cụ thể?
 

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
430
Được thích
115
Điểm
195
Tuổi
22
Như thế nầy cũng dùng tạm được mà
View attachment 199482
hi hi... bác ơi, bác ơi! Quá đỉnh, quá đẹp tuyệt vời bác ơi, Đáng nhẽ bác phải là Micrrosof mới phải chứ bác ơi. Cháu cảm ơn bác.
Nhưng ý của cháu là trong bảng khi chọn vùng nào thì nó sẽ hiện lên là Sarr1; Sarr2.... và ddk; dk2.....dkn bác vất vả lắm không bác/
Bài đã được tự động gộp:

Như thế nầy cũng dùng tạm được mà
View attachment 199482
Bác ơi cháu muốn nó thông báo như cái vùng cháu khoanh màu đỏ như trng hình bên dưới này bác à.
 

File đính kèm

Lần chỉnh sửa cuối:

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
6,079
Được thích
11,183
Điểm
1,560
hi hi... bác ơi, bác ơi! Quá đỉnh, quá đẹp tuyệt vời bác ơi, Đáng nhẽ bác phải là Micrrosof mới phải chứ bác ơi. Cháu cảm ơn bác.
Nhưng ý của cháu là trong bảng khi chọn vùng nào thì nó sẽ hiện lên là Sarr1; Sarr2.... và ddk; dk2.....dkn bác vất vả lắm không bác/
Bài đã được tự động gộp:


Bác ơi cháu muốn nó thông báo như cái vùng cháu khoanh màu đỏ như trng hình bên dưới này bác à.
hi hi... bác ơi, bác ơi! Quá đỉnh, quá đẹp tuyệt vời bác ơi, Đáng nhẽ bác phải là Micrrosof mới phải chứ bác ơi. Cháu cảm ơn bác.
Nhưng ý của cháu là trong bảng khi chọn vùng nào thì nó sẽ hiện lên là Sarr1; Sarr2.... và ddk; dk2.....dkn bác vất vả lắm không bác/
Bài đã được tự động gộp:


Bác ơi cháu muốn nó thông báo như cái vùng cháu khoanh màu đỏ như trng hình bên dưới này bác à.
Làm cho bạn 8 điều kiện, nhiều hơn thì tự thêm vào code
Mã:
Function GiaTriTrung(ByVal ResRng As Range, ByVal VungDk1 As Range, ByVal Dk1 As Range, Optional ByVal VungDk2 As Range = Nothing, Optional ByVal Dk2 As Range = Nothing, _
                    Optional ByVal VungDk3 As Range = Nothing, Optional ByVal Dk3 As Range = Nothing, Optional ByVal VungDk4 As Range = Nothing, Optional ByVal Dk4 As Range = Nothing, _
                    Optional ByVal VungDk5 As Range = Nothing, Optional ByVal Dk5 As Range = Nothing, Optional ByVal VungDk6 As Range = Nothing, Optional ByVal Dk6 As Range = Nothing, _
                    Optional ByVal VungDk7 As Range = Nothing, Optional ByVal Dk7 As Range = Nothing, Optional ByVal VungDk8 As Range = Nothing, Optional ByVal Dk8 As Range = Nothing _
                    ) As String
  '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, nS As Byte
  Dim dkTrue As Boolean, Arr(), VungDK As Variant, DK As Variant
  VungDK = Array(VungDk1, VungDk2, VungDk3, VungDk4, VungDk5, VungDk6, VungDk7, VungDk8)
  DK = Array(Dk1, Dk2, Dk3, Dk4, Dk5, Dk6, Dk7, Dk8)
 
  ReDim Arr(LBound(DK) To UBound(DK))
  For n = LBound(VungDK) To UBound(VungDK)
    If Not VungDK(n) Is Nothing And Not DK(n) Is Nothing Then
      Arr(n) = "|"
      For i = 1 To DK(n).Rows.Count
        For j = 1 To DK(n).Columns.Count
          If Len(DK(n)(i, j)) Then Arr(n) = Arr(n) & DK(n)(i, j) & "|"
        Next j
      Next i
    Else
      nS = n - 1: Exit For
    End If
  Next n
  For i = 1 To ResRng.Rows.Count
    For j = 1 To ResRng.Columns.Count
      dkTrue = True
      For n = LBound(Arr) To nS
        If InStr(Arr(n), "|" & VungDK(n)(i, j) & "|") = 0 Then dkTrue = False: Exit For
      Next n
      If dkTrue = True Then GiaTriTrung = GiaTriTrung & ResRng(i, j)
    Next j
  Next i
  If Len(GiaTriTrung) = 0 Then GiaTriTrung = "Not Found"
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
430
Được thích
115
Điểm
195
Tuổi
22
Cháu cảm ơn bác! Cháu chúc bác Tháng mới vạn sự an lành.
 
Lần chỉnh sửa cuối:
Top Bottom