2010-03-23 50 views
5

Tôi có một tập dữ liệu có kích thước vừa phải trong mà từ đó tôi muốn trích xuất giá trị tối đa của các giá trị trong Cột B, nhưng chỉ tương ứng với các ô trong Cột A thỏa mãn các tiêu chí nhất định.Chức năng hoặc mô phỏng Excel MAXIF?

Chức năng mong muốn tương tự như của SUMIF hoặc COUNTIF, nhưng không phải là dữ liệu trả về cần thiết. Không có hàm MAXIF; làm thế nào để thi đua một?

Trả lời

5

Bạn có thể sử dụng công thức mảng. Trong ô bạn muốn nhập tối đa: = Max (Nếu ([test], [if true], [if false]) nơi bạn thay thế giá trị trong dấu ngoặc vuông với các thử nghiệm, những gì để quay trở lại nếu đúng và những gì để quay trở lại nếu sai Ví dụ:.

=MAX(IF(MOD(A2:A25,2)=0,A2:A25,0) 

trong công thức này, tôi trả về giá trị trong cột A nếu giá trị chia cho 2 không có người còn lại Chú ý rằng tôi sử dụng. một phạm vi ô trong so sánh của tôi và trong giá trị nếu sai thay vì một ô đơn lẻ

Bây giờ, trong khi vẫn chỉnh sửa ô, nhấn Ctrl + Shift + Enter (giữ phím Ctrl và Shift để gether và sau đó nhấn enter).

Điều này tạo ra một công thức mảng hoạt động trên từng giá trị trong phạm vi.

EDIT BTW, bạn có muốn thực hiện việc này theo cách lập trình hoặc theo cách thủ công không? Nếu lập trình, thì bạn đang sử dụng môi trường nào? VBA? C#?

EDIT Nếu qua VBA, bạn cần phải sử dụng tài sản FormulaArray và tài liệu tham khảo R1C1 như vậy:

Range("A1").Select 
Selection.FormulaArray = "=MAX(IF(MOD(R[1]C:R[24]C,2)=0,R[1]C:R[24]C,0))" 
3

mảng công thức không có tác dụng rất tốt khi bạn muốn sử dụng dãy động hoặc được đặt tên (ví dụ "Nếu bạn không muốn sử dụng công thức mảng, bạn luôn có thể sử dụng VBA để thực hiện một việc như sau:

", số tiền tối đa do hàng trên hàng hiện tại có cùng đối tác với hàng hiện tại).
Function maxIfs(maxRange As Range, criteriaRange As Range, criterion As Variant) As Variant 

    maxIfs = Empty 
    For i = 1 To maxRange.Cells.Count 
    If criteriaRange.Cells(i).Value = criterion Then 
     If maxIfs = Empty Then 
      maxIfs = maxRange.Cells(i).Value 
     Else 
      maxIfs = Application.WorksheetFunction.Max(maxIfs, maxRange.Cells(i).Value) 
     End If 
    End If 
    Next 
End Function 
1

A limi tation với mã được cung cấp cho đến nay là bạn bị giới hạn trong 2 điều kiện. Tôi quyết định lấy mã này thêm để không hạn chế số lượng các điều kiện cho hàm MaxIfs. Vui lòng xem mã tại đây:

 Function MaxIfs(MaxRange As Range, ParamArray Criteria() As Variant) As Variant 
     Dim n As Long 
     Dim i As Long 
     Dim c As Long 
     Dim f As Boolean 
     Dim w() As Long 
     Dim k As Long 
     Dim z As Variant 

     'Error if less than 1 criteria 
     On Error GoTo ErrHandler 
     n = UBound(Criteria) 
     If n < 1 Then 
      'too few criteria 
      GoTo ErrHandler 
     End If 
      'Define k 
      k = 0    

     'Loop through cells of max range 
     For i = 1 To MaxRange.Count 

     'Start by assuming there is a match 
     f = True 

      'Loop through conditions 
      For c = 0 To n - 1 Step 2 

       'Does cell in criteria range match condition? 
       If Criteria(c).Cells(i).Value <> Criteria(c + 1) Then 
        f = False 
       End If 

      Next c 

      'Define z 
      z = MaxRange 

      'Were all criteria satisfied? 
      If f Then 
       k = k + 1 
       ReDim Preserve w(k) 
       w(k) = z(i, 1) 
      End If 

     Next i 

     MaxIfs = Application.Max(w) 

     Exit Function 
     ErrHandler: 
     MaxIfs = CVErr(xlErrValue) 

    End Function 

Mã này cho phép 1 đến nhiều điều kiện.

Mã này được phát triển với tham chiếu đến nhiều mã được đăng bởi Hans V tại Eileen's Lounge.

Chúc mừng mã hóa

Diedrich

Các vấn đề liên quan