繁体   English   中英

Excel查找具有最高值的17个单元格,其中5个是特定行中的最高值

[英]Excel find 17 Cells with highest value, 5 of which are the highest in a specific row

我正在解决一个复杂的Excel问题,任何解决方案都会令我惊讶。

我有一个包含4列和以下值的表

The highest    |13|12|12|12|
The two highest|11|12|11|11|
The two highest|12|12|12|12|
               |12|11|11|11|
               |12|11|11|11|
               |12|11|11|11|

我的问题要求从前三行分别选择最高的两个最高值。 在整个矩阵上,应该有12个值的总和。

所需的5加上其余的7个最高值。 我当前的方法是对所需的行求和,然后将其余的行加在一起,但这显然行不通。

|13|12|12|12|[MAX(B10:E10)]13|
|11|12|11|11|[LARGE(B11:E11;1)+LARGE(B11:E11;2)23|
|12|12|12|12|[LARGE(B12:E12;1)+LARGE(B12:E12;2)24|
|12|11|11|11|
|12|11|11|11|
|12|11|11|11|

任何想法或建议都将受到高度赞赏。 还有一个更易于理解的参考标题会很棒。 谢谢!

说明:这是草率的VBA,但是可以使用,并且如果需要,结构通常可以扩展。 您可以将其粘贴到VBA模块中,运行Sum57(),结果将在调试窗口(Ctl + G)中。 要针对其他阵列大小修改此设置,请更改以下内容:

  • 第1行中used数组的大小
  • 第5和第6行中的arrR和arrC值定义了数组的开始
  • Sum57()主体中的函数调用模式

基本模式是:

   For i = 1 To N
       x = x + LargeOfRange([rStart], [rEnd], [cStart], [cEnd])
   Next 

其中N是该范围内的前N个最大数字。


VBA:

Public used(5, 3) As Boolean
Public arrR, arrC As Integer

Public Sub Sum57()
    arrR = 10
    arrC = 2
    For a = LBound(used, 1) To UBound(used, 1)
    For b = LBound(used, 2) To UBound(used, 2)
        used(a, b) = False
    Next
    Next

    Dim x As Integer

        x = x + LargeOfRange(10, 10, 2, 5)
    For i = 1 To 2
        x = x + LargeOfRange(11, 11, 2, 5)
    Next
    For i = 1 To 2
        x = x + LargeOfRange(12, 12, 2, 5)
    Next
    For i = 1 To 7
        x = x + LargeOfRange(10, 15, 2, 5)
    Next
    Debug.Print x
End Sub


Public Function LargeOfRange(rStart As Integer, rEnd As Integer, _
                             cStart As Integer, cEnd As Integer) As Integer
    On Error GoTo SkipVal
    Dim l, x, xR, xC As Integer
    x = 0

    For r = rStart To rEnd
        For c = cStart To cEnd
            If x < Cells(r, c).Value And used(r - arrR, c - arrC) = False Then
                xR = r
                xC = c
                x = Cells(r, c).Value
            End If
        Next
    Next
    used(xR - arrR, xC - arrC) = True
    LargeOfRange = x
Exit Function

SkipVal:
    LargeOfRange = 0
End Function

为什么不只是扩大范围并向Large()计算添加更多元素?

=LARGE(B13:E15,1)+LARGE(B13:E15,2)+LARGE(B13:E15,3)+LARGE(B13:E15,4)+
 LARGE(B13:E15,5)+LARGE(B13:E15,6)+LARGE(B13:E15,7)

这将返回80

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM