hongphuong1997
Thành viên tiêu biểu

- Tham gia
- 12/11/17
- Bài viết
- 773
- Được thích
- 323
- Giới tính
- Nữ
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
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
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
Xem file nhé.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
Vẫn chưa tìm được giá trị khi số lượng mảng thay đổi anh Batê àXem file nhé.
Thay đổi thế nào, thấy sao làm vậy chứ biết bạn thay đổi thế nào.Vẫn chưa tìm được giá trị khi số lượng mảng thay đổi anh Batê à
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)Thay đổi thế nào, thấy sao làm vậy chứ biết bạn thay đổi thế nào.
Đưa file không đúng lên xem.
Dùng đúng cấu trúc hàm theo hướng dẫnDạ 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 ạ?
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
Bác ơi, vẫn chưa đúng bác à!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
Không xếp thứ tự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!
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
Vẫn chưa đúng 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
Muốn viết được như hàm SumifS không dể đâuQuá 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ỉ).
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.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)
Nối luôn.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
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,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.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.
Copy vùng công thức và dán giá trị (Paste Values) tại vùng đóBác ơi cho cháu hỏi nếu chỉ lấy giá trị thì phải "paste.Vale" phải không bác?
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?Copy vùng công thức và dán giá trị (Paste Values) tại vùng đó
Các tham số trong Function trở thành biến, và phải gán kết quả vào sheetChá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?
Cháu cảm ơn bác! Thế thì "Fn" viết dễ hơn "Sub" bác nhỉ?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
Mỗi em có cái khó riêng, thông thường khi viết Sub khá chuẩn mới viết Function đượcCháu cảm ơn bác! Thế thì "Fn" viết dễ hơn "Sub" bác nhỉ?
Cháu cảm ơn bác đã chỉ bảo!Mỗi em có cái khó riêng, thông thường khi viết Sub khá chuẩn mới viết Function được
Em thấy cả hai cái đều khó như nhau. Em viết cái nào nó cũng báo lỗi hết vàng lòe vàng loẹtMỗi em có cái khó riêng, thông thường khi viết Sub khá chuẩn mới viết Function được
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!
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
Thêm vào chổ nào? kết quả cụ thể?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 ạ?
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ư 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 à.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:
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 codehi 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 à.
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