是否有一些我没有读取的手册显示了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%
答案 0 :(得分:0)
要获得最佳速度,请考虑将功能分为两部分:
事件宏将根据列值创建公共静态数组,丢弃重复项并对唯一数据进行排序。宏只会在最初和列更改时运行。
UDF 然后只需要根据其标题中的索引索引到创建的数组。