【问题标题】:Return the largest k-th number, accounting for multiplicity (duplicates)返回最大的第k个数,考虑多重性(重复)
【发布时间】:2014-12-09 21:21:46
【问题描述】:

是否有一些我没有阅读的手册显示了 VBA 从范围返回第 k 个最大数字的方法 - 忽略重复项?我不知道为什么这不仅仅是工作表函数RANK 工作的默认方式......这是整数求解器问题的一部分,它需要很长时间才能运行,并且这个函数将被称为大量次 - 我不想让事情变得比他们需要的慢。

我考虑过使用集合的唯一键功能(将我的范围加载到集合中,让集合通过key 丢弃重复项,然后使用RANKLARGE 或其他)...但这似乎有点矫枉过正。

下面是一个明显的递归方法......但是所有这些对工作表函数等的引用,我想我错过了一些非常明显的 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%

【问题讨论】:

    标签: excel ranking vba


    【解决方案1】:

    要获得最佳速度,请考虑将功能分为两部分:

    1. 事件宏
    2. 简单的查找UDF

    事件宏将从列值创建一个公共静态数组,丢弃重复项并对唯一项进行排序。宏只会在最初和列更改时运行。

    UDF 只需要根据其标头中的索引对创建的数组进行索引即可。

    【讨论】:

    • 谢谢。我可以试试。我有多个列需要在求解器的每个“通过”时“评估”(将改变)——也不确定事件宏将如何与求解器交互......但会试一试。更令人担忧的是,实际上似乎没有在 Excel 中执行此操作的内置方法……我以为我只是遗漏了一些明显的东西。塔
    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 2015-10-09
    • 2016-08-24
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    相关资源
    最近更新 更多