【发布时间】:2014-12-09 21:21:46
【问题描述】:
是否有一些我没有阅读的手册显示了 VBA 从范围返回第 k 个最大数字的方法 - 忽略重复项?我不知道为什么这不仅仅是工作表函数RANK 工作的默认方式......这是整数求解器问题的一部分,它需要很长时间才能运行,并且这个函数将被称为大量次 - 我不想让事情变得比他们需要的慢。
我考虑过使用集合的唯一键功能(将我的范围加载到集合中,让集合通过key 丢弃重复项,然后使用RANK 或LARGE 或其他)...但这似乎有点矫枉过正。
下面是一个明显的递归方法......但是所有这些对工作表函数等的引用,我想我错过了一些非常明显的 VBA/Excel 函数/功能?对于这样一个简单的任务来说,这似乎太悲惨了,有没有“更好”的方法来做到这一点,更好的=“不使用递归工作表函数调用 - 或者在每个函数调用上创建、填充、复制、销毁集合”?
Public Function getRank(ByRef r As range, k As Integer) As Double
If (k < 1) Then Exit Function
If (k = 1) Then
getRank = Application.WorksheetFunction.Max(r)
Exit Function
End If
getRank = Application.WorksheetFunction.Large(r, Application.WorksheetFunction. _
CountIf(r, ">=" & getRank(r, k - 1)) + 1)
End Function
我的r 是一个包含此数据的列,作为测试。
-100%
50%
-100%
-100%
-100%
-100%
-200%
-100%
-200%
-100%
-200%
-100%
-200%
-200%
-100%
-100%
60%
-200%
-100%
50%
-200%
-200%
-200%
60%
60%
-100%
-200%
-100%
-100%
-200%
-200%
60%
60%
-200%
【问题讨论】: