Hàm Maxif _ Tính giá trị lớn nhất với điều kiện cho trước (1 người xem)

  • Thread starter Thread starter lsxinh
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

lsxinh

Thành viên chính thức
Tham gia
29/11/08
Bài viết
93
Được thích
62
Lập hàm maxif giúp tính giá trị lớn nhất với điều kiện cho trước.
Tôi có một bảng tính có dạng thế này(tôi chưa biết cách chèn hình ảnh hay bảng tính vào trong bài viết).:

A|B|C
TGian | h (Thủy triều)| Dòng chảy
1 g| 01 (m)| 3m/s
2 | 2| 5
3 | 3| 2
4 | 4| 6
5 | 5| 8,2
6 | 4| 13
7 | 3| 6
8 | 2| 4
9 | 1| 8




Tôi muốn lập một hàm gọi tên là Maxif, có chức năng tìm các giá trị lớn nhất với điều kiện nào đó.
Ví du: Điều kiện là Cao độ thủy triều tối thiểu là 2.
Yêu cầu Tìm giá trị vận tốc dòng chảy lớn nhất ứng với trường hợp thủy triều có cao độ lớn hơn 2

Tôi dùng mã như sau mà không được.

PHP:
Public Function TimMaxif(SLcaodo As Variant, _
          SLVantoc As Variant, DieukienCaodo As Variant) As Variant
 TimMaxif = 0
 SLcaodo.Select  ' <=| ?'
 Dim Caodo As Variant,  Vantoc As Variant

 For Each Caodo In SLcaodo
      For Each Vantoc In SLVantoc
           If Caodo > DieukienCaodo And Vantoc > TimMaxif Then
               TimMaxif = Vantoc
           End If
      Next
 'Next thứ 2 bị thiếu rồi!'

End Function

Có ai biết chỉ dùm tôi với!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Ý kiến của tui: hàm excel đã cho sẵn chắc chắn hiệu quả hơn hàm tự tạo.
 
Upvote 0
Xin giúp dò tìm số lượng mua của ngày gần nhất theo từng mã. vi dụ:

Mã Ngày mua Số lượng
A 1/May/10 100
A 2/May/10 200
A 10/Jun/10 300
B 1/May/10 200
B 2/May/10 300
B 6/Jun/10 100
B 14/Jun/10 50

Kết quả trả về phải là
Mã Ngày mua Số lượng
A 10/Jun/10 300
B 14/Jun/10 50

Mình đã thử vận dụng hàm maxif này mà không được. Chân thành cám ơn. Mong nhận được hồi âm sớm của các bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Xin giúp dò tìm số lượng mua của ngày gần nhất theo từng mã. vi dụ:

Mã Ngày mua Số lượng
A 1/May/10 100
A 2/May/10 200
A 10/Jun/10 300
B 1/May/10 200
B 2/May/10 300
B 6/Jun/10 100
B 14/Jun/10 50

Kết quả trả về phải là
Mã Ngày mua Số lượng
A 10/Jun/10 300
B 14/Jun/10 50

Mình đã thử vận dụng hàm maxif này mà không được. Chân thành cám ơn. Mong nhận được hồi âm sớm của các bạn

Có một số cách cho bạn chọn:
Xem file,
 

File đính kèm

Upvote 0
PHP:
Option Explicit
Function MaxIf(Table_ As Range, hMin As Range) As Double
 MaxIf = Table_.Columns.Count
 If MaxIf <> 2 Then
   MaxIf = -1 * MaxIf:                     Exit Function
 Else
   Dim Clls As Range, Rng As Range
   For Each Clls In Table_.Cells(1, 1).Resize(Table_.Rows.Count)
      If Clls.Value > hMin Then
         If Rng Is Nothing Then
            Set Rng = Clls.Offset(, 1)
         Else
            Set Rng = Union(Rng, Clls.Offset(, 1))
         End If
      End If
   Next Clls
   MaxIf = Application.WorksheetFunction.Max(Rng)
 End If
End Function

Cú pháp hàm trên (theo bảng trên) sẽ là

=maxif(B2:C10,B4)

Dear all,
Mình cũng đang quan tâm đến hàm Maxif mình đã tham khảo và ứng dụng các bài viết của các bạn và Anh/Chị vào bài toán của mình nhưng kết quả không được như mong đợi, yêu cầu của mình có hơi khác một chút như sau mong mọi người giúp đỡ.
Minh có bảng sau:
A B C
ID Value Maxif
1 1000 5
2 1000 5
3 1000 5
4 1000 5
5 1000 5
6 1020 8
7 1020 8
8 1020 8

Ứng dụng code của bạn "sealand" như sau:
=TimMaxif(A2:A9,B2:B9,"=1000") kết quả trả về ô C2 = 5 là chính xác rồi nhưng yêu cầu thay vì "=1000". Mình muốn thay thế bằng Ô B2 để bảng tính được mềm dẻo hơn thì phải thực hiện thế nào.
Mong các bạn giúp đỡ. Xin cảm ơn!
 
Upvote 0
Dear all,
Mình cũng đang quan tâm đến hàm Maxif mình đã tham khảo và ứng dụng các bài viết của các bạn và Anh/Chị vào bài toán của mình nhưng kết quả không được như mong đợi, yêu cầu của mình có hơi khác một chút như sau mong mọi người giúp đỡ.
Minh có bảng sau:
A B C
ID Value Maxif
1 1000 5
2 1000 5
3 1000 5
4 1000 5
5 1000 5
6 1020 8
7 1020 8
8 1020 8

Ứng dụng code của bạn "sealand" như sau:
=TimMaxif(A2:A9,B2:B9,"=1000") kết quả trả về ô C2 = 5 là chính xác rồi nhưng yêu cầu thay vì "=1000". Mình muốn thay thế bằng Ô B2 để bảng tính được mềm dẻo hơn thì phải thực hiện thế nào.
Mong các bạn giúp đỡ. Xin cảm ơn!
-Mình thấy ý của bạn không tổng quát bằng bác sealand.Bởi nếu theo ý bạn thì nó chỉ đúng khi giá trị đó là 1 giá trị cụ thể và điều kiện chỉ có thể là dấu "=" or <,>,<> muốn tìm với điều kiện khác lại phải trỉnh lại.
VD:giờ bạn đang muốn ĐK là "=1000" nhưng chẳng may lúc nào đó lại muốn ">1000" thì code lại phải sửa.
-Còn nếu bạn muốn DK giờ là chỉ vào 1 ô nào đó cho dễ thì code đây nhé
PHP:
Public Function TimMaxif(vungmax As Range, vungtc As Range, tc As Double)
 Dim so As Long
  so = 0
 If vungmax.Rows.Count <> vungtc.Rows.Count Then Exit Function
   For i = 1 To vungtc.Rows.Count
     If vungtc.Cells(i) = tc Then  'neu DK khac thi chinh lai dau = '
         If so < vungmax.Cells(i) Then so = vungmax.Cells(i)
     End If
  Next
TimMaxif = so
End Function
 
Upvote 0
cám ơn bạn nhiều nha, nhưng mình vẫn chưa hiểu lắm, cái này là viết code rùi mới tính hay là sao nhỉ, cái này thì viết code trên excel luôn hay phải sang php hoặc vba viết vậy, khi viết xong thì nhúng mã kiểu gì, mình không hiểu lắm, có bạn nào biết ngôn ngữ foxpro không xin chỉ giúp mình với
thank mọi người nhiêu
 
Upvote 0
Cảm ơn cách này của b nhé, mình thấy rất hay, nhưng cho mình hỏi là cái này có áp dụng được với hàm min không? mình có bài tương tự nhưng là tìm min, mình đã thử cách này thay bằng min nhưng vô hiệu, kết quả luôn trả về giá trị 0, bạn có thể giúp mình không?

Chỉ cần dùng Max, không cần dùng thêm hàm IF. Muốn lấy ví dụ thì lấy ngay ví dụ của bạn đấy thôi.
Tham khảo công thức bên dưới. Gõ công thức xong nhớ ấn tổ hợp phím Ctrl+Shift+Enter
PHP:
{=MAX(($B$2:$B$10>2)*($C$2:$C$10))}
Thêm bao nhiêu điều kiện nữa thì cứ bấy nhiêu dấu "*" nhân lồng trong hàm Max.
 
Upvote 0
Cảm ơn cách này của b nhé, mình thấy rất hay, nhưng cho mình hỏi là cái này có áp dụng được với hàm min không? mình có bài tương tự nhưng là tìm min, mình đã thử cách này thay bằng min nhưng vô hiệu, kết quả luôn trả về giá trị 0, bạn có thể giúp mình không?

Cú pháp chung cho cả MAX và MIN là thế này:
Mã:
=MAX(IF(Vùng điều kiện = điều kiện, Vùng cần tìm MAX, ""))

Mã:
=MIN(IF(Vùng điều kiện = điều kiện, Vùng cần tìm MIN, ""))
Ví dụ:
PHP:
=MAX(IF($B$2:$B$10>2, $C$2:$C$10,""))

PHP:
=MIN(IF($B$2:$B$10>2, $C$2:$C$10,""))
Tất cả các công thức này đều phải kết thúc bằng tổ hợp phím Ctrl + Shift + Enter nhé
 
Upvote 0
Ôi, vâng, e cảm ơn anh ndu96081631 nhé. E đã áp dụng và rất tốt, đặc biệt là với kiểu có nhiều điều kiện
e đã dùng nhiều lần if.
Tuy nhiên, trong trường hợp của e thì e nghĩ là có thể không cần nhiều lần if. Để mô tả dễ hiểu hơn thì e mượn lại cái file của bạn mở đầu pic này. Bài toán của e là muốn tìm giá trị nhỏ nhất hoặc lớn nhất của những giá trị (cột C) thuộc các giá trị của a,c,e trong cột B.
Như ở đây e đang làm công thức và ra kết quả đúng như sau:
=MIN(IF($B$2:$B$10="a", $C$2:$C$10,""),IF($B$2:$B$10="c", $C$2:$C$10,""),IF($B$2:$B$10="e", $C$2:$C$10,""))
Tuy nhiên thì e thấy nó dài quá, vì thực chất là e chỉ cần là những dòng nào ở cột B có giá trị (bất kỳ) thì so sánh tìm min của các giá trị tương ứng bên cột C. Vì vậy, e đã nghĩ công thức như sau (nhưng không ra kết quả)
=MIN(IF($B$2:$B$10="*", $C$2:$C$10,"") -- vì ở đây e nghĩ biểu tượng * biểu thị cho 1 chuỗi bất kỳ, tức ĐK của e là 1 chuỗi bất kỳ.
Anh ndu96081631 giúp e giải thích vụ này với ạ.
Em cảm ơn.

Cú pháp chung cho cả MAX và MIN là thế này:
Mã:
=MAX(IF(Vùng điều kiện = điều kiện, Vùng cần tìm MAX, ""))

Mã:
=MIN(IF(Vùng điều kiện = điều kiện, Vùng cần tìm MIN, ""))
Ví dụ:
PHP:
=MAX(IF($B$2:$B$10>2, $C$2:$C$10,""))

PHP:
=MIN(IF($B$2:$B$10>2, $C$2:$C$10,""))
Tất cả các công thức này đều phải kết thúc bằng tổ hợp phím Ctrl + Shift + Enter nhé
 

File đính kèm

Upvote 0
Như ở đây e đang làm công thức và ra kết quả đúng như sau:
=MIN(IF($B$2:$B$10="a", $C$2:$C$10,""),IF($B$2:$B$10="c", $C$2:$C$10,""),IF($B$2:$B$10="e", $C$2:$C$10,""))
Tuy nhiên thì e thấy nó dài quá, vì thực chất là e chỉ cần là những dòng nào ở cột B có giá trị (bất kỳ) thì so sánh tìm min của các giá trị tương ứng bên cột C. Vì vậy, e đã nghĩ công thức như sau (nhưng không ra kết quả)
=MIN(IF($B$2:$B$10="*", $C$2:$C$10,"") -- vì ở đây e nghĩ biểu tượng * biểu thị cho 1 chuỗi bất kỳ, tức ĐK của e là 1 chuỗi bất kỳ.
Anh ndu96081631 giúp e giải thích vụ này với ạ.
Em cảm ơn.

Không phải thằng công thức nào cũng dùng được ký tự đại diện đâu
Để ý câu màu đỏ tôi tô ở trên: dòng nào ở cột B có giá trị nghĩa là <>"" thôi
Vậy sửa lại thành =MIN(IF($B$2:$B$10<>"", $C$2:$C$10,""))
 
Upvote 0
woa, thật là vấn đề này chưa nghĩ đến, chưa nghĩ ra.
Thực ra e đã làm thử với việc <>0 nên nó ra không đúng, và đã nghĩ là không dùng ký hiệu <> được, thật cảm ơn anh ndu96081631

Không phải thằng công thức nào cũng dùng được ký tự đại diện đâu
Để ý câu màu đỏ tôi tô ở trên: dòng nào ở cột B có giá trị nghĩa là <>"" thôi
Vậy sửa lại thành =MIN(IF($B$2:$B$10<>"", $C$2:$C$10,""))
 
Upvote 0
Không phải thằng công thức nào cũng dùng được ký tự đại diện đâu
Để ý câu màu đỏ tôi tô ở trên: dòng nào ở cột B có giá trị nghĩa là <>"" thôi
Vậy sửa lại thành =MIN(IF($B$2:$B$10<>"", $C$2:$C$10,""))

Cảm ơn a ndu96081631 đã nhiệt tình giải thích giúp e trường hợp này, tuy nhiên trong cách tính min, giờ e muốn thêm điều kiện tính min, nhưng không tính giá trị 0 vào thì làm thế nào?
vì những bảng dữ liệu khác của em có khá nhiều giá trị 0, nên kết quả của nó lúc nào cũng là 0 luôn.
Hoặc tổng quát hơn thì khi dùng kiểu công thức này có nhiều điều kiện thì làm thế nào?
 
Upvote 0
Cảm ơn a ndu96081631 đã nhiệt tình giải thích giúp e trường hợp này, tuy nhiên trong cách tính min, giờ e muốn thêm điều kiện tính min, nhưng không tính giá trị 0 vào thì làm thế nào?
vì những bảng dữ liệu khác của em có khá nhiều giá trị 0, nên kết quả của nó lúc nào cũng là 0 luôn.
Hoặc tổng quát hơn thì khi dùng kiểu công thức này có nhiều điều kiện thì làm thế nào?

Loại bỏ luôn mấy em <>0 ở cột C và <>"" ở cột B nhé
Mã:
=MIN(IF(($B$2:$B$10<>"")*($C$2:$C$10<>0), $C$2:$C$10,""))
Công thức trên là phối hợp 2 điều kiện, nối nhau bằng dấu nhân (*).. Muốn thêm điều kiện nữa thì cứ nhân vào
 
Upvote 0
Cả nhà ơi, cho mình nhờ một chút. mình có bảng lương ở sheet 1, ở sheets 2 mình có bảng tổng hợp theo nhóm chức danh, và muốn tìm tiền lương lớn nhất của một chức danh bên sheet 1; nhưng mình không biết dùng công thức nào để ra; các bạn giúp mình gấp với được không ạ? Cảm ơn các bạn nhiều
 

File đính kèm

Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom